算額(その1101)
六十六 岩手県花泉町金沢字大柳 金沢八幡宮 明治29年(1896)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.
http://www.wasan.jp/yamamura/yamamura.html
キーワード:円3個,四分円3個,外円
全円の中に 四分円を 3 個,等円を 3 個容れる。正三角形の一辺の長さ(四分円の半径)が与えられたとき,等円の直径を求めよ。
全円の半径と中心座標を R, (0, 0); R = sqrt((√3a/3 + 2a)^2 + a^2) = 2a*sqrt(3√3 + 12)/3
四分円の半径と中心座標を 2a, (0, 2√3a/3), (-a, -√3a/3)
等円の半径と中心座標を r, (x, y); x < 0
とおき,以下の連立方程式を解く。
include("julia-source.txt")
using SymPy
@syms R::positive, a::positive,
x::negative, y::positive, r::positive
R = sqrt((√Sym(3)a/3 + 2a)^2 + a^2)
eq1 = (x + a)^2 + (y + √Sym(3)a/3)^2 - (2a + r)^2
eq2 = x^2 + y^2 - (R - r)^2
eq3 = dist2(0, 2√Sym(3)a/3, √Sym(3)a, 2√Sym(3)a/3 + a, x, y, r);
using NLsolve
function nls(func, params...; ini = [0.0])
if typeof(ini) <: Number
r = nlsolve((vout, vin) -> vout[1] = func(vin[1], params..., [ini]), ftol=big"1e-40")
v = r.zero[1]
else
r = nlsolve((vout, vin)->vout .= func(vin, params...), ini, ftol=big"1e-40")
v = r.zero
end
return Float64.(v), r.f_converged
end;
function H(u)
(r, x, y) = u
return [
(a + x)^2 - (2*a + r)^2 + (sqrt(3)*a/3 + y)^2, # eq1
x^2 + y^2 - (-r + sqrt(a^2 + (sqrt(3)*a/3 + 2*a)^2))^2, # eq2
a^2 + a*x - sqrt(3)*a*y - r^2 + x^2/4 - sqrt(3)*x*y/2 + 3*y^2/4, # eq3
]
end;
a = 1/2
iniv = BigFloat[0.38, -0.019, 1]
res = nls(H, ini=iniv)
([0.3786461241150318, -0.019277088702774222, 1.0034435202087308], true)
正三角形の一辺の長さが 1 のとき,等円の直径は 2*0.3786461241150318 = 0.7572922482300636 である。
算額の「術」は正しいが,山村の解説は途中で数値の参照ミスをしているため結果がだめになっている。「0.636×三角面」ではなく「(正確に)0.7572922482300636×三角面」である。
三角面 = 1
天 = √3
地 = √(天 + 4) + 天
誤 A = sqrt((3*0.732 + 1)*(2地 + 1) + 3) + (地 + 1) 0.732 ではなく 1.732(=√3)
A = sqrt((3天 + 1)*(2地 + 1) + 3) + (地 + 1)
等円径 = A/地^2*三角面
0.7572922482300636
その他のパラメータは以下のとおりである。
a = 0.5; R = 1.38227; r = 0.378646; x = -0.0192771; y = 1.00344
function draw(more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
a = 1/2 #10√3/2
(r, x, y) = res[1]
#a = 8.66025; R = 23.9417; r = 6.61269; x = -0.39708; y = 17.3766
R = sqrt((√3a/3 + 2a)^2 + a^2)
@printf("正三角形の一辺の長さが %g のとき,等円の直径は %.15g である。\n", 2a, 2r)
@printf("a = %g; R = %g; r = %g; x = %g; y = %g\n", a, R, r, x, y)
plot([a, 0, -a, a], [-√3a/3, 2√3a/3, -√3a/3, -√3a/3], color=:magenta, lw=0.5)
circle(0, 0, R, :blue)
rotate(x, y, r, :green)
for i = 0:2 # 90:120:330
ox = 2√3a/3*cosd(90 + 120i)
oy = 2√3a/3*sind(90 + 120i)
ba = -60 + 120i
ea = -60 + 120i + 90
circle(ox, oy, 2a, beginangle=ba, endangle=ea)
x1 = ox + 2a*cosd(ea)
y1 = oy + 2a*sind(ea)
segment(ox, oy, x1, y1, :red)
end
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(x, y, "(x,y)")
point(a, -√3a/3, "(a,-√3a/3) ", :magenta, :right, :bottom, delta=delta/2)
point(0, 2√3a/3, " 2√3a/3", :magenta, :left, :vcenter)
point(0, R, " R", :blue, :center, :bottom, delta=delta/2)
point(√3a, 2√3a/3 + a)
end
end;