算額(その1638)
長野県埴科郡坂城町 諏訪社 文化2年(1805)
中村信弥「改訂増補長野県の算額」県内の算額1(78)
http://www.wasan.jp/zoho/zoho.html
長方形の中に円を容れる。長方形の長辺,短辺を「長」,「平」,円によって切り取られる対角線の部分を「帯弦」と呼ぶ。長が 185 寸,平が 80 寸のとき,帯弦を求める術を述べよ。
対角線と円の交点座標を (x1, y1), (x2, y2) とおき,以下の連立方程式を解く。
帯弦は sqrt((x1 - x2)^2 + (y1 - y2)^2) である。
include("julia-source.txt");
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf
using SymPy
@syms 長::positive, 平::positive, 帯弦::positive,
x1::positive, y1::positive, x2::positive, y2::positive
eq1 = y1/(長 - x1) - 平/長
eq2 = y2/(長 - x2) - 平/長
eq3 = (x1 - (長 - 平/2))^2 + (y1 - 平/2)^2 - (平/2)^2
eq4 = (x2 - (長 - 平/2))^2 + (y2 - 平/2)^2 - (平/2)^2
eq5 = sqrt((x1 - x2)^2 + (y1 - y2)^2) - 帯弦
res = solve([eq1, eq2, eq3, eq4, eq5], (帯弦, x1, y1, x2, y2))[2] # 2 of 2
(sqrt(2)*平^(3/2)*sqrt(長)/sqrt(平^2 + 長^2), (sqrt(2)*平^(3/2)*長^(3/2) + 平^2*長 - 平*長^2 + 2*長^3)/(2*(平^2 + 長^2)), (-sqrt(2)*平^(5/2)*sqrt(長) + 平^2*(平 + 長))/(2*(平^2 + 長^2)), (-sqrt(2)*平^(3/2)*長^(3/2) + 平^2*長 - 平*長^2 + 2*長^3)/(2*(平^2 + 長^2)), (sqrt(2)*平^(5/2)*sqrt(長) + 平^2*(平 + 長))/(2*(平^2 + 長^2)))
帯弦は sqrt(2)*平^(3/2)*sqrt(長)/sqrt(平^2 + 長^2) である。
res[1] |> println
sqrt(2)*平^(3/2)*sqrt(長)/sqrt(平^2 + 長^2)
長が 185 寸,平が 80 寸のとき,帯弦は 68.2871764062511 寸である。
res[1](長 => 185, 平 => 80).evalf() |> println
68.2871764062511
術は 平*sqrt(2長*平/(長^2 + 平^2)) といっているので上で得た数式に一致する。
(平*sqrt(2長*平/(長^2 + 平^2)))(長 => 185, 平 => 80).evalf() |> println
68.2871764062511
しかし,答では 68 + 179/625 = 68.2864 と,近似値としては精度の低い値を示している。
書き間違いではないようだ。
function draw(長, 平, more)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
(帯弦, x1, y1, x2, y2) = (sqrt(2)*平^(3/2)*sqrt(長)/sqrt(平^2 + 長^2), (sqrt(2)*平^(3/2)*長^(3/2) + 平^2*長 - 平*長^2 + 2*長^3)/(2*(平^2 + 長^2)), (-sqrt(2)*平^(5/2)*sqrt(長) + 平^2*(平 + 長))/(2*(平^2 + 長^2)), (-sqrt(2)*平^(3/2)*長^(3/2) + 平^2*長 - 平*長^2 + 2*長^3)/(2*(平^2 + 長^2)), (sqrt(2)*平^(5/2)*sqrt(長) + 平^2*(平 + 長))/(2*(平^2 + 長^2)))
println((帯弦, x1, y1, x2, y2))
plot([0, 長, 長, 0, 0], [0, 0, 平, 平, 0], color=:green, lw=0.5)
circle(長 - 平/2, 平/2, 平/2)
segment(0, 平, 長, 0, :blue)
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(x1, y1, x2, y2, "帯弦", :black, :left, :bottom, delta=delta, length=7, dx=1, dy=2)
point(x1, y1, "(x1,y1)", :blue, :right, :vcenter, deltax=-3delta)
point(x2, y2, "(x2,y2)", :blue, :right, :vcenter, deltax=-3delta)
point(長, 平, "(長,平)", :green, :right, :bottom, delta=delta)
end
end;
draw(185, 80, true)