算額(その906)
一〇〇 桶川市小針領家 氷川諏訪神社 明治30年(1897)
埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.
甲円,乙円,丙円と「三角面」がある。甲円,丙円の直径がそれぞれ 2.7 寸,0.6 寸のとき,乙円の直径を求めよ。
注:「問」では「三角面」とあるが,通常「三角面」は「正三角形」を表す。しかし,この問題では「三角形」は正三角形ではなく「二等辺三角形」である。
三角形の底辺の長さを 2a
甲円の半径と中心座標を r1, (0, r1)
乙円の半径と中心座標を r2, (0, r2)
丙円の半径と中心座標を r3, (x3, y3)
とおき,以下の連立方程式を解く。
include("julia-source.txt");
using SymPy
@syms a::positive, r1::positive, r2::positive,
r3::positive, x3::positive, y3::positive
#(r1, r3) = (27, 6) .// 2
eq1 = r2/(2r1 - r2) - a/sqrt(4r1^2 + a^2)
eq2 = x3^2 + (y3 - r1)^2 - (r1 - r3)^2
eq3 = x3/(y3 - r1) - 2r1/a
eq4 = dist2(a, 0, 0, 2r1, x3, y3, r3)
res = solve([eq1, eq2, eq3, eq4], (r2, a, x3, y3))
1-element Vector{NTuple{4, Sym{PyCall.PyObject}}}:
(2*r1*(r1 - 2*r3)*sqrt(r1^3 - 3*r1^2*r3 + 3*r1*r3^2 - r3^3)/(r1^3*sqrt((r1^3 - 3*r1^2*r3 + 3*r1*r3^2 - r3^3)/(r1^4 - 4*r1^3*r3 + 6*r1^2*r3^2 - 4*r1*r3^3 + r3^4)) - 2*r1^2*r3*sqrt((r1^3 - 3*r1^2*r3 + 3*r1*r3^2 - r3^3)/(r1^4 - 4*r1^3*r3 + 6*r1^2*r3^2 - 4*r1*r3^3 + r3^4)) + r1*r3^2*sqrt((r1^3 - 3*r1^2*r3 + 3*r1*r3^2 - r3^3)/(r1^4 - 4*r1^3*r3 + 6*r1^2*r3^2 - 4*r1*r3^3 + r3^4)) + r1*sqrt(r1^3 - 3*r1^2*r3 + 3*r1*r3^2 - r3^3) - 2*r3*sqrt(r1^3 - 3*r1^2*r3 + 3*r1*r3^2 - r3^3)), r1*(r1 - 2*r3)*sqrt(r1^3 - 3*r1^2*r3 + 3*r1*r3^2 - r3^3)/(sqrt(r3)*(r1^2 - 2*r1*r3 + r3^2)), 2*sqrt(r3)*sqrt((r1 - r3)^3)/r1, 2*r1 - 3*r3 + 2*r3^2/r1)
r2 の式は長く複雑なものである。
しかし,術は見事に簡約化された解である。
d1 = 2r1, d3 = 2r3 として,
d1^2 - 2d1*d3)/(d1 - d3)
r2 の簡約化を手動で行おう。
sqrt() の中の長い式は (r1 - r3)^3 と (r1 - r3)^4 に因数分解できる。
r1^3 - 3*r1^2*r3 + 3*r1*r3^2 - r3^3 |> factor |> println
r1^4 - 4*r1^3*r3 + 6*r1^2*r3^2 - 4*r1*r3^3 + r3^4 |> factor |> println
(r1 - r3)^3
(r1 - r3)^4
(r1 - r3) を t とおいて簡約化する。
@syms t::positive, d
R2= res[1][1](r1^3 - 3*r1^2*r3 + 3*r1*r3^2 - r3^3 => t^3, r1^4 - 4*r1^3*r3 + 6*r1^2*r3^2 - 4*r1*r3^3 + r3^4 => t^4)
R2 = apart(R2, d) |> simplify
R2 |> println
2*r1*t^2*(r1 - 2*r3)/(r1^3 - 2*r1^2*r3 + r1*r3^2 + r1*t^2 - 2*r3*t^2)
ここで,t をもとの (r1 - r3) に戻す。
R3 = R2(t => (r1 - r3))
R3 |> println
2*r1*(r1 - 2*r3)*(r1 - r3)^2/(r1^3 - 2*r1^2*r3 + r1*r3^2 + r1*(r1 - r3)^2 - 2*r3*(r1 - r3)^2)
長くなったように見えるが simplify すると術で述べられているのと同じ式になる。
R4 = R3 |> simplify
R4 |> println
r1*(r1 - 2*r3)/(r1 - r3)
R4(r1 => 2.7/2, r3 => 0.6/2).evalf() * 2 |> println
1.92857142857143
甲円,丙円の直径がそれぞれ 2.7 寸,0.6 寸のとき,乙円の直径は 1.92857142857143 寸である。
当たり前のことであるが,この式に直径を与えると,答えも直径で得られる。
R4(r1 => 2.7, r3 => 0.6) |> println
1.92857142857143
その他のパラメータは以下のとおりである。
r2 = 0.964286; a = 1.80401; x3 = 0.873053; y3 = 1.93333
function draw(more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
(r1, r3) = (2.7, 0.6) ./ 2
(r2, a, x3, y3) = (
r1*(r1 - 2*r3)/(r1 - r3),
r1*(r1 - 2*r3)*sqrt((r1 - r3)^3)/(sqrt(r3)*(r1 - r3)^2),
2*sqrt(r3)*sqrt((r1 - r3)^3)/r1,
2*r1 - 3*r3 + 2*r3^2/r1
)
@printf("乙円の直径 = %g\n", 2r2)
@printf("r2 = %g; a = %g; x3 = %g; y3 = %g\n", r2, a, x3, y3)
plot()
circle(0, r1, r1, :green)
circle(0, r2, r2)
circle(x3, y3, r3, :blue)
segment(0, 2r1, a, 0, :magenta)
segment(0, 2r1, -a, 0, :magenta)
if more
delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3 # size[2] * fontsize * 2
hline!([0], color=:black, lw=0.5)
vline!([0], color=:gray80, lw=0.5)
point(0, r1, "甲円:r1,(0,r1)", :green, :center, delta=-delta/2)
point(0, r2, "乙円:r2,(0,r1)", :red, :center, delta=-delta/2)
point(x3, y3, "丙円:r3\n(x3,y3)", :blue, :center, delta=-delta/2)
point(a, 0, " a", :magenta, :left, :bottom, delta=delta/2)
point(0, 2r1, " 2r1", :magenta, :left, :bottom, delta=delta/2)
end
end;