算額(その570)
群馬の算額 19-1 榛名神社 文化8年(1811)
http://takasakiwasan.web.fc2.com/gunnsann/g019-1.html
菱形の中に,短いほうの対角線の頂点を中心とする 2 つの弧が接しており,容円が 2 個入っている。菱形の対角線の長さが 4 寸,3 寸のとき,容円の直径を求めよ。
対角線の長さを 2a, 2b(a > b)とする。
円弧の半径と中心座標を r1, (0, b)
容円の半径と中心座標を r2, (x2, 0)
とおき,以下の連立方程式を解く。
include("julia-source.txt");
using SymPy
@syms a::positive, b::positive, r1::positive, r2::positive, x2::positive
r1 = b
eq1 = x2^2 + r1^2 - (r1 + r2)^2
eq2 = b/sqrt(Sym(a^2 + b^2)) - r2/(a - x2)
res = solve([eq1, eq2], (r2, x2))
1-element Vector{Tuple{Sym, Sym}}:
(b*(a^3 + a*b^2 + b^2*sqrt(a^2 + b^2) - b*sqrt(a^4 + 2*a^3*sqrt(a^2 + b^2) + 2*a^2*b^2 + 2*a*b^2*sqrt(a^2 + b^2) + b^4))/(a^2*sqrt(a^2 + b^2)), b*(-a*b - b*sqrt(a^2 + b^2) + sqrt(a^4 + 2*a^3*sqrt(a^2 + b^2) + 2*a^2*b^2 + 2*a*b^2*sqrt(a^2 + b^2) + b^4))/a^2)
菱形の一辺の長さを「斜辺」と置くと,容円の半径の式は以下のようになる。
@syms 斜辺
res[1][1](sqrt(a^2 + b^2) => 斜辺) |> println
b*(a^3 + a*b^2 + b^2*斜辺 - b*sqrt(a^4 + 2*a^3*斜辺 + 2*a^2*b^2 + 2*a*b^2*斜辺 + b^4))/(a^2*斜辺)
さらに sqrt() のなかみを因子分析すると以下のようになる。
a^4 + 2*a^3*斜辺 + 2*a^2*b^2 + 2*a*b^2*斜辺 + b^4 |> factor |> println
(a^2 + b^2)*(a^2 + 2*a*斜辺 + b^2)
まとめると
b*(a^3 + a*b^2 + b^2*斜辺 - b*sqrt((a^2 + b^2)*(a^2 + 2*a*斜辺 + b^2)))/(a^2*斜辺)
のようになり,a, b に具体的な値を与えると答えが得られる。
(a, b) = (4, 3) .// 2
斜辺 = sqrt(Sym(a^2 + b^2))
b*(a^3 + a*b^2 + b^2*斜辺 - b*sqrt((a^2 + b^2)*(a^2 + 2*a*斜辺 + b^2)))/(a^2*斜辺) |> println
87/32 - 9*sqrt(65)/32
容円の半径は (87 - 9√65)/32 寸,直径は (87 - 9√65)/16 ≒ 0.90248 寸である。
(87 - 9√65)/16
0.9024800165820661
その他のパラメータは以下の通り。
容円の直径 = 0.90248; a = 2; b = 1.5; r1 = 1.5; r2 = 0.45124; x2 = 1.24793
function draw(more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
(a, b) = (4, 3) .// 2
r1 = b
(r2, x2) = (87/32 - 9*sqrt(65)/32, -81/32 + 15*sqrt(65)/32)
@printf("容円の直径 = %g; a = %g; b = %g; r1 = %g; r2 = %g; x2 = %g\n", 2r2, a, b, r1, r2, x2)
θ = atand(b/a)
plot([a, 0, -a, 0, a], [0, b, 0, -b, 0], color=:blue, lw=0.5)
circle(0, b, r1, beginangle=180+θ, endangle=(360-θ))
circle(0, -b, r1, beginangle=θ, endangle=(180-θ))
circle(x2, 0, r2, :green)
circle(-x2, 0, r2, :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(a, 0, "a", :blue, :left, :bottom, delta=delta/2)
point(0, b, " b = r1", :blue, :left, :bottom, delta=delta/2)
point(x2, 0, "等円:r2\n(x2,0)", :green, :center, :bottom, delta=delta)
end
end;