算額(その1587)
岡山県瀬戸内市長船町土師宮森 片山日子神社 明治6年(1873)
深川英俊,トニー・ロスマン:聖なる数学:算額,森北出版株式会社,2010年4月22日.
キーワード:円の区分法
#Julia, #SymPy, #算額, #和算, #数学
直径が 2r = 100m の円形の畑がある。この畑を図のように長さが t の線分で分割し,面積を 5 等分したい。その 1 つは辺の長さが d の正方形である。円周率を 3.16(円積率が 0.79)として,t, d を求める術を述べよ。
以下の連立方程式を解く。
include("julia-source.txt")
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf
using SymPy
@syms d, t, r, 円周率, S
#円周率 = 3.16
eq1 = (t - d/2)^2 + (d/2)^2 - r^2
eq2 = d^2 - 円周率*r^2/5
eq3 = S - d^2;
res = solve([eq1, eq2, eq3], (d, t, S))[4] # 3 of 4
(sqrt(10)*sqrt(r^2*(sqrt(円周率*(20 - 円周率)) + 10))*(円周率 - sqrt(円周率*(20 - 円周率)))/(10*(円周率 - 10)), sqrt(r^2*sqrt(-円周率^2 + 20*円周率)/10 + r^2), r^2*円周率/5)
# d
res[1] |> println
res[1](円周率 => 3.16, r => 50).evalf() |> println
res[1](円周率 => π, r => 50).evalf() |> println
sqrt(10)*sqrt(r^2*(sqrt(円周率*(20 - 円周率)) + 10))*(円周率 - sqrt(円周率*(20 - 円周率)))/(10*(円周率 - 10))
39.7492138287036
39.6332729760601
# t
res[2] |> println
res[2](円周率 => 3.16, r => 50) |> println
res[2](円周率 => π, r => 50).evalf() |> println
sqrt(r^2*sqrt(-円周率^2 + 20*円周率)/10 + r^2)
65.7548859021696
65.7219838704568
# S
res[3] |> println
res[3](円周率 => 3.16, r => 50) |> println
res[3](円周率 => π, r => 50).evalf() |> println
r^2*円周率/5
1580.00000000000
1570.79632679490
function draw(r, more)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
円周率 = 3.16
d = sqrt(10)*sqrt(r^2*(sqrt(円周率*(20 - 円周率)) + 10))*(円周率 - sqrt(円周率*(20 - 円周率)))/(10*(円周率 - 10))
t = sqrt(r^2*sqrt(-円周率^2 + 20*円周率)/10 + r^2)
plot()
circle(0, 0, r)
segment(-d/2, d/2, t - d/2, d/2, :blue)
segment(-d/2, -d/2, -d/2, t - d/2, :blue)
segment(d/2, -d/2, - t + d/2, -d/2, :blue)
segment(d/2, d/2, d/2, - t + d/2, :blue)
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(-d/2, d/2, "(-d/2,d/2) ", :blue, :right, :vcenter)
point(d/2, d/2, "(d/2,d/2) ", :blue, :center, :bottom, delta=delta/2)
point(t - d/2, d/2, "(t-d/2,d/2)", :blue, :right, delta=-delta/2)
point(0, r, "r", :red, :center, :bottom, delta=delta/2)
end
end;
draw(100/2, true)