算額(その154)
岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF
第5問: 円の中に 1 本の弦を隔てて赤,青,黒の円を入れる。青円,黒円の直径を知って赤円の直径を求めよ。
図のように記号を定め,連立方程式を解く。
using SymPy
@syms r1::positive, r2::positive, r3::positive, x3::positive, y3::positive;
eq1 = 2r2 - y3 - r3 # 赤円の中心の y 座標
eq2 = x3^2 + (y3 - r2)^2 - (r2 + r3)^2 # 赤円が青円に外接
eq3 = x3^2 + (y3 - (r1 + r2))^2 - (r1 + r2 - r3)^2 # 赤円が外円に内接
res = solve([eq1, eq2, eq3], (r3, x3, y3)) # 赤円の半径,中心座標を求める
1-element Vector{Tuple{Sym, Sym, Sym}}:
(r1*r2/(r1 + r2), 2*sqrt(r1)*r2/sqrt(r1 + r2), r2*(r1 + 2*r2)/(r1 + r2))
r3 = r1*r2/(r1 + r2)
赤円の半径は,黒円と青円の半径の積を,黒円と青円の半径の和で割ると得られる。
黒円と青円の半径を与えて,赤円の半径と中心座標を返す関数
f(r1, r2) = (r1*r2/(r1 + r2), 2*sqrt(r1)*r2/sqrt(r1 + r2), r2*(r1 + 2*r2)/(r1 + r2));
using Plots
using Printf
function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
θ = beginangle:0.1:endangle
x = r.*cosd.(θ)
y = r.*sind.(θ)
if fill
plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
else
plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end
end;
function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
mark && scatter!([x], [y], color=color, markerstrokewidth=0)
annotate!(x, y, text(string, 10, position, color, vertical))
end;
function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;
function draw(r1, r2, more)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
(r1, r2) = (r1, r2) ./ 2
(r3, x3, y3) = f(r1, r2)
plot()
circle(0, r1 + r2, r1 + r2, :black)
circle(0, r1 + 2r2, r1, :black, fill=true)
circle(0, r2, r2, :blue, fill=true)
circle(x3, y3, r3, :red, fill=true)
circle(-x3, y3, r3, :red, fill=true)
x0 = 2sqrt(r1*r2)
segment(x0, 2r2, -x0, 2r2)
println("黒円の直径 = $(2r1), 青円の直径 = $(2r2), 赤円の直径 = $(2r3)")
if more == true
point(0, r1 + 2r2, " r1", :white)
point(0, r2, " r2", :white)
point(0, r1 + r2, " r1+r2", :white)
point(0, 2r2, " 2r2", :white)
point(x3, y3, "(x3,y3,r3)", :white, :center)
hline!([0], color=:black, lw=0.5)
vline!([0], color=:black, lw=0.5)
else
plot!(showaxis=false)
end
end;
draw(4, 12)
黒円の直径 = 4.0, 青円の直径 = 12.0, 赤円の直径 = 3.0