八六 埼玉県加須市多聞寺 愛宕神社 明治13年(1880)
埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.
キーワード:円7個,外円,円弧
#Julia #SymPy #算額 #和算 #数学
外円の中に,外円と同じ半径を持つ円弧 1 個と円弧に接する弦と,甲円,乙円,丙円を 2 個ずつ容れる。乙円の直径が 1 寸のとき,丙円の直径が取りうる最大値はいかほどか。
注:弦の位置(弦と \(y\) 軸の交点の \(y\) 座標)により丙円の大きさが変化する。

弦と \(y\) 軸の交点の \(y\) 座標を \(y\)
外円の半径と中心座標を \(R,\ (0,\ 0)\)
甲円の半径と中心座標を \(r_1,\ (r_1,\ 0);\ r_1 = R/2\)
乙円の半径と中心座標を \(r_2,\ (0,\ R - r_2)\)
丙円の半径と中心座標を \(r_3,\ (x_3,\ y - r_3)\)
とおき,以下の連立方程式を解く。
include("julia-source.txt"); # julia-source.txt ソース
using SymPy
@syms y, R::positive, r1::positive,
r2::positive, r3::positive, x3::positive;
R = 2r1
eq1 = r1^2 + (R - r2)^2 - (r1 + r2)^2
eq2 = x3^2 + (R - r3)^2 - (r3 + R)^2
eq3 = x3^2 + (y - r3)^2 - (R - r3)^2 |> expand
res = solve([eq1, eq2, eq3], (r3, x3, r1))[1]
( (-3*r2 + y)*(3*r2 + y)/(2*(-9*r2 + y)), -sqrt(6)*sqrt(r2)*sqrt( (-3*r2 + y)*(3*r2 + y)/(-9*r2 + y)), 3*r2/2)
丙円の半径は \(r_3 = (-3r_2 + y)\cdot (3r_2 + y)/(2(-9r2 + y))\) となり,\(y\) と \(r_2\) の関数である。
\(r_2\) は事前に与えられるので,\(y\) の取る値で \(r_3\) が変化する。
たとえば,乙円の直径が 1 寸のとき(注2),\(-1.5 ≦ y ≦ 1.5\) で,\(y\) が 0.0 〜 0.5 の区間で \(r_3\) が最大値を取る。
pyplot(size=(300, 150), grid=false, aspectratio=:none, label="")
plot(res[1](r2 => 1/2), xlims=(-1.5,1.5), xlabel="y", ylabel="r3")

\(r_3\) が最大値を取るときの \(y\),および,そのときの最大値を求める。
r3_dash = diff(res[1], y) |> factor; # 導関数
r3_dash |> println
(9*r2^2 - 18*r2*y + y^2)/(2*(-9*r2 + y)^2)
\(r3_{dash} = 0\) を解いて \(y\) を求める。
ans_y = solve(r3_dash, y)[1]
ans_y |> println
3*r2*(3 - 2*sqrt(2))
甲円の半径 \(r_2\) が 1/2 のときの丙円の半径 \(r_3\) を求める。
ans_r3 = res[1](y => ans_y) |> simplify
ans_r3 |> println
ans_r3(r2 => 1/2).evalf() |> println
3*r2*(3 - 2*sqrt(2))
0.257359312880715
丙円の中心の \(x\) 座標を求める。
res[2] は負の値を取るが,左右いずれの甲円でも問題を解く上では無関係である。
ans_x3 = res[2](y => ans_y) |> simplify
ans_x3 |> println
ans_x3(r2 => 1/2).evalf() |> println
-3*2^(3/4)*r2*sqrt(-4 + 3*sqrt(2))
-1.24264068711929
最後に甲円の半径を求める。
ans_r1 = res[3]
ans_r1 |> println
ans_r1(r2 => 1/2) |> println
3*r2/2
0.750000000000000
図を描くために,甲円と円弧の交点座標を求める。
@syms, x0, y0
eq4 = x0^2 + y0^2 - R^2
eq5 = x0^2 + (y0 - y + R)^2 - R^2
res2 = solve([eq4, eq5], (x0, y0))[1]
(-sqrt(-(-6*r1 + y)*(2*r1 + y))/2, (-2*r1 + y)/2)
まとめ
乙円の半径 \(r_2\) が与えられれば,乙円の半径が最大になるときの弦の位置 \(y\) が決まる。\(y = 3r_2(3 - 2\sqrt{2})\)
丙円の半径 \(r_3\) は \(r_3 = 3r_2(3 - 2\sqrt{2})\) である。丙円の半径だけを求めるのならば,\(y\) は求める必要はない。
乙円の直径が 1 寸のとき,丙円の直径は \(3(3 - 2\sqrt{2}) = 0.5147186257614291\) 寸である。
なお,下に示す算額の図は,丙円が最大になったときの図ではない。問題を解こうとする人を欺くためにわざとこのような図を描いたのではないかと邪推する。

描画関数プログラムのソースを見る
function draw(r2, more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
y = 3*r2*(3 - 2*sqrt(2))
r3 = 3*r2*(3 - 2*sqrt(2))
x3 = 3*2^(3/4)*r2*sqrt(-4 + 3*sqrt(2))
r1 = 3*r2/2
R = 2r1
x = sqrt(R^2 - y^2)
(x0, y0) = (-sqrt(-(-6*r1 + y)*(2*r1 + y))/2, (-2*r1 + y)/2)
@printf("乙円の直径が %g,y が %g のとき,丙円の直径は最大値 %g になる。\n", 2r2, y, 2r3)
plot()
circle(0, 0, R, :green)
circle2(r1, 0, r1)
circle22(0, R - r2, r2, :blue)
circle2(x3, y - r3, r3, :magenta)
segment(-x, y, x, y)
θ = atand(y0, x0)
circle(0, y - R, R, :green, beginangle=-θ, endangle=180+θ)
if more
delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3 # size[2] * fontsize * 2
hline!([0], color=:gray80, lw=0.5)
vline!([0], color=:gray80, lw=0.5)
point(0, R, "R", :green, :center, :bottom, delta=delta)
point(0, y, "y", :black, :center, :bottom, delta=delta)
point(r1, 0, "甲円:r1,(r1,0)", :red, :right, delta=-delta, deltax=3delta)
point(0, R - r2, "乙円:r2\n(0,R-r2)", :blue, :center, delta=-delta)
point(0, r2 - R, "乙円:r2\n(0,r2-R)", :blue, :center, :bottom, delta=delta)
point(x3, y - r3, "丙円:r3,(y-r3,0)", :magenta, :right, :bottom, delta=delta, deltax=3delta)
point(0, y - R, "円弧:R,(0,y-R)", :green, :center, delta=-delta)
end
end;
draw(1/2, true)
以下のアイコンをクリックして応援してください