関孝和: 闕擬抄一百問答術
http://hyonemitsu.web.fc2.com/Ketsugishyotojutsu.pdf
米光丁: 和算への旅
http://hyonemitsu.web.fc2.com/
キーワード:円環
#Julia #SymPy #算額 #和算 #数学
問. 61 大円の内外に中円,小円を 19 個配置する。大円の直径が 1 尺のとき,中円,小円の直径はいかほどか。

プログラム的には外円に内接する小円を求めるのが簡単である。
外円(半径 \(R\),中心座標 \( (0,\ 0)\))に外接する中円の半径,内接する小円の半径をそれぞれ \(r_1,\ r_2\) とする。以下の方程式を解く。
include("julia-source.txt"); # julia-source.txt ソース
using SymPy
@syms θ::positive, R::positive, r1::positive, r2::positive, r3::positive, n::integer
θ = 360/n
eq1 = (R + r1)*sind(θ/2) - r1
eq2 = (R - r2)*sind(θ/2) - r2
solve([eq1, eq2], (r1, r2)) |> println
Dict{Any, Any}(r2 => R*sin(pi/n)/(sin(pi/n) + 1), r1 => -R*sin(pi/n)/(sin(pi/n) - 1))
\(r_1 = R\sin(\pi/n)/(1 - \sin(\pi/n))\)
\(r_2 = R\sin(\pi/n)/(1 + \sin(\pi/n))\)
である。
外円の直径が = 1 尺 = 10 寸のとき,中円の直径は 1.9702361077126025 寸,小円の直径は 1.413320924331764 寸である。
R = 10/2
n = 19
r1 = R*sin(pi/n)/(1 - sin(pi/n))
r2 = R*sin(pi/n)/(1 + sin(pi/n))
(r1, r2) .* 2 |> println
(1.9702361077126025, 1.413320924331764)
同じプログラムで,外円の直径が \(R\), 円の数が \(n\) の図形を順次縮小して図を描くことができる(\(maxn=2\) を指定する)。

描画関数プログラムのソースを見る
function draw(R =10, n=19, maxn=2, more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
θ = 360/n
x = cosd.(range(0, 360, n + 1))
y = sind.(range(0, 360, n + 1))
r1 = -R*sin(pi/n)/(sin(pi/n) - 1)
R += 2r1
plot()
for j = 1:maxn
if maxn == 2 || j != 1
@printf("外円の直径 = %.15g, 外円に内接する円の直径 =%.15g\n", R, r1)
for i in 1:n
circle( (R - r1)*x[i], (R - r1)*y[i], r1, :blue)
end
end
maxn == 2 && j == 2 && break
R -= 2r1
r1 = R*sin(pi/n)/(sin(pi/n) + 1)
circle(0, 0, R)
end
if more && maxn == 2
delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3 # size[2] * fontsize * 2
#vline!([0], color=:black, lw=0.5)
#hline!([0], color=:black, lw=0.5)
point(R, 0, " R", :red, :left, :vcenter)
point(R + 1.97, 0, " R+r1", :red, :left, :vcenter)
point(R - 1.41, 0, "R-r2 ", :red, :right, :vcenter)
end
end;
以下のアイコンをクリックして応援してください