算額(その1478)
千葉県印西市 竜湖寺 文久元年(1861)
山根誠司:算法勝負!「江戸の数学」に挑戦,ブルーバックス,講談社,東京都,2015年。
キーワード:折り紙,折り鶴
#Julia, #SymPy, #算額, #和算
折り鶴の羽の横幅と長さの比を求めよ。
折り紙の一辺の長さを a とおく。
一旦折った鶴を開いて,折り目を図に示す。
左上が尾(頭),右上が羽の先端である。羽の横幅は DE,長さは CF である。
y1, y2 は左上の頂点を通り,傾きが -tan(π/4)*(3/8) と -tan(π/4)*(1/4) の直線の y 切片である。
include("julia-source.txt");
using SymPy
@syms a, θ1, θ2, x, y
θ1 = 90*(Sym(3)/8)
eq1 = (y - a) + tand(θ1)*(x + a)
y1 = solve(eq1(x => 0), y)[1] |> simplify
y1 |> println
a*(-2*sqrt(sqrt(2) + 2) + sqrt(2) + sqrt(2*sqrt(2) + 4))
幅 DE は y1*√2 である。
width = y1*sqrt(Sym(2))
width |> println
width(a => 10).evalf() |> println
sqrt(2)*a*(-2*sqrt(sqrt(2) + 2) + sqrt(2) + sqrt(2*sqrt(2) + 4))
4.69266270539641
長さは CF = OF - OA - 2AB である。
θ2 = 90*(Sym(1)/4)
eq2 = (y - a) + tand(θ2)*(x + a)
y2 = solve(eq2(x => 0), y)[1] |> simplify
y2 |> println
a*(2 - sqrt(2))
AB = (y2/2 - y1/2)*sqrt(Sym(2));
OA = y1/2*sqrt(Sym(2));
length = sqrt(Sym(2))*a - OA - 2AB |> simplify
length |> println
a*(-sqrt(2*sqrt(2) + 4) - sqrt(2) + sqrt(sqrt(2) + 2) + 3)
length(a => 10).evalf() |> println
8.20419572896725
ratio = length/width;
@syms d
apart(ratio, d) |> simplify |> println
-sqrt(2*sqrt(2) + 4)/2 + 1/2 + sqrt(2)/2 + sqrt(sqrt(2) + 2)
ratio.evalf() |> println
1.74830288133274
羽根の幅は sqrt(2)*a*(-2*sqrt(sqrt(2) + 2) + sqrt(2) + sqrt(2*sqrt(2) + 4))
羽の長さは a*(-sqrt(2*sqrt(2) + 4) - sqrt(2) + sqrt(sqrt(2) + 2) + 3)
長さ/幅は -sqrt(2*sqrt(2) + 4)/2 + 1/2 + sqrt(2)/2 + sqrt(sqrt(2) + 2)
折り紙の一辺の長さを 10cm とすれば,幅は 4.69266270539641,長さは 8.20419572896725 で,長さは幅の 1.74830288133274 倍である。
function draw(a, more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
θ = 90*(3/8)
y1= a*(-2*sqrt(sqrt(2) + 2) + sqrt(2) + sqrt(2*sqrt(2) + 4))
println("y1 = $y1")
width = sqrt(2*y1^2)
println("width = $width")
y2 = a*(2 - sqrt(2))
plot([a, a, -a, -a, a], [-a, a, a, -a, -a], color=:blue, lw=0.5)
segment(-a, a, 0, y1, :blue)
segment(-a, a, 0, y2, :red)
segment(0, 0, a, a, :gray70)
segment(0, y1, y1, 0, :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, y1, "y1 ", :blue, :right)
point(y1, 0, "y1 ", :blue, :right)
point(0, y2, "y2 ", :red, :right)
point(y2, 0, "y2 ", :red, :right)
point(y1/2, y1/2, "A")
point(y2/2, y2/2, "B")
end
end;
draw(10, true)