算額(その543)
群馬の算額 43-1 清水寺 文政7年
http://takasakiwasan.web.fc2.com/gunnsann/g043-1.html
外円内に大円,中円,小円が入っている。外円の直径が 4 寸のとき,小円の大きさを最大にしたときの直径を求めよ。
本問は,「算額(その527)」と基本的に同じである(r3 が最も大きくなるときの r1 を求める)。
外円の半径と中心座標を R, (0, 0)
大円の半径と中心座標を r1, (0, R - r1)
中円の半径と中心座標を r2, (r2, y2)
小円の半径と中心座標を r3, (x3, y3)
とおき,以下の連立方程式を r1 について解く。
include("julia-source.txt");
using SymPy
@syms R, r1, r2, y2::negative, r3, x3, y3::negative
R = 4//2
eq1 = r2^2 + y2^2 - (R - r2)^2
eq2 = x3^2 + y3^2 - (R - r3)^2
eq3 = r2^2 + (R - r1 - y2)^2 - (r1 + r2)^2
eq4 = x3^2 + (R - r1 - y3)^2 - (r1 + r3)^2
eq5 = (x3 - r2)^2 + (y3 - y2)^2 - (r3 + r2)^2;
res = solve([eq1, eq2, eq3, eq4, eq5], (r2, y2, r3, x3, y3))
2-element Vector{NTuple{5, Sym}}:
(-8*r1*(r1 - 2)/(r1 + 2)^2, -2*(3*r1 - 2)/(r1 + 2), -8*r1*(r1 - 2)/(r1 + 2)^2, 8*r1*(r1 - 2)/(r1 + 2)^2, (4 - 6*r1)/(r1 + 2))
(-8*r1*(r1 - 2)/(r1 + 2)^2, -2*(3*r1 - 2)/(r1 + 2), -8*r1*(r1 - 2)/(9*r1^2 - 28*r1 + 36), -24*r1*(r1 - 2)/(9*r1^2 - 28*r1 + 36), (10*r1^2 - 72*r1 + 72)/(9*r1^2 - 28*r1 + 36))
2 組の解が得られるが,2 番目の解が適解である。その解で r3 は r1 の式で表される。
r3 = res[2][3]
r3 |> println
-8*r1*(r1 - 2)/(9*r1^2 - 28*r1 + 36)
図で表すと以下のようになり,r1 が 1.0 〜 1.5 のあたりで最大値になる。
pyplot(size=(300, 200), grid=false, aspectratio=:none, label="")
plot(r3, xlims=(0, 2), xlabel="r1", ylabel="r3")
数値的に解くには,r3 式を微分しその式の値が 0 になるときの r1 を求めればよい。
solve(diff(r3)) |> println
Sym[6/5, 6]
解は 2 通り得られるが r1 = 6/5 が適解である。
r1 = 6/5 のときの r3 は,式に r1 を代入すれば,r3 の最大値が求まる。
r3(r1 => 6//5) |> println
1/2
大円の半径が 6/5 のとき,小円の半径は最大値 1/2 となる。
大円の直径が 12/5 のとき,小円の直径は最大値 1 となる。
そのときのその他のパラメータは以下の通り。
r2 = 0.75; y2 = -1; r3 = 0.5; x3 = 1.5; y3 = 0
function draw(more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
R = 4//2
r1 = (12/5)/2
(r2, y2, r3, x3, y3) = (-8*r1*(r1 - 2)/(r1 + 2)^2, -2*(3*r1 - 2)/(r1 + 2), -8*r1*(r1 - 2)/(r1 + 2)^2, 8*r1*(r1 - 2)/(r1 + 2)^2, (4 - 6*r1)/(r1 + 2))
(r2, y2, r3, x3, y3) = (-8*r1*(r1 - 2)/(r1 + 2)^2, -2*(3*r1 - 2)/(r1 + 2), -8*r1*(r1 - 2)/(9*r1^2 - 28*r1 + 36), -24*r1*(r1 - 2)/(9*r1^2 - 28*r1 + 36), (10*r1^2 - 72*r1 + 72)/(9*r1^2 - 28*r1 + 36))
@printf("r2 = %g; y2 = %g; r3 = %g; x3 = %g; y3 = %g\n", r2, y2, r3, x3, y3)
plot()
circle(0, 0, R)
circle(0, R - r1, r1, :blue)
circle(r2, y2, r2, :green)
circle(-r2, y2, r2, :green)
circle(x3, y3, r3, :orange)
circle(-x3, y3, r3, :orange)
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=:black, lw=0.5)
point(R, 0, "R ", :red, :right, :bottom, delta=delta/2)
point(0, R - r1, " 大円:r1,(0,R-r1)", :blue, :left, :vcenter)
point(r2, y2, "中円:r2,(r2,y2)", :green, :center, delta=-delta/2)
point(x3, y3, "小円:r3,(x3,y3)", :orange, :center, delta=-delta/2)
end
end;