算額あれこれ

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

算額(その1792)

岐阜県大垣市西外側町 大垣八幡神社(大垣八幡宮) 天保年間

http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF
キーワード:正方形,斜線
#Julia #SymPy #算額 #和算 #数学


正方形の各頂点を通り平行な 2 組の直線を引き,区分された面積を青赤に塗り分ける。赤の面積を最大にせよ。


正方形の一辺の長さを \(a\)
右下の頂点\( (a,\ 0)\) を通る直線と正方形の一辺の交点座標を\( (0,\ b)\) とおく。

2 直線の交点座標\( (x,\ y)\)は,julia-source.txt で定義している intersection 関数により求められる。

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

using SymPy
@syms a, b
(x, y) = intersection(0, 0, b, a, 0, b, a, 0)

    (a*b^2/(a^2 + b^2), a^2*b/(a^2 + b^2))

赤で塗り分けられた 4 個の台形は合同である。

また,多角形の面積は頂点座標の配列を julia-source.txt で定義している intersection 関数に与えることにより求められる。

左下の赤い台形の頂点座標(反時計回り)は以下のようになる。

xy = [
    0 0
    x y
    (a - y) x
    (a - b) 0
]

 \(\displaystyle \left[\begin{smallmatrix}0 & 0\\\frac{a b^{2}}{a^{2} + b^{2}} & \frac{a^{2} b}{a^{2} + b^{2}}\\- \frac{a^{2} b}{a^{2} + b^{2}} + a & \frac{a b^{2}}{a^{2} + b^{2}}\\a - b & 0\end{smallmatrix}\right]\)

赤い台形 4 個の面積は以下のようになる。

S = 4area(xy) |> simplify

 \(\displaystyle \frac{2 a b \left(a^{2} - b^{2}\right)}{a^{2} + b^{2}}\)

\(a = 1\) のとき,\(S\) は

pyplot(size=(300, 200), grid=false, aspectratio=:none, label="", fontfamily="IPAMincho", dpi=75)
plot(S(a => 1), xlims=(0, 1), xlabel="b", ylabel="S")


\(b = 0.5 a\) 前後で \(S\) は最大値 \(0.6a^2\) 前後になるようだ。

正確に求めるには,\(S\) を \(b\) で微分し,

g = diff(S, b)

 \(\displaystyle - \frac{4 a b^{2} \left(a^{2} - b^{2}\right)}{\left(a^{2} + b^{2}\right)^{2}} - \frac{4 a b^{2}}{a^{2} + b^{2}} + \frac{2 a \left(a^{2} - b^{2}\right)}{a^{2} + b^{2}}\)

\(g = 0\) となる \(b\) を求める。

ans_b = solve(g, b)[2]

 \(\displaystyle a \sqrt{-2 + \sqrt{5}}\)

ans_b(a => 1).evalf() |> println

    0.485868271756646

\(b = 0.485868271756646\) のとき,\(S\) が最大になる。
最大値は \(S\) に \(b = ans_b\) を代入すれば求まる。

s = S(b => ans_b) |> simplify

 \(\displaystyle - a^{2} \sqrt{-2 + \sqrt{5}} + \sqrt{5} a^{2} \sqrt{-2 + \sqrt{5}}\)

\(s\) は SymPy ではこれ以上簡約化できないが,手作業で以下のように簡約化する。

\(s = a^2\sqrt{\sqrt{5} - 2}(\sqrt{5} - 1)\)

\(s = a^2\sqrt{(\sqrt{5} - 2)(\sqrt{5} - 1)^2}\)

\( (\sqrt{5} - 2)(\sqrt{5} - 1)^2 = 10\sqrt{5} - 22\) ゆえ

(√Sym(5) - 2)*(√Sym(5) - 1)^2 |> expand

 \(\displaystyle -22 + 10 \sqrt{5}\)

赤の面積の最大値はこの平方根を取ったものである。

s = (√Sym(5) - 2)*(√Sym(5) - 1)^2 |> expand |> sqrt |> x -> a^2*x

 \(\displaystyle a^{2} \sqrt{10 \sqrt{5} - 22}\)

s.evalf()

 \(\displaystyle 0.600566212001556 a^{2}\)

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

function draw(a, b, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho", dpi=500)
    (x, y) = (a*b^2/(a^2 + b^2), a^2*b/(a^2 + b^2))
    plot([0, a, a, 0, 0], [0, 0, a, a, 0], color=:black, lw=0.5, seriestype=:shape, fillcolor=:dodgerblue)
    plot!([0, a - b, a - y, x, 0], [0, 0, x, y, 0], color=:black, lw=0.5, seriestype=:shape, fillcolor=:deeppink)
    plot!([0, 0, x, y, 0], [a, b, y, a - x, a], color=:black, lw=0.5, seriestype=:shape, fillcolor=:deeppink)
    plot!([a, b, y, a-x, a], [a, a, a - x, a - y, a], color=:black, lw=0.5, seriestype=:shape, fillcolor=:deeppink)
    plot!([a, a, a - x, a  - y, a], [0, a - b, a - y, x, 0], color=:black, lw=0.5, seriestype=:shape, fillcolor=:deeppink)
    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, 0, "(0,0)", :black, :center, delta=-delta)
        point(a, 0, "(a,0)", :black, :center, delta=-delta)
        point(0, b, "(0,b)", :black, :right, :vcenter, deltax=-delta/2)
        point(x, y, " (x,y)", :black, :left, :vcenter)
        point(b, a, " (b,a)", :black, :center, :bottom, delta=delta)
        point(a - y, x, " (a-y,x)", :black, :left, :vcenter)
        plot!(xlims=(-8delta, a + 3delta), ylims=(-5delta, a + 2delta))
    end
end;

draw(1, 0.48, true)


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