算額(その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)
※コメント投稿者のブログIDはブログ作成者のみに通知されます