算額(その261)
中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額2(71)
長野県長野市 久保寺観音堂 享和3年(1803)
十七 群馬県高崎市八幡町 文化7年(1810)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円2個,直角三角形,中鈎
#Julia, #SymPy, #算額, #和算
鈎股弦(直角三角形)の中鈎を隔てて,大円,小円が入っている。大円,小円の直径が 68.8 寸,51.6 寸であるとき,鈎,股,弦を求めよ。
鈎,股,弦,中鈎,短弦,長弦 をそのまま「鈎」,「股」,「弦」,「中鈎」,「短弦」,「長弦」
大円の半径と中心座標を r1, (x1, r1)
小円の半径と中心座標を r2, (股 - r2, y2)
とおき,以下の連立方程式を解く。
include("julia-source.txt");
using SymPy
@syms 鈎::positive, 股::positive, 弦::positive,
中鈎::positive, 長弦::positive, 短弦::positive,
x1::positive, y2::positive,
r1::positive, r2::positive;
eq1 = 鈎^2 + 股^2 - 弦^2
# eq2 = 短弦^2 + 中鈎^2 - 鈎^2
# eq3 = 長弦^2 + 中鈎^2 - 股^2
eq2 = 短弦/鈎 - 鈎/弦
eq3 = 中鈎/股 - 鈎/弦
eq4 = 弦 - 長弦 - 短弦
# eq5 = dist2(長弦*股/弦, 長弦*鈎/弦, 股, 0, x1, r1, r1)
# eq6 = dist2(長弦*股/弦, 長弦*鈎/弦, 股, 0, 股 - r2, y2, r2)
eq5 = 長弦 + 中鈎 - 股 - 2r1
eq6 = 短弦 + 中鈎 - 鈎 - 2r2
eq7 = dist2(0, 0, 股, 鈎, x1, r1, r1)
eq8 = dist2(0, 0, 股, 鈎, 股 - r2, y2, r2);
SymPy の性能上,一度に解けないので,まず eq1 〜 eq6 を解いて 鈎, 股, 弦, 中鈎, 長弦, 短弦 を求める。
res = solve([eq1, eq2, eq3, eq4, eq5, eq6], (鈎, 股, 弦, 中鈎, 長弦, 短弦))[2] # 2 of 2
((r1^4 + r1^3*r2 + r1^3*sqrt(r1^2 + r2^2) + 3*r1^2*r2^2 + 2*r1^2*r2*sqrt(r1^2 + r2^2) + r1*r2^3 + r1*r2^2*sqrt(r1^2 + r2^2) + 2*r2^4 + 2*r2^3*sqrt(r1^2 + r2^2))/(r1*(r1^2 + r2^2 + r2*sqrt(r1^2 + r2^2))), (r1^4 + r1^3*r2 + r1^3*sqrt(r1^2 + r2^2) + 3*r1^2*r2^2 + 2*r1^2*r2*sqrt(r1^2 + r2^2) + r1*r2^3 + r1*r2^2*sqrt(r1^2 + r2^2) + 2*r2^4 + 2*r2^3*sqrt(r1^2 + r2^2))/(r2*(r1^2 + r2^2 + r2*sqrt(r1^2 + r2^2))), (r1^2*(r1 + sqrt(r1^2 + r2^2)) + r1*r2*(r1 + r2) + r2^2*(r2 + sqrt(r1^2 + r2^2)))/(r1*r2), (r1^3 + 2*r1^2*r2 + r1^2*sqrt(r1^2 + r2^2) + r1*r2^2 + r1*r2*sqrt(r1^2 + r2^2) + 2*r2^3 + 2*r2^2*sqrt(r1^2 + r2^2))/(r1^2 + r2^2 + r2*sqrt(r1^2 + r2^2)), r1*(r1 + r2 + sqrt(r1^2 + r2^2))/r2, r2*(r1 + r2 + sqrt(r1^2 + r2^2))/r1)
2 組の解が得られるが,2 番目のものが適解である。弦を表す式は以下のように簡約化できる。
ans_鈎 = res[1] |> factor
ans_鈎 |> println
(r1^2 + r2^2)*(r1^2 + r1*r2 + r1*sqrt(r1^2 + r2^2) + 2*r2^2 + 2*r2*sqrt(r1^2 + r2^2))/(r1*(r1^2 + r2^2 + r2*sqrt(r1^2 + r2^2)))
ans_股 = res[2] |> factor
ans_股 |> println
(r1^2 + r2^2)*(r1^2 + r1*r2 + r1*sqrt(r1^2 + r2^2) + 2*r2^2 + 2*r2*sqrt(r1^2 + r2^2))/(r2*(r1^2 + r2^2 + r2*sqrt(r1^2 + r2^2)))
ans_弦 = res[3] |> factor
ans_弦 |> println
(r1^2 + r2^2)*(r1 + r2 + sqrt(r1^2 + r2^2))/(r1*r2)
大円,小円の直径が 68.8 寸,51.6 寸であるとき,鈎 = 129 寸,股 = 172 寸,弦 = 215 寸である。
ans_鈎(r1 => 68.8/2, r2 => 51.6/2).evalf() |> println
ans_股(r1 => 68.8/2, r2 => 51.6/2).evalf() |> println
ans_弦(r1 => 68.8/2, r2 => 51.6/2).evalf() |> println
129.000000000000
172.000000000000
215.000000000000
鈎,股の解が得られたので,eq7, eq8 の鈎,股に代入し,連立方程式を解いて x1, y2 を求める。
eq17 = eq7(鈎 => res[1], 股 => res[2]) |> simplify |> numerator;
eq18 = eq8(鈎 => res[1], 股 => res[2]) |> simplify |> numerator;
res2 = solve([eq17, eq18], (x1, y2))[3] # 3 of 4
(r1^2/r2 + r1*sqrt(r1^2 + r2^2)/r2, (r1^4 + 2*r1^3*r2 + r1^3*sqrt(r1^2 + r2^2) + 4*r1^2*r2^2 + 3*r1^2*r2*sqrt(r1^2 + r2^2) + 2*r1*r2^3 + 2*r1*r2^2*sqrt(r1^2 + r2^2) + 2*r2^4 + 2*r2^3*sqrt(r1^2 + r2^2) - r2*sqrt(r1^6 + 9*r1^4*r2^2 + 4*r1^4*r2*sqrt(r1^2 + r2^2) + 16*r1^2*r2^4 + 12*r1^2*r2^3*sqrt(r1^2 + r2^2) + 8*r2^6 + 8*r2^5*sqrt(r1^2 + r2^2)))/(r1^3 + 2*r1*r2^2 + 2*r1*r2*sqrt(r1^2 + r2^2)))
4 組の解が得られるが 3 番目のものが適解である。
x
res2[1](r1 => 68.8/2, r2 => 51.6/2) |> println
103.200000000000
y
res2[2](r1 => 68.8/2, r2 => 51.6/2) |> println
77.4000000000000
function draw(r1, r2, more)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
t = sqrt(r1^2 + r2^2)
(鈎, 股, 弦, 中鈎, 長弦, 短弦) = ((r1^4 + r1^3*r2 + r1^3*t + 3*r1^2*r2^2 + 2*r1^2*r2*t + r1*r2^3 + r1*r2^2*t + 2*r2^4 + 2*r2^3*t)/(r1*(r1^2 + r2^2 + r2*t)), (r1^4 + r1^3*r2 + r1^3*t + 3*r1^2*r2^2 + 2*r1^2*r2*t + r1*r2^3 + r1*r2^2*t + 2*r2^4 + 2*r2^3*t)/(r2*(r1^2 + r2^2 + r2*t)), (r1^2*(r1 + t) + r1*r2*(r1 + r2) + r2^2*(r2 + t))/(r1*r2), (r1^3 + 2*r1^2*r2 + r1^2*t + r1*r2^2 + r1*r2*t + 2*r2^3 + 2*r2^2*t)/(r1^2 + r2^2 + r2*t), r1*(r1 + r2 + t)/r2, r2*(r1 + r2 + t)/r1)
(x1, y2) = (r1^2/r2 + r1*t/r2, (r1^4 + 2*r1^3*r2 + r1^3*t + 4*r1^2*r2^2 + 3*r1^2*r2*t + 2*r1*r2^3 + 2*r1*r2^2*t + 2*r2^4 + 2*r2^3*t - r2*sqrt(r1^6 + 9*r1^4*r2^2 + 4*r1^4*r2*t + 16*r1^2*r2^4 + 12*r1^2*r2^3*t + 8*r2^6 + 8*r2^5*t))/(r1^3 + 2*r1*r2^2 + 2*r1*r2*t))
@printf("鈎 = %g; 股 = %g; 弦 = %g; 中鈎 = %g; 長弦 = %g; 短弦 = %g; x1 = %g; y2 = %g\n", 鈎, 股, 弦, 中鈎, 長弦, 短弦, x1, y2)
# println("2r1 + 4r2 = $(2r1 + 4r2)")
plot([股, 股, 0, 股, 長弦*股/弦], [ 0, 鈎, 0, 0, 長弦*鈎/弦], linecolor=:black, linewidth=0.5)
circle(x1, r1, r1)
circle(股 - r2, y2, r2, :blue)
if more == true
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\n(x1,r1)", :red, :center, delta=-delta)
point(股 - r2, y2, "小円:r2\n(股-r2,y2)", :blue, :center, delta=-delta)
point(股, 鈎/2, " 鈎", mark=false)
point(股/2, 0, "股 ", :green, :right, :bottom, mark=false)
point((股 + 長弦*股/弦)/2, 長弦*鈎/弦/2, " 中鈎", mark=false)
point(長弦*股/弦/2, 長弦*鈎/弦/2, "長弦 \n", :green, :right, mark=false)
point((股 + 長弦*股/弦)/2, (鈎 + 長弦*鈎/弦)/2, "短弦\n", :green, :right, :bottom, mark=false)
point(股/2, 鈎/2, "弦 = 長弦 + 短弦 ", :green, :right, mark=false)
xlims!(-3delta, 股 + 5delta)
end
end;
draw(68.8/2, 51.6/2, true)