山形県東置賜郡川西町 八幡神社 明治18年(1885)
道脇義正,浜田敏夫,大山真:算額に表れた類題の研究(3.承前)fig.40 ,数学史研究,通巻60号,p.1-26,1974年1月〜3月.
http://www.wasan.jp/sugakusipdf/sugakusi060.pdf
キーワード:円5個,台形
#Julia #SymPy #算額 #和算 #数学
等脚台形の中に甲円,乙円,丙円,丁円,戊円を容れる。丙円,丁円の直径が与えられたとき,甲円の直径はいかほどか。

横倒しになっているが,等脚台形の下底,上底,高さを \(2a, 2b, h\)
甲円の半径と中心座標を \(r_1, (x_1, r_1)\)
乙円の半径と中心座標を \(r_2, (h - r_2, y_2)\)
丙円の半径と中心座標を \(r_3, (h - r_3, r_3)\)
丁円の半径と中心座標を \(r_4, (r_4, r_4)\)
戊円の半径と中心座標を \(r_5, (r_5, y_5)\)
とおく。
それぞれのパラメータは,連立方程式を解けば求められる。
しかし,甲円の直径を知るだけであれば簡単に求めることができる。
そのために下図を描く。

まず甲円,丙円,丁円の部分を切り取った図を描く。次に上下幅が \(2r_1\) の二本の平行線を描き,丁円の左に接する縦線を描く。丙円のコピー(丙円' と表示した)を左上隅に置く。このようにして描いた丙円'は丁円と接する。図に示す直角三角形の三辺 A, B, C において,B は丙円' と丁円の中心の垂直方向の距離なので B \(= \sqrt{r_3 r_4}\) である。
\(2r_1 = r_4 + \text{B} + r_3\) であることがわかる。
include("julia-source.txt"); # julia-source.txt ソース
using SymPy
@syms r1::positive, r3::positive, r4::positive, x1::positive
eq1 = (x1 - r4)^2 + (r1 - r4)^2 - (r1 + r4)^2
eq2 = (r3 - r4)^2 + (2r1 - r3 - r4)^2 - (r3 + r4)^2;
res = solve([eq1, eq2], (r1, x1))[4]
( (4*sqrt(r3)*r4^(3/2) + 2*r3*r4 + 2*r4^2)/(4*r4), r4 + sqrt(2)*sqrt(2*sqrt(r3)*r4^(3/2) + r3*r4 + r4^2))
# r1 甲円の半径
res[1] |> simplify
\(\displaystyle \sqrt{r_{3}} \sqrt{r_{4}} + \frac{r_{3}}{2} + \frac{r_{4}}{2}\)
res[1](r3 => 0.5/2, r4 => 0.4/2) * 2 |> println
0.897213595499958
術は「甲円の直径 = sqrt(丙円の直径*丁円の直径) + (丙円の直径 + 丁円の直径)/2」で,等価なものである。
sqrt(0.5*0.4) + (0.5 + 0.4)/2
0.8972135954999579
すべてのパラメータを求めるためには以下の連立方程式を解く。
SymPy の性能では解析解を求めることができないので,数値解を求めることにする。
@syms a, b, h, r1, x1, r2, y2, r3, r4, r5, y5
x1 = r4 + 2sqrt(r1*r4)
eq1 = (h - r2 - x1)^2 + (y2 - r1)^2 - (r1 + r2)^2
eq2 = (h - r3 - x1)^2 + (r1 - r3)^2 - (r1 + r3)^2
eq3 = (x1 - r4)^2 + (r1 - r4)^2 - (r1 + r4)^2
eq4 = (x1 - r5)^2 + (y5 - r1)^2 - (r1 + r5)^2
eq5 = (r2 - r3)^2 + (y2 - r3)^2 - (r2 + r3)^2
eq6 = (r5 - r4)^2 + (y5 - r4)^2 - (r4 + r5)^2
eq7 = h - (x1 + 2sqrt(r1*r3) + r3)
eq8 = dist2(0, a, h, b, h - r2, y2, r2)/h
eq9 = dist2(0, a, h, b, r5, y5, r5)/h;
eq10 = dist2(0, a, h, b, x1, r1, r1) |> numerator;
# res = solve([eq1, eq2, eq4, eq5, eq6, eq7, eq8, eq9], (r1, h, r2, y2, r5, y5, a, b))
println(eq1, ", # eq1")
println(eq2, ", # eq2")
println(eq3, ", # eq3")
println(eq4, ", # eq4")
println(eq5, ", # eq5")
println(eq6, ", # eq6")
println(eq7, ", # eq7")
println(eq8, ", # eq8")
println(eq9, ", # eq9")
println(eq10, ", # eq10")
(-r1 + y2)^2 - (r1 + r2)^2 + (h - r2 - r4 - 2*sqrt(r1*r4))^2, # eq1
(r1 - r3)^2 - (r1 + r3)^2 + (h - r3 - r4 - 2*sqrt(r1*r4))^2, # eq2
4*r1*r4 + (r1 - r4)^2 - (r1 + r4)^2, # eq3
(-r1 + y5)^2 - (r1 + r5)^2 + (r4 - r5 + 2*sqrt(r1*r4))^2, # eq4
(r2 - r3)^2 - (r2 + r3)^2 + (-r3 + y2)^2, # eq5
(-r4 + r5)^2 + (-r4 + y5)^2 - (r4 + r5)^2, # eq6
h - r3 - r4 - 2*sqrt(r1*r3) - 2*sqrt(r1*r4), # eq7
2*a*b*r2 - 2*a*r2*y2 + b^2*h - 2*b^2*r2 - 2*b*h*y2 + 2*b*r2*y2 - h*r2^2 + h*y2^2, # eq8
a^2*h - 2*a^2*r5 + 2*a*b*r5 - 2*a*h*y5 + 2*a*r5*y5 - 2*b*r5*y5 - h*r5^2 + h*y5^2, # eq9
a^2*h^2 - 2*a^2*h*r4 - 4*a^2*h*sqrt(r1*r4) - a^2*r1^2 + 4*a^2*r1*r4 + a^2*r4^2 + 4*a^2*r4*sqrt(r1*r4) + 2*a*b*h*r4 + 4*a*b*h*sqrt(r1*r4) + 2*a*b*r1^2 - 8*a*b*r1*r4 - 2*a*b*r4^2 - 8*a*b*r4*sqrt(r1*r4) - 2*a*h^2*r1 + 2*a*h*r1*r4 + 4*a*h*r1*sqrt(r1*r4) - b^2*r1^2 + 4*b^2*r1*r4 + b^2*r4^2 + 4*b^2*r4*sqrt(r1*r4) - 2*b*h*r1*r4 - 4*b*h*r1*sqrt(r1*r4), # eq10
function driver(r3, r4)
function H(u)
(r1, h, r2, y2, r5, y5, a, b) = u
return [
(-r1 + y2)^2 - (r1 + r2)^2 + (h - r2 - r4 - 2*sqrt(r1*r4))^2, # eq1
#(r1 - r3)^2 - (r1 + r3)^2 + (h - r3 - r4 - 2*sqrt(r1*r4))^2, # eq2
#4*r1*r4 + (r1 - r4)^2 - (r1 + r4)^2, # eq3
(-r1 + y5)^2 - (r1 + r5)^2 + (r4 - r5 + 2*sqrt(r1*r4))^2, # eq4
(r2 - r3)^2 - (r2 + r3)^2 + (-r3 + y2)^2, # eq5
(-r4 + r5)^2 + (-r4 + y5)^2 - (r4 + r5)^2, # eq6
h - r3 - r4 - 2*sqrt(r1*r3) - 2*sqrt(r1*r4), # eq7
h*(2*a*b*r2 - 2*a*r2*y2 + b^2*h - 2*b^2*r2 - 2*b*h*y2 + 2*b*r2*y2 - h*r2^2 + h*y2^2), # eq8
h*(a^2*h - 2*a^2*r5 + 2*a*b*r5 - 2*a*h*y5 + 2*a*r5*y5 - 2*b*r5*y5 - h*r5^2 + h*y5^2), # eq9
(a^2*h^2 - 2*a^2*h*r4 - 4*a^2*h*sqrt(r1*r4) - a^2*r1^2 + 4*a^2*r1*r4 + a^2*r4^2 + 4*a^2*r4*sqrt(r1*r4) + 2*a*b*h*r4 + 4*a*b*h*sqrt(r1*r4) + 2*a*b*r1^2 - 8*a*b*r1*r4 - 2*a*b*r4^2 - 8*a*b*r4*sqrt(r1*r4) - 2*a*h^2*r1 + 2*a*h*r1*r4 + 4*a*h*r1*sqrt(r1*r4) - b^2*r1^2 + 4*b^2*r1*r4 + b^2*r4^2 + 4*b^2*r4*sqrt(r1*r4) - 2*b*h*r1*r4 - 4*b*h*r1*sqrt(r1*r4))/(a^2 - 2*a*b + b^2 + h^2), # eq10
]
end;
iniv = BigFloat[0.56509, 2.17787, 0.48455, 1.22943, 0.15855, 0.55803, 0.63916, 2.14978]
res = nls(H, ini=iniv)
return(res)
end;
driver(0.5/2, 0.4/2)
([0.44860679774997897, 1.7188516351015686, 0.2741870795471826, 0.7736287611917269, 0.1823572433922654, 0.5819499898073206, 0.7276313970915846, 1.1168434577825994], true)
丙円の直径が 0.5,丁円の直径が 0.4 のとき,甲円の直径は 2*0.44860679774997897 = 0.8972135954999579 である。
2*0.44860679774997897
0.8972135954999579
術は「甲円の直径 = sqrt(丙円の直径*丁円の直径) + (丙円の直径 + 丁円の直径)/2」となっており,これに従うと sqrt(0.5*0.4) + (0.5 + 0.4)/2 = 0.8972135954999579 で,全桁一致する。
描画関数プログラムのソースを見る
function draw(r3, r4, more)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
answer = driver(r3, r4)
if answer[2]
println(answer)
(r1, h, r2, y2, r5, y5, a, b) = answer[1]
else
println("収束しませんでした")
return
end
x1 = r4 + 2sqrt(r1*r4)
r10 = sqrt(r2*r3) + (r2 + r3)/2
println("r10 = ", r10)
plot([0, h, h, 0, 0], [0, 0, b, a, 0], color=:green, lw=0.5)
circle(x1, r1, r1)
circle(h - r2, y2, r2, :blue)
circle(h - r3, r3, r3, :magenta)
circle(r4, r4, r4, :brown)
circle(r5, y5, r5, :orange)
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(x1, r1, "甲円:r1,(x1,r1)", :red, :center, delta=-delta)
point(h - r2, y2, "乙円:r2,(h-r2,y2)", :blue, :center, delta=-delta)
point(h - r3, r3, "丙円:r3,(h-r3,r3)", :magenta, :center, delta=-delta)
point(r4, r4, "丁円:r4\n(r4,r4)", :brown, :center, delta=-delta)
point(r5, y5, "戊円:r5\n(r5,y5)", :orange, :center, delta=-delta)
point(h, b, "(h,b)", :green, :right, :bottom, delta=delta/2)
point(0, a, "a", :green, :left, :bottom, delta=delta, deltax=delta/2)
end
end;
draw(0.5/2, 0.4/2, true)
以下のアイコンをクリックして応援してください