裏 RjpWiki

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

算額(その1601)

2025年02月08日 | Julia

算額(その1601)

宮城県角田市小田字斗蔵 斗蔵寺 明治42年(1909)
https://tajin.shiriagari.com/framepage5000.htm
    (リンク先の左のインデックスから選択)
キーワード:円5個,最大値
#Julia, #SymPy, #算額, #和算, #数学

交差する大円 2 個の隙間に,中円 1 個,小円 2 個を容れる。大円の直径が 10 寸のとき,小円の直径が最大になるのはどのようなときか,そしてそのときの小円の直径はいかほどか。

大円の半径と中心座標を r1, (r1 - r2, 0)
中円の半径と中心座標を r2, (0, 0)
小円の半径と中心座標を r3, (0, r2 + r3)
とおき,以下の連立方程式を解く。

include("julia-source.txt");
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf

using SymPy
@syms r1, r2, r3
eq = (r1 - r2)^2 + (r2 + r3)^2 - (r1 - r3)^2
res = solve(eq, r3)[1]
res |> println

    r2*(r1 - r2)/(r1 + r2)

r3 は r2 の関数で,r1 が定数として固定されたとき,r3:r2 は下図のような関係にある。

たとえば,r1 が 10/2 のとき,r2 が 2 近辺で,r3 が最大になるようだ。

pyplot(size=(300, 200), grid=false, aspectratio=:none, label="", fontfamily="IPAMincho")
plot(res(r1 => 10/2), xlims=(0, 5), xlabel="r2", ylabel="r3")

最大値を取るときの r2 の値は,関数を微分し,0 になるときの値を求めればよい。

diff(res, r2) |> simplify |> println

    (-r2*(r1 - r2) + (r1 - 2*r2)*(r1 + r2))/(r1 + r2)^2

ans_r2 = solve(diff(res, r2), r2)[1]
ans_r2 |> println

    r1*(-1 + sqrt(2))

r1 = 10/2 のとき,r2 = 2.07106781186548 のとき,導関数は 0 になり,r3 は最大値を取る。

ans_r2(r1 => 10/2) |> println
ans_r2(r1 => 10/2).evalf() |> println

    -5.0 + 5.0*sqrt(2)
    2.07106781186548

r1 = 10/2,r2 = 2.07106781186548 のとき,r3 = 0.857864376269050 が最大値になる。

res(r2 => ans_r2)(r1 => 10/2) |> println
res(r2 => ans_r2)(r1 => 10/2).evalf() |> println

    0.5*sqrt(2)*(-1 + sqrt(2))*(10.0 - 5.0*sqrt(2))
    0.857864376269050

function draw(r1, more=false; r2 = 0)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    r2 == 0 && (r2 = r1*(-1 + sqrt(2)))
    r3 = r2*(r1 - r2)/(r1 + r2)
    str = @sprintf("r1 = %g;; r2 = %.3g;  r3 = %.3g\n", r1, r2, r3)
    p = plot()
    circle2(r1 - r2, 0, r1)
    circle(0, 0, r2, :blue)
    circle22(0, r2 + r3, r3, :green)
    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, r1, str, :black, :center, :bottom, delta=delta/2, mark=false)
    end
    return p
end;

draw(10/2, true)


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

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

Julia」カテゴリの最新記事