算額あれこれ

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

算額(その212)改訂版

長野県伊那市羽広 仲仙寺 天保2年(1831)

中村信弥「改訂増補 長野県の算額」県内の算額2(127)
http://www.wasan.jp/zoho/zoho.html
キーワード:円3個,三角形,長方形
#Julia #SymPy #算額 #和算 #数学

長方形の中に三角形を構成する小斜,中斜,大斜の 3 本の斜線を引き各領域に等円 3 個を入れる。小斜が 197 寸,大斜と中斜の差が 167 寸であるとき,等円の径を求めよ。

注:上の図は算額(中村)の図のように,大斜 > 中斜 > 小斜 のものである。しかし,後にわかるが問で述べられた条件に従って描かれる図は全くの別物である。

小斜,中斜,大斜はそのまま変数名とし,大中斜差 = 大斜 - 中斜とする。
長方形の短辺,長辺を \(h, w\),短辺上,長辺上の斜線との交点座標を \( (x, h), (w, y)\)
等円の半径と中心座標を \(r,(r, h - r), (w - r, r), (w - r, h - r)\)
とおき,以下の連立方程式を解く。

#00cc00;">julia-source.txt ソース

using SymPy
@syms w::positive, h::positive, x::positive, y::positive, r::positive,
      大斜::positive, 中斜::positive, 小斜::positive, 大中斜差::positive

# 大斜と中斜の差
eq7 = 大斜 - 中斜 - 大中斜差;

# 左の直角三角形の中の等円
eq4 = x + h - 中斜 - 2r |> expand

# 右上の直角三角形の中の等円
eq2 = (h - y) + (w - x) - 小斜  - 2r |> expand;

既知である変数の「小斜」と「大中斜差」だけを含む方程式を構成する。

以下順に,eq7 を解いて 大斜,eq4 を解いて h,eq2 を解いて 中斜を求める。

ans_大斜 = solve(eq7, 大斜)[1]
@show(ans_大斜)

    ans_大斜 = 中斜 + 大中斜差

    \(\displaystyle 中斜 + 大中斜差\)

ans_h = solve(eq4, h)[1]
@show(ans_h)

    ans_h = 2*r - x + 中斜

    \(\displaystyle 2 r - x + 中斜\)

ans_中斜 = solve(eq2(h => ans_h), 中斜)[1]
@show(ans_中斜)

    ans_中斜 = -w + 2*x + y + 小斜

    \(\displaystyle - w + 2 x + y + 小斜\)

既知となった中斜,大斜,h の順に再定義し,残りの方程式を記述する。

中斜 = -w + 2*x + y + 小斜
大斜 = 中斜 + 大中斜差
h = 2*r - x + 中斜

# 大斜の定義
eq3 = w^2 + y^2 - 大斜^2 |> expand

# 中斜の定義
eq5 = x^2 + h^2 - 中斜^2 |> expand

# 右下の直角三角形の中の等円
eq6 = w + y - 大斜 - 2r |> expand

# 小斜の定義
eq1 = (w - x)^2 + (h - y)^2 - 小斜^2 |> expand;

eq3, eq4, eq5, eq6, eq1 の式中の中斜,大斜,h は再定義された式で置き換えられる。

eq3 |> display
eq5 |> display
eq6 |> display

eq1 |> display

    \(\displaystyle 4 w x + 2 w y + 2 w 大中斜差 + 2 w 小斜 - 4 x^{2} - 4 x y - 4 x 大中斜差 - 4 x 小斜 - 2 y 大中斜差 - 2 y 小斜 - 大中斜差^{2} - 2 大中斜差 小斜 - 小斜^{2}\)

    \(\displaystyle 4 r^{2} - 4 r w + 4 r x + 4 r y + 4 r 小斜 + 2 w x - 2 x^{2} - 2 x y - 2 x 小斜\)

    \(\displaystyle - 2 r + 2 w - 2 x - 大中斜差 - 小斜\)

    \(\displaystyle 4 r^{2} - 4 r w + 4 r x + 4 r 小斜 + 2 w^{2} - 4 w x - 2 w 小斜 + 2 x^{2} + 2 x 小斜\)

eq3, eq5, eq6 を解いて w, x, y を求める。

res = solve([eq3, eq5, eq6], (w, x, y))[2]  # 2 of 2

    ( (20*r^2*sqrt(2*r + 大中斜差 + 小斜) - 8*r*大中斜差*sqrt(2*r + 大中斜差 + 小斜) + 12*r*小斜*sqrt(2*r + 大中斜差 + 小斜) + 2*r*sqrt(72*r^3 - 36*r^2*大中斜差 + 44*r^2*小斜 - 2*r*大中斜差^2 - 4*r*大中斜差*小斜 + 6*r*小斜^2 + 大中斜差^3 - 大中斜差^2*小斜 - 大中斜差*小斜^2 + 小斜^3) - 大中斜差^2*sqrt(2*r + 大中斜差 + 小斜) + 大中斜差*sqrt(72*r^3 - 36*r^2*大中斜差 + 44*r^2*小斜 - 2*r*大中斜差^2 - 4*r*大中斜差*小斜 + 6*r*小斜^2 + 大中斜差^3 - 大中斜差^2*小斜 - 大中斜差*小斜^2 + 小斜^3) + 小斜^2*sqrt(2*r + 大中斜差 + 小斜) + 小斜*sqrt(72*r^3 - 36*r^2*大中斜差 + 44*r^2*小斜 - 2*r*大中斜差^2 - 4*r*大中斜差*小斜 + 6*r*小斜^2 + 大中斜差^3 - 大中斜差^2*小斜 - 大中斜差*小斜^2 + 小斜^3))/(4*(2*r - 大中斜差 + 小斜)*sqrt(2*r + 大中斜差 + 小斜)), (12*r^2*sqrt(2*r + 大中斜差 + 小斜) - 8*r*大中斜差*sqrt(2*r + 大中斜差 + 小斜) + 4*r*小斜*sqrt(2*r + 大中斜差 + 小斜) + 2*r*sqrt(72*r^3 - 36*r^2*大中斜差 + 44*r^2*小斜 - 2*r*大中斜差^2 - 4*r*大中斜差*小斜 + 6*r*小斜^2 + 大中斜差^3 - 大中斜差^2*小斜 - 大中斜差*小斜^2 + 小斜^3) + 大中斜差^2*sqrt(2*r + 大中斜差 + 小斜) + 大中斜差*sqrt(72*r^3 - 36*r^2*大中斜差 + 44*r^2*小斜 - 2*r*大中斜差^2 - 4*r*大中斜差*小斜 + 6*r*小斜^2 + 大中斜差^3 - 大中斜差^2*小斜 - 大中斜差*小斜^2 + 小斜^3) - 小斜^2*sqrt(2*r + 大中斜差 + 小斜) + 小斜*sqrt(72*r^3 - 36*r^2*大中斜差 + 44*r^2*小斜 - 2*r*大中斜差^2 - 4*r*大中斜差*小斜 + 6*r*小斜^2 + 大中斜差^3 - 大中斜差^2*小斜 - 大中斜差*小斜^2 + 小斜^3))/(4*(2*r - 大中斜差 + 小斜)*sqrt(2*r + 大中斜差 + 小斜)), 3*r/2 + 大中斜差/4 - 小斜/4 + sqrt( (2*r - 大中斜差 + 小斜)*(36*r^2 + 4*r*小斜 - 大中斜差^2 + 小斜^2))/(4*sqrt(2*r + 大中斜差 + 小斜)))

eq1 の w, x, y に,求めた解を代入し,新たな式 eq1_2 とする。(思っているより遥かに簡単な式になる)

eq1_2 = eq1(w => res[1], x => res[2], y => res[3]) |> simplify

    \(\displaystyle 2 r^{2} + 2 r 小斜 + \frac{大中斜差^{2}}{2} - \frac{小斜^{2}}{2}\)

eq1_2 を解いて r を求める。

ans_r = solve(eq1_2, r)[2]  # 2 of 2
@show(ans_r)

    ans_r = -小斜/2 + sqrt(-大中斜差^2 + 2*小斜^2)/2

    \(\displaystyle - \frac{小斜}{2} + \frac{\sqrt{- 大中斜差^{2} + 2 小斜^{2}}}{2}\)

直径は \( - 小斜 + \sqrt{ - 大中斜差^{2} + 2 \cdot 小斜^{2}}\) である。

術は \(小斜 \cdot \left( \sqrt{2 - \frac{差^{2}}{小斜^{2}}} - 1 \right)\) で同じ式になる。

術 = (sqrt(2 - (大中斜差/小斜)^2) - 1)*小斜

    \(\displaystyle 小斜 \left(\sqrt{- \frac{大中斜差^{2}}{小斜^{2}} + 2} - 1\right)\)

小斜が 197 寸, 大中斜差が 167 寸のとき,等円の直径は 26 寸である。

ans_r(小斜 => 197, 大中斜差 => 167).evalf() * 2

    \(\displaystyle 26.0\)

術(小斜 => 197, 大中斜差 => 167).evalf()

    \(\displaystyle 26.0\)

なお,解に基づいて描いた図は以下のようになる。
算額(中村)の図とは大きく異なり,「小斜」は一番短い斜線ではない。

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

function draw(小斜, 大中斜差, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    r = -小斜/2 + sqrt(-大中斜差^2 + 2*小斜^2)/2 
    (w, x, y) = ( (20*r^2*sqrt(2*r + 大中斜差 + 小斜) - 8*r*大中斜差*sqrt(2*r + 大中斜差 + 小斜) + 12*r*小斜*sqrt(2*r + 大中斜差 + 小斜) + 2*r*sqrt(72*r^3 - 36*r^2*大中斜差 + 44*r^2*小斜 - 2*r*大中斜差^2 - 4*r*大中斜差*小斜 + 6*r*小斜^2 + 大中斜差^3 - 大中斜差^2*小斜 - 大中斜差*小斜^2 + 小斜^3) - 大中斜差^2*sqrt(2*r + 大中斜差 + 小斜) + 大中斜差*sqrt(72*r^3 - 36*r^2*大中斜差 + 44*r^2*小斜 - 2*r*大中斜差^2 - 4*r*大中斜差*小斜 + 6*r*小斜^2 + 大中斜差^3 - 大中斜差^2*小斜 - 大中斜差*小斜^2 + 小斜^3) + 小斜^2*sqrt(2*r + 大中斜差 + 小斜) + 小斜*sqrt(72*r^3 - 36*r^2*大中斜差 + 44*r^2*小斜 - 2*r*大中斜差^2 - 4*r*大中斜差*小斜 + 6*r*小斜^2 + 大中斜差^3 - 大中斜差^2*小斜 - 大中斜差*小斜^2 + 小斜^3))/(4*(2*r - 大中斜差 + 小斜)*sqrt(2*r + 大中斜差 + 小斜)), (12*r^2*sqrt(2*r + 大中斜差 + 小斜) - 8*r*大中斜差*sqrt(2*r + 大中斜差 + 小斜) + 4*r*小斜*sqrt(2*r + 大中斜差 + 小斜) + 2*r*sqrt(72*r^3 - 36*r^2*大中斜差 + 44*r^2*小斜 - 2*r*大中斜差^2 - 4*r*大中斜差*小斜 + 6*r*小斜^2 + 大中斜差^3 - 大中斜差^2*小斜 - 大中斜差*小斜^2 + 小斜^3) + 大中斜差^2*sqrt(2*r + 大中斜差 + 小斜) + 大中斜差*sqrt(72*r^3 - 36*r^2*大中斜差 + 44*r^2*小斜 - 2*r*大中斜差^2 - 4*r*大中斜差*小斜 + 6*r*小斜^2 + 大中斜差^3 - 大中斜差^2*小斜 - 大中斜差*小斜^2 + 小斜^3) - 小斜^2*sqrt(2*r + 大中斜差 + 小斜) + 小斜*sqrt(72*r^3 - 36*r^2*大中斜差 + 44*r^2*小斜 - 2*r*大中斜差^2 - 4*r*大中斜差*小斜 + 6*r*小斜^2 + 大中斜差^3 - 大中斜差^2*小斜 - 大中斜差*小斜^2 + 小斜^3))/(4*(2*r - 大中斜差 + 小斜)*sqrt(2*r + 大中斜差 + 小斜)), 3*r/2 + 大中斜差/4 - 小斜/4 + sqrt( (2*r - 大中斜差 + 小斜)*(36*r^2 + 4*r*小斜 - 大中斜差^2 + 小斜^2))/(4*sqrt(2*r + 大中斜差 + 小斜)))
    t = sqrt(2*r + 大中斜差 + 小斜)
    u = sqrt(72*r^3 - 36*r^2*大中斜差 + 44*r^2*小斜 - 2*r*大中斜差^2 - 4*r*大中斜差*小斜 + 6*r*小斜^2 + 大中斜差^3 - 大中斜差^2*小斜 - 大中斜差*小斜^2 + 小斜^3)
    v = (2*r - 大中斜差 + 小斜)*t
    w = (20*r^2*t - 8*r*大中斜差*t + 12*r*小斜*t + 2*r*u - 大中斜差^2*t + 大中斜差*u + 小斜^2*t + 小斜*u)/(4*v)
    x = (12*r^2*t - 8*r*大中斜差*t  + 4*r*小斜*t + 2*r*u + 大中斜差^2*t + 大中斜差*u - 小斜^2*t + 小斜*u)/(4*v)
    y = 3*r/2 + 大中斜差/4 - 小斜/4 + sqrt( (2*r - 大中斜差 + 小斜)*(36*r^2 + 4*r*小斜 - 大中斜差^2 + 小斜^2))/(4*t)
    中斜 = -w + 2*x + y + 小斜
    大斜 = 中斜 + 大中斜差
    h = 2*r - x + 中斜
    l = 大斜
    m = 中斜
    @printf("w = %.5f;  h = %.5f;  x = %.5f;  y = %.5f;  l = %.5f;  m = %.5f\n", w, h, x, y, l, m)
    @printf("大斜 = %g;  中斜 = %g;  小斜 = %g;  大中斜差 = %g\n", 大斜, 中斜, 小斜, 大中斜差)
    @printf("等円半径 = r = %.5f;  等円直径 = %.5f;  \n", r, 2r)
    plot([0, w, w, 0, 0], [0, 0, h, h, 0], color=:black, lwd=0.5)
    circle(r, h - r, r, :blue)
    circle(w - r, r, r, :blue)
    circle(w - r, h - r, r, :blue)
    plot!([0, w, x, 0], [0, y, h, 0, 0], color=:orange, lwd=0.5)
    if more == true
        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(r, h-r, "等円:r,(r,h-r)", :blue, :center, delta=-delta)
        point(w - r, h - r, "等円:r,(w-r,h-r)", :blue, :center, delta=-delta)
        point(w - r, r, "等円:r,(w-r,r)", :blue, :center, delta=-delta)
        point(x, h, " (x,h)", :blue, :left, :bottom)
        point(w, y, " y", :blue, :left, :bottom)
        point(w, 0, " w", :blue, :left, :bottom)
        point(0, h, " h", :blue, :left, :bottom)
        point( (x + w)/2, (h + y)/2, "小斜", :center, :vcenter, mark=false)
        point(x/2, h/2, "中斜", :center, :vcenter, mark=false)
        point(w/2, y/2, "大斜", :center, :vcenter, mark=false)
    end
end;

draw(197, 167, true)

draw(35, 12.1, true)


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