算額(その337)
和算で遊ぼう!! 「三春まちなか寺子屋」2017レポート
https://miharukoma.com/wp-content/uploads/2018/01/%E4%B8%89%E6%98%A5%E3%81%BE%E3%81%A1%E3%81%AA%E3%81%8B%E5%AF%BA%E5%AD%90%E5%B1%8B2017%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88.pdf
1月 龍穏院
長方形に三角形を内接させると,図のように甲,乙,丙の直角三角形ができる。長方形の面積が 16歩,甲と乙の面積がそれぞれ 4歩,2歩のとき,三角形の面積を求めよ。
中学レベルだと長方形の面積(直)から甲,乙,丙の3個の直角三角形の面積を引いた残りが求める三角形の面積とするであろう。
図のように,横 = a,縦 = b の長方形があり,c, d が横,縦を区分するとき,以下のようになる。
include("julia-source.txt");
using SymPy
@syms a, b, c, d, 甲, 乙, 丙, 直, 三角
直 = a*b
甲 = a*d/2
乙 = b*c/2
丙 = (a - c)*(b - d)/2;
三角 = 直 - 甲 - 乙 - 丙 |> expand;
これを SymPy で簡約化すると,a*b/2 - c*d/2 になる。見慣れない式になるが,図のように等積変形を行うと,このような式になる。
三角 = 直 - 甲 - 乙 - 丙
⊿ODF = □OAEB - ⊿OAD - ⊿OBF - ⊿DEF
= □OAEB - ⊿OAD - ⊿OBX - ⊿DEX
= ⊿BEX
= a*(b - x)/2
= a*(b - c*d/a)/2
= (a*b - a*c*d/a)/2
= a*b/2 - c*d/2
= a*b/2 - (2乙/b)*(2甲/a)/2
= 直/2 - 2甲*乙/直
三角 |> println
a*b/2 - c*d/2
更に,甲,乙の面積の計算式から c, d を代入すると,以下のようになる。
直/2 - (2甲/a)*(2乙/b)/2 |> expand |> println
a*b/2 - c*d/2
整理すると算額の術に書かれている式になる。
直/2 - 2甲*乙/直
直,甲,乙だけを用いるトリッキーな式であるが,実際には適用しにくい(甲,乙,丙のどれを使ってもよいのでないのは明らかだが)。最初に述べた中学レベルの解法のほうが間違いもない。
直/2 - 2甲*乙/直 |> expand |> println
a*b/2 - c*d/2
s(直, 甲, 乙) = 直/2 - 2甲*乙/直; # 関数定義
s(16, 4, 2)
7.0
using Plots
function polygon(xys, color=:blue; lw=0.5, alpha=0.2, fill=false)
(x, y) = ([], [])
for xy in xys
append!(x, xy[1])
append!(y, xy[2])
end
append!(x, x[1])
append!(y, y[1])
if fill
plot!(x, y, linecolor=color, lw=lw, seriestype=:shape, fillcolor=color, alpha=alpha)
else
plot!(x, y, color=color, lw=lw)
end
end;
function draw(more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
(a, b, c, d) = (7, 5, 2, 3)
#(a, b, c, d) = (8, 2, 2, 1)
x = d/a * c
plot()
rect(0, 0, a, b, :black, fill=false)
polygon([(0, 0), (a, 0), (a, d)], :cadetblue4, alpha=0.8, fill=true) # 甲
polygon([(0, 0), (c, b), (0, b)], :chocolate1, alpha=0.8, fill=true) # 乙
polygon([(0, 0), (c, x), (0, b)], :chocolate1, alpha=0.8, fill=true) # 乙
polygon([(a, d), (a, b), (c, b)], :coral3, alpha=0.8, fill=true) # 丙
polygon([(a, d), (a, b), (c, x)], :coral3, alpha=0.8, fill=true) # 丙
polygon([(0, 0), (c, b), (a, d)], :blue4, alpha=0.3, fill=false) # 三角
segment(c, 0, c, b, :red, linestyle=:dash)
if more
annotate!([
(0, 0, ("O ", 10, :right, :top)),
(a, 0, (" A:a", 10, :left, :top)),
(0, b, ("B:b ", 10, :right, :bottom)),
(a, b, (" E:(a,b)", 10, :bottom)),
(a, d, (" D:d", 10, :left)),
(c, 0, (" C:c", 10, :left, :top)),
(c, b, ("F", 10, :bottom)),
(c, x, (" X:(c,x), x=c*d/a", 10, :white, :left, :top)),
(4a/5, d/2, ("甲")),
(0.5, b/2, ("乙")),
(a - 1, (b+d)/2, ("丙"))
])
vline!([0], color=:black, lw=0.5)
hline!([0], color=:black, lw=0.5)
plot!(xlims=(-0.8, a + 0.5), ylims=(-0.5, b + 0.5))
else
plot!(showaxis=false)
end
end;