算額あれこれ

算額問題をコンピュータで解きます

算額(その1751)

千葉県成田市 成田山新勝寺 明治30年(1897)

「算額」第三集 全国調査,香川県算額研究会.(香川県立図書館蔵)
キーワード:楕円,正方形,対角線
#Julia #SymPy #算額 #和算 #数学


正方形の中に対角線を引き,楕円 4 個を容れる。楕円の長径が 3 寸のとき,正方形の一辺の長さはいかほどか。


正方形の一辺の長さを a,楕円の長径,短径を P,Q とおく。
楕円は等辺が a/2 の直角二等辺三角形に内接するものである。
算法助術の公式97が適用できるが,問に示された「楕円の長径が 3 寸」という条件だけでは,条件不足である。

include("julia-source.txt");  # julia-source.txt ソース

using SymPy
@syms a, A, B, C, H, P, Q;

eq97 = -(B^2 - C^2)^2*H*Q^2 + (B^2 - C^2)^2*Q^3 + A^4*H*(2H - Q)^2 - A^4*Q*(2H - Q)^2 - A^2*H*P^2*(2H - Q)^2
eq = eq97(A => a, B => a/√Sym(2), C => a/√Sym(2), H => a/2)

 \(\displaystyle - \frac{P^{2} a^{3} \left(- Q + a\right)^{2}}{2} - Q a^{4} \left(- Q + a\right)^{2} + \frac{a^{5} \left(- Q + a\right)^{2}}{2}\)

方程式 eq を解いて a を得るには,P および Q が既知でなければならない。

a = solve(eq, a)[4]
@show(a)

    a = Q + sqrt(P^2 + Q^2)

 \(\displaystyle Q + \sqrt{P^{2} + Q^{2}}\)

逆に言えば,\(a = Q + \sqrt{P^2 + Q^2}\) なので,\(P = 3\) だけでは \(Q\) はどんな値でも取ることができ,それぞれにおいて \(a\) も様々な値になる。


なお,「答」で「方が 3.62 寸」になるのは,P = 3, Q = 0.566906077348066 のときである。

(solve(eq, Q)[2])(P => 3, a => 3.62) |> println

    (a^2 - 9)/(2*a)

描画関数プログラムのソースを見る

function draw(P, Q, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho",
        fg_color_border=:gray50, fg_color_text=:gray50, fg_color_axis=:gray50)
    a = Q + sqrt(P^2 + Q^2)
    ah = a/2
    p = P/2
    q = Q/2
    plt = plot([a, a, -a, -a, a]./2, [-a, a, a, -a, -a]./2, color=:green, lw=0.5)
    segment(ah, ah, -ah, -ah)
    segment(-ah, ah, ah, -ah)
    ellipse(ah - q, 0, q, p, color=:red)
    ellipse(q - ah, 0, q, p, color=:red)
    ellipse(0, ah - q, p, q, color=:red)
    ellipse(0, q - ah, p, q, color=:red)
    point(0, ah - q, @sprintf("長径 = %g, 短径 = %g\n方面 = %g", P, Q, a),
        :black, :center, :vcenter, mark=false)
    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(ah, ah, "(a/2,a/2)", :green, :right, :bottom, delta=delta)
    end
    return plt
end;

plt1 = draw(3, 1, false)
plt2 = draw(3, 2, false)
plt3 = draw(3, 3, false)
plt4 = draw(3, 4, false)
plot(plt1, plt2, plt3, plt4)


以下のアイコンをクリックして応援してください