算額(その1314)
百四十 群馬県甘楽郡妙義町下高田 高太神社 明治22年(1888)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円16個,菱形
#Julia, #SymPy, #算額, #和算
菱形の中に等円を 16 個容れる。菱形の対角線の長いほうが 80 寸,菱形の一辺の長さが 50 寸のとき,等円の直径はいかほどか。
本問は,算額(その928)の類題である。
菱形の対角線を 2a, 2b; a > b
等円の半径と中心座標を r, (x, r), (r, y), ((2r + x)/3, (r + 2y)/3), ((r + 2x)/3, (2r + y)/3)
とおき,以下の連立方程式を解く。
include("julia-source.txt");
using SymPy
@syms a::positive, b::positive, c::positive,
r::positive, x::positive, y::positive
b = sqrt(c^2 - a^2)
eq1 = dist2(a, 0, 0, b, r, y, r)
eq2 = dist2(a, 0, 0, b, x, r, r)
eq3 = (x - r)^2 + (y - r)^2 - 36r^2;
eq1, eq2 から y, x を求める。
ans_y = solve(eq1, y)[1]
ans_y |> println
ans_x = solve(eq2, x)[1]
ans_x |> println
(-c*r + (a - r)*sqrt(-a^2 + c^2))/a
(a^2 - a*c + r*sqrt(-a^2 + c^2))/(a - c)
y, x を eq3 に代入する。
eq13 = eq3(x => ans_x, y => ans_y) |> expand |> simplify |> numerator
eq13 |> println
a^3*c^2 - 36*a^3*r^2 - a^2*c^3 - 2*a^2*c^2*r + 36*a^2*c*r^2 + 2*a*c^3*r + 2*a*c^2*r*sqrt(-a^2 + c^2) - 2*c^3*r^2 - 2*c^2*r^2*sqrt(-a^2 + c^2)
r について解く。
ans_r = solve(eq13, r)[2] # 2 of 2
ans_r |> println
a*c*(6*a*(a - c) + c*(-a + c + sqrt(-a^2 + c^2)))/(2*(18*a^3 - 18*a^2*c + c^3 + c^2*sqrt(-a^2 + c^2)))
等円の直径は 2*4.54545454545454 = 9.09090909090908 = 100/11 寸である。
ans_r(a => 80/2, c=> 50, b => 30) |> println
4.54545454545454
ans_x, ans_y は a, c の他に r を含む式であるが,上で得られた ans_r を代入すればよい。
ans_x(a => 80/2, c=> 50, r => 50/11) |> println # 290/11
ans_y(a => 80/2, c=> 50, r => 50/11) |> println # 230/11
26.3636363636364
20.9090909090909
function draw(a, c, more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
b = sqrt(c^2 - a^2)
r = a*c*(6*a*(a - c) + c*(-a + c + sqrt(-a^2 + c^2)))/(2*(18*a^3 - 18*a^2*c + c^3 + c^2*sqrt(-a^2 + c^2)))
y = (-c*r + (a - r)*sqrt(-a^2 + c^2))/a
x = (a^2 - a*c + r*sqrt(-a^2 + c^2))/(a - c)
@printf("a = %g; b = %g; c = %g\n", a, b, c)
@printf("r = %g; x = %g; y = %g\n", r, x, y)
@printf("等円の直径は %g 寸である。\n", 2r)
plot([a, 0, -a, 0, a], [0, b, 0, -b, 0], color=:green, lw=0.5)
circle4(r, y, r)
circle4((2r + x)/3, (r + 2y)/3, r)
circle4((r + 2x)/3, (2r + y)/3, r)
circle4(x, r, r)
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(r, y, "(r,y)", :red, :right, delta=-delta, deltax=4delta)
point(x, r, "(x,r)", :red, :right, delta=-delta, deltax=4delta)
point(0, b, " b", :green, :left, :bottom, delta=delta/2)
point(a, 0, " a", :green, :left, :bottom, delta=delta/2)
end
end;
draw(80/2, 50, true)