算額(その270)
中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額(260)
長野県下高井郡木島平村 天満宮 推定明治21年(1888)
直線の上に丁円,乙円,甲円,乙円の順に 4 円が外接している。この 4 円に外接する丙円がある。甲円,乙円の径がそれぞれ 2 寸,3 寸のとき,丁円の径を求めよ。
丁円の半径,中心座標を r0, (0, r0)
甲円の半径,中心座標を r1, (x1, r1)
乙円の半径,中心座標を r2, (x2, r2), (x3, r2), x3 = x1 + (x1 - x3) = 2x1 - x2
丙円の半径,中心座標を r4, (x1, 2r1 + r4)
include("julia-source.txt");
using SymPy
@syms r0::positive, r1::positive, r2::positive, r4::positive, x1::positive, x2::positive, x3::positive, y4::positive;
x2 = 2x1 - x3
x4 = x1
y4 = 2r1 + r4
eq1 = x3^2 + (r0 - r2)^2 - (r0 + r2)^2
eq2 = x1^2 + (r0 - y4)^2 - (r0 + r4)^2
eq3 = (x1 - x2)^2 + (r1 - r2)^2 - (r1 + r2)^2
eq4 = (x2 - x4)^2 + (r2 - y4)^2 - (r2 + r4)^2;
r1, r2 を変数として,r0, r4, x1, x3 を求める。
res = solve([eq1, eq2, eq3, eq4], (r0, r4, x1, x3))
2-element Vector{NTuple{4, Sym}}:
(r1*r2^2/(2*r1 - r2)^2, -r1^2/(r1 - r2), -4*r1^(3/2)*sqrt(r2)*sqrt(1/(4*r1^2 - 4*r1*r2 + r2^2)), -2*sqrt(r1)*r2^(3/2)*sqrt(1/(4*r1^2 - 4*r1*r2 + r2^2)))
(r1*r2^2/(2*r1 - r2)^2, -r1^2/(r1 - r2), 4*r1^(3/2)*sqrt(r2)*sqrt(1/(4*r1^2 - 4*r1*r2 + r2^2)), 2*sqrt(r1)*r2^(3/2)*sqrt(1/(4*r1^2 - 4*r1*r2 + r2^2)))
二組の解が求まるが,実際の値を与えて検証すると,二番目の解が適切である。
丁円: r0 = 18.000000; 丙円: r4 = 4.000000; x1 = 19.595918; x3 = 14.696938
(r1, r2) = (2, 3)
(r1*r2^2/(2*r1 - r2)^2, -r1^2/(r1 - r2), -4*r1^(3/2)*sqrt(r2)*sqrt(1/(4*r1^2 - 4*r1*r2 + r2^2)), -2*sqrt(r1)*r2^(3/2)*sqrt(1/(4*r1^2 - 4*r1*r2 + r2^2)))
(18.0, 4.0, -19.595917942265427, -14.69693845669907)
(r1, r2) = (2, 3)
(r1*r2^2/(2*r1 - r2)^2, -r1^2/(r1 - r2), 4*r1^(3/2)*sqrt(r2)*sqrt(1/(4*r1^2 - 4*r1*r2 + r2^2)), 2*sqrt(r1)*r2^(3/2)*sqrt(1/(4*r1^2 - 4*r1*r2 + r2^2)))
(18.0, 4.0, 19.595917942265427, 14.69693845669907)
二番目の解の数式表現を求める。
甲円,乙円の半径を引数として,丁円の半径を求めるプログラムを書く。
直径を与えれば直径を求める。
draw(2, 3, more=false
丁円: r0 = 18.000000; 丙円: r4 = 4.000000; x1 = 19.595918; x3 = 14.696938
using Plots
function draw(r1, r2, more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
(r0, r4, x1, x3) = (
r1*r2^2/(2*r1 - r2)^2,
-r1^2/(r1 - r2),
4*r1^(3/2)*sqrt(r2)*sqrt(1/(4*r1^2 - 4*r1*r2 + r2^2)),
2*sqrt(r1)*r2^(3/2)*sqrt(1/(4*r1^2 - 4*r1*r2 + r2^2)))
x2 = 2x1 - x3
x4 = x1
y4 = 2r1 + r4
@printf("丁円: r0 = %.6f; 丙円: r4 = %.6f; x1 = %.6f; x3 = %.6f\n", r0, r4, x1, x3)
plot()
circle(0, r0, r0)
circle(x1, r1, r1, :blue)
circle(x3, r2, r2, :green)
circle(x2, r2, r2, :green)
circle(x4, y4, r4, :magenta)
if more
point(x1, r1, " 甲円:r1(x1,r1)", :blue)
point(x2, r2, " 乙円:r2(x2,r2)", :green, :left, :bottom)
point(x3, r2, "乙円:r2(x3,r2) ", :green, :right, :bottom)
point(x4, y4, " 丙円:r4(x4,y4)", :magenta, :left, :bottom)
point(0, r0, " 丁円:r0", :red)
vline!([0], color=:black, lw=0.5)
hline!([0], color=:black, lw=0.5, xlims=(-r0, x2 + 4r2))
else
plot!(showaxis=false)
end
end;