算額(その87)
福島県二本松市杉沢 愛宕神社
http://www.wasan.jp/fukusima/atago.html
外円の中に正三角形が入っている。小さい方の一辺の長さが1寸のとき,大きい方の一辺の長さはいかほどか。
大きい方の一辺の長さを2,小さい方の一辺の長さを x として,以下のように記号を定める。
円の半径は 2/√3,c は AB の中点である。以下順に長さが決まる。
AB = 2
Ac = 1
yc = 1/2
Ay = √3/2
y = 1/(2√3)
(x+1/2, y) が円周上にあるので以下の方程式を解き x を求める。
using SymPy
@syms x::positive, y::positive;
y = 1/(2*sqrt(Sym(3)))
eq = (x + 1//2)^2 + y^2 -(y +sqrt(Sym(3))/2)^2
x = solve(eq)[1];
(x, y) |> println
(-1/2 + sqrt(5)/2, sqrt(3)/6)
x が 1 寸ならば大きい正三角形の一辺は 2 / (-1/2 + sqrt(5)/2) = 1 + sqrt(5) = 3寸2分3厘6毛である。
2 / (-1//2 + sqrt(Sym(5))/2) |> simplify
1 + sqrt(5)
1+√5
3.23606797749979
算額では,「5個を開平し1個を加える」ことで三寸二分三厘を得ている。
using Plots
function circle(ox, oy, r, color=:red; beginangle=0, endangle=360)
θ = beginangle:0.1:endangle
x = r.*cosd.(θ)
y = r.*sind.(θ)
plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end;
function point(x, y, string="", color=:green, position=:left, vertical=:top; fontsize=10, mark=true)
mark && scatter!([x], [y], color=color, markerstrokewidth=0)
annotate!(x, y, text(string, fontsize, vertical, position, color))
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(more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
(x, y) = (-1/2 + sqrt(5)/2, sqrt(3)/6)
r = 2/sqrt(3)
(Ax, Ay) = (0, r)
(Bx, By) = (r*cosd(30), r*sind(-30))
(Cx, Cy) = (-r*cosd(30), r*sind(-30))
(ax, ay) = ((1 + x)/2, y + sqrt(3)/2*x)
(bx, by) = (1/2 + x, y)
(cx, cy) = (1/2, y)
plot()
circle(0, 0, r, :black)
plot!([Ax, Bx, Cx, Ax], [Ay, By, Cy, Ay])
plot!([ax, bx, cx, ax], [ay, by, cy, ay])
plot!(-[ax, bx, cx, ax], [ay, by, cy, ay])
if more
hline!([0], color=:black, lw=0.5)
vline!([0], color=:black, lw=0.5)
point(Ax, Ay, " A", :black, :bottom)
point(Bx, By, " B", :black)
point(Cx, Cy, "C ", :black, :right)
point(ax, ay, " a", :black, :bottom)
point(bx, by, " b:(1/2+x, y)", :black)
point(cx, cy, "c", :black, :right)
point(0, y, " y", :black)
point(0, 0, " o", :black)
end
end;
※コメント投稿者のブログIDはブログ作成者のみに通知されます