裏 RjpWiki

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

算額(その1354)

2024年10月15日 | Julia

算額(その1354)

十二 群馬県高崎市石原町 清水寺 安永3年(1774)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:三角形,面積最大化
#Julia, #SymPy, #算額, #和算

三辺が,大斜,中斜,小斜の三角形がある。中斜と中鈎(頂点から大斜へおろした垂線の長さ。三角形の高さ)の和が 126 寸,小斜と中鈎の和が 121 寸のとき,三角形の面積が最大になるときの中鈎はいかほどか。

大斜,中斜,小斜,中鈎,面積をそのまま変数名として,以下の連立方程式を解き,中鈎,大斜,小斜を求める。解は中斜の関数になる。

include("julia-source.txt");

using SymPy
@syms 小斜::positive, 中斜::positive, 大斜::positive,
     中鈎::positive, 面積::positive
eq1 = 中斜 + 中鈎 - 126
eq2 = 小斜 + 中鈎 - 121
eq3 = sqrt(中斜^2 - 中鈎^2) + sqrt(小斜^2 - 中鈎^2) - 大斜
res = solve([eq1, eq2, eq3], (中鈎, 大斜, 小斜))[1]

   (126 - 中斜, 11*sqrt(2*中斜 - 131) + 6*sqrt(7*中斜 - 441), 中斜 - 5)

中鈎と大斜は以下のようになるので,面積は 中鈎*大斜/2 である。

中鈎 = 126 - 中斜
大斜 = 11*sqrt(2*中斜 - 131) + 6*sqrt(7*中斜 - 441)

res[1] |> println
res[2] |> println

   126 - 中斜
   11*sqrt(2*中斜 - 131) + 6*sqrt(7*中斜 - 441)

面積 = (126 - 中斜)*(11*sqrt(2*中斜 - 131) + 6*sqrt(7*中斜 - 441))/2;

面積も中斜の関数になり,下図のように中斜が 80〜90 の間に最大値 3000 程を取る。

pyplot(size=(300, 150), grid=false, aspectratio=:none, label="")
plot(面積, xlims=(60, 126), xlabel="中斜", ylabel="面積")


面積が最大になるときの中斜は,面積の導関数を取り,それが 0 になるときの値を求めればよい。

導関数 = diff(面積, 中斜);

ans_中斜 = solve(導関数, 中斜)[1].evalf()
ans_中斜 |> println

   84.8502093388565

中斜が 84.8502093388565 のときの面積は,2934.69516643686 である。

面積(中斜 => 84.8502093388565) |> println

   2934.69516643686

中鈎は「126 - 中斜」なので,126 - 84.8502093388565 = 41.1497906611435 寸である。

function draw(more)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   中斜 = 84.8502093388565
   (中鈎, 大斜, 小斜) = (126 - 中斜, 11*sqrt(2*中斜 - 131) + 6*sqrt(7*中斜 - 441), 中斜 - 5)
   大斜1 = sqrt(中斜^2 - 中鈎^2)
   plot([0, 大斜, 大斜1, 0], [0, 0, 中鈎, 0], color=:blue, lw=0.5)
   segment(大斜1, 0, 大斜1, 中鈎, :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)
       dimension_line(0, -3, 大斜, -3, "大斜", :blue, :center, delta=-4delta)
       point(大斜1, 中鈎/2, "中鈎", :red, :left, :vcenter, deltax=2delta, mark=false)
       point(大斜1/2, 中鈎/2, "中斜", :blue, :right, :vcenter, mark=false, deltax=-7delta)
       point((大斜1 + 大斜)/2, 中鈎/2, "小斜", :blue, :left, :vcenter, mark=false, deltax=7delta)
       ylims!(-15delta, 中鈎 + 2delta)
   end  
end;

draw(true)


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

コメントを投稿

Julia」カテゴリの最新記事