算額(その558)
群馬の算額 104-6 長谷寺 文久元年
http://takasakiwasan.web.fc2.com/gunnsann/g104-6.html
外円,大円,中円,小円,等円を図のように配置する。外円の直径が与えられたとき,小円の直径を求めよ。
外円の半径と中心座標を R, (0, 0)
大円の半径と中心座標を r1, (0, y), (r1, y) ; r1 = 2r2
中円の半径と中心座標を r2, (0, R - r2), (r2, y)
小円の半径と中心座標を r3, (0, R - 2r3 - r3), (0, 3r3 - R), (0, r3 - R)
等円の半径と中心座標を r4, (x4, y4)
として,以下の連立方程式を解く。
等円のパラメータは他のパラメータと独立なので,最初に 小円と中円の半径を求める
include("julia-source.txt");
using SymPy
@syms R, r1, y::negative, r2::positive, r3, r4, x4, y4
y = r3 - r2
r1 = 2r2
eq4 = r1^2 + (R - 2r2 - r3 - y)^2 - (r1 + r3)^2
eq5 = r1^2 + (r1 - r3)^2 - (r1 + r3)^2
solve([eq4, eq5], (r2, r3))
2-element Vector{Tuple{Sym, Sym}}:
(2*R/7, R/7)
(2*R, R)
最初のものが適解である。
中円と小円の半径は,外円の半径の 2/7, 1/7 である。
算額の問に対する答えはここまでで完了する。
図を描くために,次に r2, r3 が既知として 等円の半径と中心座標を求める。
@syms R, r1, y::negative, r2::positive, r3, r4, x4, y4
(r2, r3) = (2R/7, R/7)
y = r3 - r2
r1 = 2r2
eq1 = (x4 - r1)^2 + (y4 - y)^2 - (r1 + r4)^2
eq2 = x4^2 + y4^2 - (R - r4)^2
eq3 = x4^2 + (R - r2 - y4)^2 - (r2 + r4)^2
solve([eq1, eq2, eq3], (r4, x4, y4))
2-element Vector{Tuple{Sym, Sym, Sym}}:
(5*R*(39 - sqrt(273))/546, 8*sqrt(273)*R/273, R*(3*sqrt(273)/182 + 5/14))
(5*R*(sqrt(273) + 39)/546, -8*sqrt(273)*R/273, R*(5/14 - 3*sqrt(273)/182))
最初のものが適解である。
他のパラメータの数値解は以下の通りである。
小円の直径 = 0.285714; R = 1; r1 = 0.571429; r2 = 0.285714; r3 = 0.142857; r4 = 0.50845; x4 = -0.484182; y4 = 0.0847905
function draw(more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
R = 1
(r2, r3) = R .* (2/7, 1/7)
(r4, x4, y4) = R .*(5(sqrt(273) + 39)/546, -8*sqrt(273)/273, (5/14 - 3*sqrt(273)/182))
y = r3 - r2
r1 = 2r2
@printf("小円の直径 = %g; R = %g; r1 = %g; r2 = %g; r3 = %g; r4 = %g; x4 = %g; y4 = %g\n",
2r3, R, r1, r2, r3, r4, x4, y4)
plot()
circle(0, 0, R, :orange)
circle(0, y, r1)
circle(r1, y, r1)
circle(-r1, y, r1)
circle(0, R - r2, r2, :blue)
circle(r2, y, r2, :blue)
circle(-r2, y, r2, :blue)
circle(0, R - 2r2 - r3, r3, :green)
circle(0, 3r3 - R, r3, :green)
circle(0, r3 - R, r3, :green)
if more
delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3 # size[2] * fontsize * 2
hline!([0], color=:black, lw=0.5)
vline!([0], color=:black, lw=0.5)
point(R, 0, " R", :black, :left, :bottom, delta=delta/2)
point(0, 3r3 - R, " 小円:r3,(0,3r3-R)", :green, :left, :vcenter)
point(0, r3 - R, " 小円:r3,(0,r3-R)", :green, :left, :vcenter)
point(0, R - 2r2 - r3, " 小円:r3,(0,R-2r2-r3)", :green, :left, :vcenter)
point(0, R - r2, " 中円:r2,(0,R-r2)", :blue, :left, :vcenter)
point(r2, y, "中円:r2\n(r2,y)", :blue, :center, :top, delta=-delta)
point(r1, y, " 大円:r1\n (r1,y)", :red, :left, :vcenter)
point(0, y, "y ", :blue, :right, :vcenter)
end
end;