算額(その932)
群馬県安中市下磯部 磯部神社 天保7年(1830)
「算額」第三集 全国調査,香川県算額研究会
直角三角形内に大円 1 個,小円 3 個が入っている。大円の直径が与えられたとき,小円の直径を求めよ。
直角三角形の直角を挟む 2 辺の長さを a, b; b > a
大円の半径と中心座標を r1, (r1, r1)
小円の半径と中心座標を r2, (x2, r2), (x2 + 2r2, r2), (r2, x2)
とおき,以下の連立方程式を解く。
include("julia-source.txt");
using SymPy
@syms a::positive, b::positive, c::positive,
r1::positive, r2::positive, x2::positive
c = sqrt(a^2 + b^2)
eq1 = a + b - c - 2r1
eq2 = (r1 - r2)^2 + (x2 - r1)^2 - (r1 + r2)^2
eq3 = dist2(a, 0, 0, b, r2, x2, r2);
eq4 = dist2(a, 0, 0, b, x2 + 2r2, r2, r2);
println(eq1, ", # eq1")
println(eq2, ", # eq2")
println(eq3, ", # eq3")
println(eq4, ", # eq4")
a + b - 2*r1 - sqrt(a^2 + b^2), # eq1
(-r1 + x2)^2 + (r1 - r2)^2 - (r1 + r2)^2, # eq2
a^2*b^2 - 2*a^2*b*x2 - a^2*r2^2 + a^2*x2^2 - 2*a*b^2*r2 + 2*a*b*r2*x2, # eq3
a^2*b^2 - 2*a^2*b*r2 - 4*a*b^2*r2 - 2*a*b^2*x2 + 4*a*b*r2^2 + 2*a*b*r2*x2 + 3*b^2*r2^2 + 4*b^2*r2*x2 + b^2*x2^2, # eq4
ans_a = solve(eq1, a)[1]
ans_a |> println
2*r1*(b - r1)/(b - 2*r1)
eq3 = eq3(a => ans_a) |> simplify |> numerator |> (x -> x/(4r1*(b - r1)))
eq3 |> println
b*r2*(-b + x2)*(b - 2*r1) + r1*(b - r1)*(b^2 - 2*b*x2 - r2^2 + x2^2)
eq4 = eq4(a => ans_a)|> simplify |> numerator |> (x -> x/b) |> simplify
eq4 |> println
b*(b - 2*r1)^2*(3*r2^2 + 4*r2*x2 + x2^2) + 4*r1^2*(b - r1)^2*(b - 2*r2) - 4*r1*(b - 2*r1)*(b - r1)*(2*b*r2 + b*x2 - 2*r2^2 - r2*x2)
ans_b = solve(eq3, b)[1]
ans_b |> println
(-r1*r2 + r1*x2)/(r1 - r2)
eq4 = eq4(b => ans_b) |> simplify |> numerator |> (x -> x/r1^3);
eq4 |> println
4*r1*(r1 - x2)^2*(-r1*r2 + r1*x2 - 2*r2*(r1 - r2)) + 4*(r1 - x2)*(2*r1 - r2 - x2)*(2*r1*r2*(r2 - x2) + r1*x2*(r2 - x2) + r2*(r1 - r2)*(2*r2 + x2)) - (r2 - x2)*(2*r1 - r2 - x2)^2*(3*r2^2 + 4*r2*x2 + x2^2)
ans_x2 = solve(eq2, x2)[2]
ans_x2 |> println
2*sqrt(r1)*sqrt(r2) + r1
eq4 = eq4(x2 => ans_x2) |> simplify
eq4 |> println
10*r1^(9/2)*sqrt(r2) - 32*r1^(7/2)*r2^(3/2) + 4*r1^(5/2)*r2^(5/2) + 80*r1^(3/2)*r2^(7/2) - 30*sqrt(r1)*r2^(9/2) + r1^5 + 25*r1^4*r2 - 158*r1^3*r2^2 + 218*r1^2*r2^3 - 51*r1*r2^4 - 3*r2^5
ans_r2 = solve(eq4, r2)[1] # 1 of 3
ans_r2 |> println
r1*CRootOf(x^3 - 55*x^2 + 23*x - 1, 1)
CRootOf(x^3 - 55*x^2 + 23*x - 1, 1) は x^3 - 55*x^2 + 23*x - 1 = 0 の複素数解の 1 番目のものという意味で,数式では表せないが,数値としては 0.371791858437119 である。
大円の半径 r1 が 4247 のとき,小円の半径 r2 は 0.371791858437119*r1 = 1579.00002278245 である。
ans_r2.evalf() |> println
ans_r2(r1 => 8494/2).evalf() |> println
0.371791858437119*r1
1579.00002278245
sympy.CRootOf() を使わないで解くと以下のようになる。虚数解の虚数部は誤差範囲で 0 である。
@syms x
eq = x^3 - 55*x^2 + 23*x - 1;
solve(eq)[1].evalf() |> println
0.371791858437119 - 0.e-21*I
すべてのパラメータは以下のとおりである。
r1 = 4247
r2 = 0.371791858437119*r1
x2 = 2*sqrt(r1)*sqrt(r2) + r1
b = (-r1*r2 + r1*x2)/(r1 - r2)
a = 2*r1*(b - r1)/(b - 2*r1)
(a, b, r2, x2)
(17518.388377740157, 12491.392010408297, 1579.0000227824444, 9426.19418317446)
大円の直径が 8494 寸のとき,等円の直径は 2*1579.0000227824444 = 3158.0000455648888 寸である。
function draw(more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
r1 = 1/2
r2 = 0.371791858437119*r1
x2 = 2*sqrt(r1)*sqrt(r2) + r1
b = (-r1*r2 + r1*x2)/(r1 - r2)
a = 2*r1*(b - r1)/(b - 2*r1)
@printf("大円の直径が %.10g 寸のとき,等円の直径は %.10g 寸である。\n", 2r1, 2r2)
@printf("r1 = %g; r2 = %g; x2 = %g; a = %g; b = %g\n", r1, r2, x2, a, b)
plot([0, a, 0, 0], [0, 0, b, 0], color=:green, lw=0.5)
circle(r1, r1, r1, :blue)
circle(r2, x2, r2)
circle(x2, r2, r2)
circle(x2 + 2r2, r2, r2)
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(a, 0, " a", :green, :left, :bottom, delta=delta/2)
point(0, b, " b", :green, :left, :bottom, delta=delta/2)
point(r1, r1, "大円:r1,(r1,r1)", :blue, :center, delta=-delta)
point(r2, x2, "等円:r2\n(r2,x2)", :black, :center, delta=-delta)
point(x2, r2, "等円:r2\n(x2,r2)", :black, :center, delta=-delta)
point(x2 + 2r2, r2, "等円:r2\n(x2+2r2,r2)", :black, :center, delta=-delta)
end
end;