算額(その419)
東京都江東区木場(深川) 大丸屋内稲荷絵馬堂 文化7年(1810)
中村信弥(2001):幻の算額
http://www.wasan.jp/maborosi/maborosi.html
弓形の中に正三角形 1 個,大円 2 個,中円 4 個,小円 4 個が入っている。大円の直径が 1 尺のとき,小円の直径を求めよ。
弓形を構成する外円の中心を原点とする。
弓形を構成する弦と外円の中心の距離を a とする(図参照)
外円の半径と中心座標を r0, (0, 0)
大円の半径と中心座標を r1, (x1, a + r1)
中円の半径と中心座標を r2, (x21, a + r2), (x22, y22)
小円の半径と中心座標を r3, (x31, a + r3), (x32, y32)
として,以下の連立方程式の数値解を求める。
未知数は r0, a, x1, r2, x21, x22, y22, r3, x31, x32, y32 の11個であるが,条件式(方程式)は 12 個になった。
以下の eq4 〜 eq9 のうちどれか一つを使わないようにする(eq9 を除いた)。
include("julia-source.txt");
using SymPy
@syms r0::positive, a::positive, r1::positive, x1::positive,
r2::positive, x21::positive, x22::positive, y22::positive,
r3::positive, x31::positive, x32::positive, y32::positive;
eq1 = x1^2 + (a + r1)^2 - (r0 - r1)^2
eq2 = x21^2 + (a + r2)^2 - (r0 - r2)^2
eq3 = x22^2 + y22^2 - (r0 - r2)^2
eq4 = (x21 - x1)^2 + (r1 - r2)^2 - (r1 + r2)^2
eq5 = (x1 - x22)^2 + (y22 - a - r1)^2 - (r1 + r2)^2
eq6 = (x31 - x1)^2 + (r1 - r3)^2 - (r1 + r3)^2
eq7 = (x1 - x32)^2 + (y32 - a - r1)^2 - (r1 + r3)^2
eq8 = (x21 - x31)^2 + (r2 - r3)^2 - (r2 + r3)^2
eq9 = (x22 - x32)^2 + (y22 - y32)^2 - (r2 + r3)^2
eq10 = distance(0, r0, (r0 - a)/sqrt(Sym(3)), a, x1, a + r1) - r1^2
eq11 = distance(0, r0, (r0 - a)/sqrt(Sym(3)), a, x22, y22) - r2^2
eq12 = distance(0, r0, (r0 - a)/sqrt(Sym(3)), a, x32, y32) - r3^2;
using NLsolve
function nls(func, params...; ini = [0.0])
if typeof(ini) <: Number
r = nlsolve((vout, vin) -> vout[1] = func(vin[1], params..., [ini]), ftol=big"1e-40")
v = r.zero[1]
else
r = nlsolve((vout, vin)->vout .= func(vin, params...), ini, ftol=big"1e-40")
v = r.zero
end
return v, r.f_converged
end;
function H(u)
(r0, a, x1, r2, x21, x22, y22, r3, x31, x32, y32) = u
return [
x1^2 + (a + r1)^2 - (r0 - r1)^2, # eq1
x21^2 + (a + r2)^2 - (r0 - r2)^2, # eq2
x22^2 + y22^2 - (r0 - r2)^2, # eq3
(r1 - r2)^2 - (r1 + r2)^2 + (-x1 + x21)^2, # eq4
-(r1 + r2)^2 + (x1 - x22)^2 + (-a - r1 + y22)^2, # eq5
(r1 - r3)^2 - (r1 + r3)^2 + (-x1 + x31)^2, # eq6
-(r1 + r3)^2 + (x1 - x32)^2 + (-a - r1 + y32)^2, # eq7
(r2 - r3)^2 - (r2 + r3)^2 + (x21 - x31)^2, # eq8
#-(r2 + r3)^2 + (x22 - x32)^2 + (y22 - y32)^2, # eq9
-r1^2 + (a/4 - r0/4 + r1/4 + sqrt(3)*x1/4)^2 + (sqrt(3)*a/4 - sqrt(3)*r0/4 + sqrt(3)*r1/4 + 3*x1/4)^2, # eq10
-r2^2 + (-r0/4 + sqrt(3)*x22/4 + y22/4)^2 + (-sqrt(3)*r0/4 + 3*x22/4 + sqrt(3)*y22/4)^2, # eq11
-r3^2 + (-r0/4 + sqrt(3)*x32/4 + y32/4)^2 + (-sqrt(3)*r0/4 + 3*x32/4 + sqrt(3)*y32/4)^2, # eq12
]
end;
r1 = 10//2
iniv = [big"100.0", 60, 32, 8, 53, 15, 100, 3, 47, 12, 95] ./ 3.2
iniv = [big"31.25", 18.75, 10.0, 2.5, 16.5625, 4.6875, 31.25, 0.9375, 14.6875, 3.75, 29.6875]
res = nls(H, ini=iniv);
println(res);
(BigFloat[25.49038105676657998080848135617869247549515697170824483702794809282177979870005, 12.74519052838329013851885544688169255263494103177866816560880000647679820897323, 10.24519052838328991096467576691497724140415363411739473165687289639408890927506, 2.470438416976302806278212382647506529008215409707534746382983461692078901157198, 17.27432762617317838252967445536201528319013903197721182970015560305202172736248, 4.539957388152644446167925002781799424476871763565147607613821577005623652425758, 22.56782103024110685639605573917644547722212244239117758536157640732734540923325, 0.851900255445560589676464780553194462776632582898376305125453038963129343031564, 14.37290237744824272406559296990917376944931384289685950439663092059990005842643, 4.58897484763492825949410623312361446943111492490923485552995147479476165882802, 19.24584397689835787931127610394921161788065249923856835686360465925916856690406], true)
r0 = 25.4904; a = 12.7452; x1 = 10.2452; r2 = 2.47044; x21 = 17.2743; x22 = 4.53996; y22 = 22.5678; r3 = 0.8519; x31 = 14.3729; x32 = 4.58897; y32 = 19.2458
小円の直径は 1.7038 寸である。
using Plots
function draw(more=false)
pyplot(size=(1000, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
r1 = 10//2
(r0, a, x1, r2, x21, x22, y22, r3, x31, x32, y32) = res[1]
@printf("r0 = %g; a = %g; x1 = %g; r2 = %g; x21 = %g; x22 = %g; y22 = %g; r3 = %g; x31 = %g; x32 = %g; y32 = %g\n", r0, a, x1, r2, x21, x22, y22, r3, x31, x32, y32)
@printf("小円の直径 = %g\n", 2r3)
plot()
circle(0, 0, r0, beginangle=0, endangle=180)
circle(x1, a + r1, r1, :blue)
circle(-x1, a + r1, r1, :blue)
circle(x21, a + r2, r2, :green)
circle(-x21, a + r2, r2, :green)
circle(x22, y22, r2, :green)
circle(-x22, y22, r2, :green)
circle(x31, a + r3, r3, :magenta)
circle(-x31, a + r3, r3, :magenta)
circle(x32, y32, r3, :magenta)
circle(-x32, y32, r3, :magenta)
segment(0, r0, (r0 - a)/√3, a)
segment(0, r0, -(r0 - a)/√3, a)
segment(-sqrt(r0^2 - a^2), a, sqrt(r0^2 - a^2), a)
if more
delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) / 3 # size[2] * fontsize * 2
point(x1, a + r1, " 大円:r1,(x1,a+r1)", :blue, :left, :vcenter)
point(x21, a + r2, "中円:r2,(x21,a+r2) ", :green, :right, :vcenter)
point(x22, y22, " 中円:r2,(x22,y22)", :green, :left, :vcenter)
point(x31, a + r3, "小円:r3,(x31,a+r3) ", :magenta, :right, :vcenter)
point(x32, y32, " 小円:r3,(x32,y32)", :magenta, :left, :vcenter)
point(0, a, " a", :black, :left, :top, delta=-delta)
point(√(r0^2 - a^2), a, "(√(r0^2-a^2),a)", :black, :right, :top, delta=-delta)
point(0, r0, " r0", :red, :left, :bottom)
point(-(r0 - a)/√3, a, "(-(r0-a)/√3, a)", :black, :center, :top, delta=-delta)
vline!([0], color=:black, lw=0.5)
hline!([0], color=:black, lw=0.5)
else
plot!(showaxis=false)
end
end;