算額(その455)
長野県中野市 田上観音堂 文化6年(1809)
中村信弥「改訂増補 長野県の算額」(p.89)
http://www.wasan.jp/zoho/zoho.html
県内の算額1
鈎股弦内に2個の正方形と,大円,中円,小円が1個ずつ入っている。大円,中円,小円の直径がそれぞれ 280,210,168 寸のとき,弦の長さを求めよ。
結論から先にいうと,小円の直径が 168 寸では,算額に示されているような図が得られない。
そこで,小円の直径は未知ということで解を求める。
補助として,図のように勾股弦に内接する半径 r の円を加える。
大円,中円,小円の半径を r1, r2, r3 として,以下の連立方程式を解く。
なお,一度にすべての解を求めるのは無理なので,鈎,股,弦,r, x2 を先に求め,次いで r3, x1, y1 を求める。
include("julia-source.txt")
using SymPy
@syms 鈎::positive, 股::positive, 弦::positive,
r::positive,
x1::positive, x2::positive, y1::positive,
r1::positive, r2::positive, r3::positive;
(r1, r2) = (280, 210) .// 2
y2 = x2
eq0 = 鈎 + 股 - 弦 - 2r
eq1 = 鈎^2 + 股^2 - 弦^2
eq2 = r*y2 - 鈎*r1
eq3 = r*x2 - 股*r2
eq4 = y2/(股 - x2) - 鈎/股;
res1 = solve([eq0, eq1, eq2, eq3, eq4], (鈎, 股, 弦, r, x2))
1-element Vector{NTuple{5, Sym}}:
(735, 980, 1225, 245, 420)
#@syms 鈎::positive, 股::positive, 弦::positive,
r::positive,
x1::positive, x2::positive, y1::positive,
r1::positive, r2::positive, r3::positive;
#(r1, r2) = (280, 210) .// 2
#y2 = x2
(鈎, 股, 弦, r, x2) = (735, 980, 1225, 245, 420)
#eq5 = distance(0, y1, x1, 0, r3, r3) - r3^2
eq5 = sqrt(x1^2 + y1^2)/弦 - r3/r
eq6 = distance(0, 鈎, 股, 0, x1, 0) - (x1^2 + y1^2);
eq7 = y1/x1 - 鈎/股
res2 = solve([eq5, eq6, eq7], (r3, x1, y1))
1-element Vector{Tuple{Sym, Sym, Sym}}:
(79.4594594594595, 317.837837837838, 238.378378378378)
res = solve([eq0, eq1, eq2, eq3, eq4, eq5, eq6, eq7], (鈎, 股, 弦, r, x2, r3, x1, y1))
1-element Vector{NTuple{8, Sym}}:
(735.000000000000, 980.000000000000, 1225.00000000000, 245.000000000000, 420.000000000000, 79.4594594594595, 317.837837837838, 238.378378378378)
鈎 = 735; 股 = 980; 弦 = 1225; x1 = 317.838; x2 = 420; y1 = 238.378
r3 = 79.4595; 小円の直径 = 158.919
傾斜している正方形の一辺の長さ = 397.297
正立している正方形の一辺の長さ = 420
弦の長さは 1225 寸である。算額の答,術,および中村による現代解も 1295 寸を得ている。この解は,小円の直径が 168 寸であるとして導き出されている。しかし,最初に述べたように直径が 168 寸では正方形が弦と接しない。一般的に,算額の解法では目的とする一つのパラメータ(値)だけを求めるので,他のパラメータがどうなるかについては無頓着なので,矛盾に気づかないのであろう。
いずれにしろ,小円の直径は 2✕79.4594594594595 = 158.918918918919 である。そうすれば,図形の相対位置関係は算額の問にある図と同等になる。
using Plots
function draw(more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
(r1, r2) = (280, 210) .// 2
(鈎, 股, 弦, r, x2) = res1[1] # (735, 980, 1225, 245, 420)
(r3, x1, y1) = res2[1] # (79.4594594594595, 317.837837837838, 238.378378378378)
#(鈎, 股, 弦, r, x2, r3, x1, y1) = res[1]
y2 = x2
@printf("鈎 = %g; 股 = %g; 弦 = %g; x1 = %g; x2 = %g; y1 = %g\n", 鈎, 股, 弦, x1, x2, y1)
@printf("r3 = %g; 小円の直径 = %g\n", r3, 2r3)
@printf("傾斜している正方形の一辺の長さ = %g\n", sqrt(distance(0, 鈎, 股, 0, 0, y1)))
@printf("正立している正方形の一辺の長さ = %g\n", x2)
plot([0, 股, 0, 0],[0, 0, 鈎, 0], color=:gray, lw=0.5)
circle(r, r, r, :gray)
circle(x2 + r1, r1, r1, :blue)
circle(r2, y2 + r2, r2, :red)
circle(r3, r3, r3, :green)
segment(0, y2, x2, y2)
segment(x2, 0, x2, y2)
l = sqrt(x1^2 + y1^2)
plot!([x1, l*鈎/弦 + x1, l*鈎/弦, 0, x1], [0, l*股/弦, l*股/弦 + y1, y1, 0], color=:orange, lw=0.5)
if more
delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) / 3 # size[2] * fontsize * 2
point(0, 鈎, " 鈎", :black, :left, :bottom)
point(股, 0, " 股", :black , :left, :bottom, delta=delta/2)
point(x2 + r1, r1, " 大円:r1,(x2+r1,r1)", :black, :left, :bottom, delta=delta)
point(r2, y2 + r2, " 中円:r2,(r2,y2+r2)", :black, :center, :bottom, delta=5delta)
point(r3, r3, " 小円:r3,(r3,r3)", :black, :left, :bottom, delta=delta)
point(x1, 0, " x1", :black, :left, :bottom, delta=delta/2)
point(x2, 0, " x2", :black, :left, :bottom, delta=delta/2)
point(0, y1, " y1", :black, :left, :bottom, delta=delta/2)
point(0, y2, " y2", :black, :left, :bottom, delta=delta/2)
point(l*鈎/弦, l*股/弦 + y1, " (l*鈎/弦,l*股/弦+y1)", :black, :left, :vcenter)
point(l*鈎/弦 + x1, l*股/弦, " (l*鈎/弦+x1,l*股/弦)\n l=sqrt(x1^2+y1^2)", :black, :left, :vcenter)
hline!([0], color=:gray, lw=0.5)
vline!([0], color=:gray, lw=0.5)
else
plot!(showaxis=false)
end
end;