裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

算額(その1487)

2024年12月20日 | Julia

算額(その1487)

四十七 岩手県一関市平沢 平沢白山神社 慶応2年(1866)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:二等辺三角形,楕円2個
#Julia, #SymPy, #算額, #和算

二等辺三角形の中に合同な楕円を 2 個容れる。短径が 1 寸のとき,二等辺三角形の高さが最も低くなるときの高さはいかほどか。

これは「算額(その699)」の特別な場合なので,同じように解ける。高さは楕円の長径の関数である。高さの導関数を取り,導関数=0 のときの高さを求めればよい。

二等辺三角形の底辺の長さを 2a,高さを h = a*s3 とする。パラメータとして s3 = h/a を使う。
上にある縦長楕円の長半径,短半径,中心座標を a1, b1, (0, 2b2 + b1)
下にある横長楕円の長半径,短半径,中心座標を a2, b2, (0, b2)
二等辺三角形の右側の斜辺と上の楕円,下の楕円との接点座標を (x1, y1), (x2, y2)
a1 = b2, b1 = a2
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms a1::positive, b1::positive, x1::positive, y1::positive,
     a2::positive, b2::positive, x2::positive, y2::positive
@syms a::positive, s3::positive,  h::positive

b2 = 1//2
(a1, b1) = (b2, a2)
y1 = (a - x1)*s3
y2 = (a - x2)*s3
eq1 = x1^2/a1^2 + (y1 - (2b2 + b1))^2/b1^2 - 1
eq3 = x2^2/a2^2 + (y2 - b2)^2/b2^2 - 1
eq2 = -b1^2*x1/(a1^2*(y1 - (2b2 + b1))) + s3
eq4 = -b2^2*x2/(a2^2*(y2 - b2)) + s3;

res = solve([eq1, eq2, eq3, eq4], (s3, a, x1, x2))[2]  # 2 of 2

    (2*sqrt(4*a2^2 - 2*a2 + 1)/(2*a2 - 1), 2*a2^2/sqrt(4*a2^2 - 2*a2 + 1), sqrt(4*a2^2 - 2*a2 + 1)/(2*(2*a2^2 - a2 + 1)), 4*a2^2*sqrt(4*a2^2 - 2*a2 + 1)/(8*a2^2 - 2*a2 + 1))

# 高さ
h = res[1]*res[2]
h |> println

    4*a2^2/(2*a2 - 1)

高さは楕円の長半径 a2 の関数である。

# 導関数
g = diff(h, a2) |> factor

    8*a2*(a2 - 1)/(2*a2 - 1)^2

pyplot(size=(300, 150), grid=false, aspectratio=:none, label="")
plot(g, xlims=(0.8, 1.2), xlabel="長半径", ylabel="高さの導関数")
hline!([0])
vline!([1])

# 導関数が 0 になるときの長半径
ans_a2 = solve(g, a2)[1]
ans_a2 |> println

    1

pyplot(size=(300, 150), grid=false, aspectratio=:none, label="")
plot(res[1]*res[2], xlims=(0.8, 1.2), ylims=(3.9, 4.2), xlabel="長半径", ylabel="高さ")
hline!([4])
vline!([1])

# 高さの最小値
h(a2 => 1) |> println

    4

高さは楕円の長半径 a2 が 1,すなわち 楕円の長径が 2 のとき最小値 4 になる。

function draw(a2, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    (s3, a, x1, x2) = (2*sqrt(4*a2^2 - 2*a2 + 1)/(2*a2 - 1), 2*a2^2/sqrt(4*a2^2 - 2*a2 + 1), sqrt(4*a2^2 - 2*a2 + 1)/(2*(2*a2^2 - a2 + 1)), 4*a2^2*sqrt(4*a2^2 - 2*a2 + 1)/(8*a2^2 - 2*a2 + 1))
    b2 = 1/2
    (a1, b1) = (b2, a2)
    y1 = (a - x1)*s3
    y2 = (a - x2)*s3
    h = s3*a
    @printf("上楕円の長径 = %g;  上楕円の短径 = %g\n", 2a1, 2b1)
    @printf("下楕円の長径 = %g;  下楕円の短径 = %g\n", 2a2, 2b2)
    @printf("s3 = %g;  a = %g;  h = %g;  a1 = %g;  b1 = %g;  x1 = %g;  y1 = %g;  a2 = %g;  b2 = %g;  x2 = %g;  y2 = %g\n", s3, a, h, a1, b1, x1, y1, a2, b2, x2, y2)
    plot([a, 0, -a, a], [0, a*s3, 0, 0], color=:magenta, lw=0.5)
    ellipse(0, b2, a2, b2, color=:blue)
    ellipse(0, b1 + 2b2, a1, b1, color=:red)
    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, b1 + 2b2, "上楕円:a1,b1\n(0,2b2+b1)", :red, :center, delta=-delta)
        point(0, b2, "下楕円:a2,b2,(0,b2)", :blue, :center, delta=-delta)
        point(x1, y1, " (x1,y1)", :green, :left, :vcenter)
        point(x2, y2, " (x2,y2)", :green, :left, :vcenter)
    end
end;
draw(1, true)


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« はなまるうどん 三条店 | トップ | 算額(その1488) »
最新の画像もっと見る

コメントを投稿

Julia」カテゴリの最新記事