裏 RjpWiki

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

算額(その1151)

2024年07月16日 | Julia

算額(その1151)

七八 加須市大字外野 棘脱地蔵堂 明治9年(1876)
埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.
キーワード:円7個,最大値

交差する 2 個の大円の交差部分に中円 1 個,小円 2 個を容れる。大円の直径が 3.5 寸のとき,小円の最大直径はいかほどか。

注:交差する部分が小さければ小円も小さい。交差部分が大きくなるに連れ小円も大きくなるが,ある点をすぎれば逆に小さくなる。なお,図には大円の内部にもう一個(二個)の円があるがそれは交差部分の大きさに連動するので解を得るには無関係である。

大円の半径と中心座標を r1, (0, r2)
中円の半径と中心座標を r3, (0, 0)
小円の半径と中心座標を r4, (r3 + r4, 0)
とおく。
ただし,今回の方程式 eq1 は,大円,中円,小円の中心が構成する直角三角形におけるピタゴラスの定理である。
大円の交差の程度は中円の半径 r3 により評価される。小円の半径は中円の半径により決まる。
eq1 を解いて r3 から r4 を求める式を得る。これを関数 f とする。r4 = f(x3)。

include("julia-source.txt")

using SymPy

@syms r1::positive, x1::positive, r2::positive, r3::positive, r4::positive
r1 = 35//20
eq1 = (r1 - r3)^2 + (r3 + r4)^2 - (r1 - r4)^2
f = solve(eq1, r4)[1]

using Plots
pyplot(size=(500, 200), grid=false, aspectratio=:none, label="")
plot(f, xlims=(0, 3.5/2), xlabel="r3", ylabel="r4")

図を描いてみると,r3 が 0.7 近辺で r4 が最大になるのがわかる。
r4 が最大になるときの r3 を求めるには,f の導関数 g を求め g(r3) = 0 を解けばよい。

g = diff(f, r3) |> simplify
g |> println

   (-16*r3^2 - 56*r3 + 49)/(16*r3^2 + 56*r3 + 49)

ans_r3 = solve(g, r3)[1] |> factor
ans_r3 |> println
ans_r3.evalf() |> println

   7*(-1 + sqrt(2))/4
   0.724873734152916

g(r3) = 0 の解 ans_r3 により f(ans_r3) がr4 の最大値である。

res = 2*f(ans_r3) |> simplify
res |> println
res.evalf() |> println

   21/2 - 7*sqrt(2)
   0.600505063388335

21/2 - 7*sqrt(2) は x1 = 3.5/2 のときの解なので,3.5/2 で割ってやれば一般解になる。直径を一般解とするなら 3.5 で割ればよい。

@syms r1
res/(35//10)*r1 |> println

   r1*(3 - 2*sqrt(2))

最大時の小円の直径は大円の直径の (3 - 2√2) 倍である。
大円の直径が 3.5 寸 のとき,小円の直径は 3.5*(3 - 2√2) = 0.600505063388334 寸である。

function draw(r1, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r3 = 7*(-1 + sqrt(2))/4
   r2 = r1 - r3
   r4 = r1*(3 - 2*sqrt(2))
   #@printf("正方形の一辺の長さが %g,大円の直径が %g のとき,小円の直径は %g である。\n", a, 2r1, 2r2)
   plot()
   circle22(0, r2, r1)
   circle22(0, r2 + r1 - r2, r2, :blue)
   circle(0, 0, r3, :green)
   circle2(r3 + r4, 0, r4, :magenta)
   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, r2, "大円:r1,(0,r2)", :red, :center, :bottom, delta=delta/2)
       point(0, r1, "", :blue)
       point(0, 0, "中円:r3,(0,0)", :green, :center, :bottom, delta=delta/2)
       point(r3 + r4, 0, "小円:r4,(r3+r4,0)", :black, :center, delta=-delta/2)
   end
end;


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

コメントを投稿

Julia」カテゴリの最新記事