算額(その491)
新潟県長岡市七日市 諏訪神社 嘉永2年(18499)
http://www.wasan.jp/niigata/niigatasuwa.html
みしま観光協会:和算の里みしま,2020/3
https://e-mishima.info/wp-content/uploads/2020/02/74a075f30cb806eef4a9a25c4a71608e.pdf
鈎股弦内に正方形が入っている。正方形の3つの頂点は三辺の上にある。鈎,股の長さが与えられたとき,正方形の面積が最小になるのはどのようなときか。
鈎股弦の辺の長さを鈎,股とする。
正方形の頂点の座標を下,右,上,左の順に (x1, 0), (0, y2), (x3, y3), (x1 + x3, y3 - y2) として以下の連立方程式を解く。
include("julia-source.txt");
using SymPy
@syms x1::positive, y2::positive, x3::positive, y3::positive,
a, 鈎::positive, 股::positive, 弦::positive;
eq1 = x1^2 + y2^2 - a^2
eq2 = x3^2 + (y3 - y2)^2 - a^2
eq3 = -y2/x1 * (y3 - y2)/x3 + 1
eq4 = (鈎 - y3)/x3 - 鈎//股
eq5 = y3/(股 - x3) - 鈎//股
res = solve([eq1, eq2, eq3, eq5], (a, y2, x3, y3))
4-element Vector{NTuple{4, Sym}}:
(-sqrt(2*x1^2*股^2 - 2*x1^2*股*鈎 + x1^2*鈎^2 + 2*x1*股^2*鈎 + 股^2*鈎^2)/(股 - 鈎), 股*(x1 + 鈎)/(股 - 鈎), -股*(x1 + 鈎)/(股 - 鈎), 鈎*(x1 + 股)/(股 - 鈎))
(sqrt(2*x1^2*股^2 - 2*x1^2*股*鈎 + x1^2*鈎^2 + 2*x1*股^2*鈎 + 股^2*鈎^2)/(股 - 鈎), 股*(x1 + 鈎)/(股 - 鈎), -股*(x1 + 鈎)/(股 - 鈎), 鈎*(x1 + 股)/(股 - 鈎))
(-sqrt(2*x1^2*股^2 + 2*x1^2*股*鈎 + x1^2*鈎^2 - 2*x1*股^2*鈎 + 股^2*鈎^2)/(股 + 鈎), 股*(-x1 + 鈎)/(股 + 鈎), 股*(-x1 + 鈎)/(股 + 鈎), 鈎*(x1 + 股)/(股 + 鈎))
(sqrt(2*x1^2*股^2 + 2*x1^2*股*鈎 + x1^2*鈎^2 - 2*x1*股^2*鈎 + 股^2*鈎^2)/(股 + 鈎), 股*(-x1 + 鈎)/(股 + 鈎), 股*(-x1 + 鈎)/(股 + 鈎), 鈎*(x1 + 股)/(股 + 鈎))
解は 4 組得られるが,最後のものが適解である。
a, y2, x3, y3 は x1, 鈎, 股 を含む式で表される。鈎,股は対象とする鈎股弦により決まるので,本質的に未知数なのは x1 である。
a = sqrt(2*x1^2*股^2 + 2*x1^2*股*鈎 + x1^2*鈎^2 - 2*x1*股^2*鈎 + 股^2*鈎^2)/(股 + 鈎) である。
(鈎, 股) = (3, 4) のとき,x1 を横軸,a = f(x1) を縦軸にしてグラフを描くと,x1 が 0.75 前後のときに a が最小になるのがわかる。
(鈎, 股) = (3, 4)
f = sqrt(2*x1^2*股^2 + 2*x1^2*股*鈎 + x1^2*鈎^2 - 2*x1*股^2*鈎 + 股^2*鈎^2)/(股 + 鈎)
plot(f, xlims=(0, 2), xlabel="x1", ylabel="f")
res2 = solve(diff(f, x1))[1]
res2 |> N |> println
res2.evalf() |> println
48//65
0.738461538461539
x1 = 48//65 のときの a を求める。
f(x1 => 48//65) |> println
f(x1 => 48//65).evalf() |> println
12*sqrt(65)/65
1.48841681507050
鈎 = 3,股 = 4 のときには,x1 = 0.738462; y2 = 1.29231; x3 = 1.29231; y3 = 2.03077 のとき,正方形の一辺の長さが最小値 12*sqrt(65)/65 = 1.48841681507050 になる。
using Plots
function draw(more)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
(鈎, 股) = (3, 4)
x1 = res2
(a, y2, x3, y3) = (sqrt(2*x1^2*股^2 + 2*x1^2*股*鈎 + x1^2*鈎^2 - 2*x1*股^2*鈎 + 股^2*鈎^2)/(股 + 鈎), 股*(-x1 + 鈎)/(股 + 鈎), 股*(-x1 + 鈎)/(股 + 鈎), 鈎*(x1 + 股)/(股 + 鈎))
@printf("a = %g; x1 = %g; y2 = %g; x3 = %g; y3 = %g\n", a, x1, y2, x3, y3)
plot([0, 股, 0, 0], [0, 0, 鈎, 0], color=:red, lw=0.5)
plot!([0, x1, x1 + x3, x3, 0], [y2, 0, y3 - y2, y3, y2], color=:blue, lw=0.5)
if more
delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3 # size[2] * fontsize * 2
hline!([0], color=:black, lw=0.5)
vline!([0], color=:black, lw=0.5)
point(x1, 0, "x1 ", :blue, :right, :bottom, delta=delta)
point(x1 + x3, y3 - y2, " (x1+x3,y3-y2)", :blue, :left, :vcenter)
point(x3, y3, " (x3,y3)", :blue, :left, :vcenter)
point(0, y2, " y2", :blue, :left, :vcenter)
point(0, 鈎, " 鈎", :red, :left, :vcenter)
point(股, 0, "股", :red, :center, :bottom, delta=2delta)
else
plot!(showaxis=false)
end
end;