算額(その1154)
一〇一 大宮市高鼻町 氷川神社 明治31年(1898)
埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.
キーワード:円7個,楕円1個
外円の中に楕円 1 個,甲円 2 個を容れ,隙間に乙円 2 個,丙円 2 個を容れる。乙円の直径が 1 寸のとき,丙円の直径はいかほどか。
注:これだけでは条件不足である。「問」には書かれていないが,乙円は楕円の曲率円である。そのように解釈すれば条件は足りる。
楕円の長半径,短半径と中心座標を a, b, (0, 0); a = r1 + r3, b = a - 2r3
外円の半径と中心座標を R, (0, 0); R = a
甲円の半径と中心座標を r1, (0, R - r1)
乙円の半径と中心座標を r2, (R - r2, 0)
丙円の半径と中心座標を r3, (0, R - r3)
とおき,以下の連立方程式を解く。
include("julia-source.txt")
using SymPy
@syms a, b, R, r1, r2, r3
a = r1 + r3
b = a - 2r3
R = a
eq1 = (R - r2)^2 + (R - r1)^2 - (r1 + r2)^2
eq2 = r2 - b^2/a
res= solve([eq1, eq2], (r3, r1))[3] # 3 of 3
(r2*(sqrt(2) + 2)/2, r2*(4 + 3*sqrt(2))/2)
丙円の半径 r3 は,乙円の半径 r2 の √2/2 + 1 倍である。
乙円の直径が 1 寸のとき,丙円の直径は 1.7071067811865475 寸である。
「術」は簡約化すれば,「乙円の径の √2/2 + 1 倍が丙円の径である」となり,同じである。
乙径 = 1
天 = √8 + 3
(天 - √天)*乙径/2
1.7071067811865475
(√Sym(8) + 3 - sqrt(√Sym(8) + 3))/2 |> sympy.sqrtdenest |> simplify |> println
sqrt(2)/2 + 1
その他のパラメータは以下の通りである。
r2 = 0.5; r3 = 0.853553; r1 = 2.06066; a = 2.91421; b = 1.20711
function draw(r2, more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
#@printf("正方形の一辺の長さが %g,大円の直径が %g のとき,小円の直径は %g である。\n", a, 2r1, 2r2)
(r3, r1) = (r2*(sqrt(2) + 2)/2, r2*(4 + 3*sqrt(2))/2)
a = r1 + r3
b = a - 2r3
@printf("乙円の直径が %g のとき,丙円の直径は %g である。\n", 2r2, 2r3)
@printf("r2 = %g; r3 = %g; r1 = %g; a = %g; b = %g\n", r2, r3, r1, a, b)
plot()
circle(0, 0, a, :orange)
circle22(0, a - r1, r1)
circle22(0, a - r3, r3, :blue)
circle2(a - r2, 0, r2, :green)
ellipse(0, 0, a, b, color=:magenta)
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(0, a - r1, "甲円:r1,(0,a-r1)", :red, :center, delta=-delta/2)
point(a - r2, 0, "乙円:r2\n(a-r2,0)", :green, :center, :bottom, delta=delta/2)
point(0, a - r3, "丙円:r3,(0,a-r3)", :blue, :center, delta=-delta/2)
point(0, b, "b", :magenta, :center, delta=-delta/2)
point(0, a - 2r3, "a-2r3", :blue, :center, :bottom, delta=delta/2)
point(0, a, "a", :orange, :center, :bottom, delta=delta/2)
point(a, 0, " a", :orange, :left, :bottom, delta=delta/2)
end
end;