裏 RjpWiki

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

算額(その2013)

2024年08月13日 | Julia

算額(その2013)

(20) 兵庫県青垣町遠坂字後岶 熊野神社 明治18年(1885)
近畿数学史学会:近畿の算額「数学の絵馬を訪ねて」,平成4年5月16日 初版第一刷,大阪教育図書株式会社,大阪市.
キーワード:長方形,直角三角形

長方形の中に曲尺(かねじゃく)を置く。長方形の長辺,短辺が 40 寸,38 寸,短曲(曲尺の短い方)が 10 寸のとき,曲(曲尺の長い方)と長方形の長辺を二辺とする直角三角形の第三の辺(鈎)の長さはいかほどか。

注:曲尺の短曲と曲とのなす角は直角である。

算額(その1198)と基本的に同じ問題である。
https://blog.goo.ne.jp/r-de-r/e/0e430beba5823ce19bc2449c0ff9b448

パラメータはそのまま方程式の変数名とする。
左上にある直角三角形の直角を挟む 2 辺の長さを x,38 -「鈎」,とおき,以下の連立方程式を立てる。
たかが三元連立方程式であるが,「長」,「平」,「短曲」を変数のままにして一度に「鈎」,および「曲」と x を求めることは(SymPy で自動的には)できない。

include("julia-source.txt");

using SymPy

@syms 長::positive, 平::positive, 曲::positive, 短曲::positive, 鈎::positive, x::positive
eq1 = (鈎*長 + x*(平 - 鈎) + 短曲*曲 + 平*(長 - x))/2 - 平*長
eq2 = (平 - 鈎)^2 + x^2 - 短曲^2
eq3 = x/鈎 - (平 - 鈎)/長;
#res = solve([eq1, eq2, eq3], (鈎, 曲, x))

eq3 を x について解き,解を ans_x とおく。

ans_x = solve(eq3, x)[1]
ans_x |> println

   鈎*(平 - 鈎)/長

eq2 の x に ans_x を代入し(式を簡約化して)eq12 とおく。

eq12 = eq2(x => ans_x) |> factor |> numerator
eq12 |> println

   平^2*鈎^2 + 平^2*長^2 - 2*平*鈎^3 - 2*平*鈎*長^2 - 短曲^2*長^2 + 鈎^4 + 鈎^2*長^2

eq12 を「鈎」について解くと,非常に複雑な長い式が得られる。SymPy では簡約化できないが,「長」,「平」,「短曲」を特定すれば,その場合の「鈎」が得られる。

ans_鈎 = solve(eq12, 鈎)[3];  # 3 of 4

「長」,「平」,「短曲」がそれぞれ 40 寸, 38 寸, 10 寸のとき,「鈎」は 30 寸である。

ans_鈎(長 => 40, 平 => 38, 短曲 => 10).evalf() |> println

   30.0000000000000

「鈎」が決まれば,すべての図形要素が逐次的に決定される。

ans_x(鈎 => 30, 長 => 40, 平 => 38) |> println

   6

solve(eq1(長 => 40, 平 => 38, 短曲 => 10, x => 6, 鈎 => 30), 曲)[1] |> println

   50

function draw(more=false)
   pyplot(size=(300, 300), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (長, 平, 短曲) = (40, 38, 10)
   (鈎, x) = (30, 6)
   plot([0, 平, 平, 0, 0], [0, 0, 長, 長, 0], color=:blue, lw=0.5)
   segment(0, 長 -x, 平 - 鈎, 長, :red)
   segment(平 - 鈎, 長, 平, 0, :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(平, 長, " (平,長)", :red, :left, :vcenter)
       dimension_line(平 - 鈎, 長 + 0.5, 平, 長 + 0.5, "鈎", :blue, :center, :bottom, delta=delta)
       dimension_line(-0.5, 長, -0.5, 長 - x, "x ", :blue, :right, :vcenter)
       point((平 - 鈎)/2, 長 - x/2, " 短曲", :red, mark=false)
       point(平 - 鈎/2, 長/2, "  曲", :green, mark=false)
       xlims!(-6delta, 平 + 20delta)
   end
end;

draw(true)


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

コメントを投稿

Julia」カテゴリの最新記事