算額(その607)
高山忠直編: 算法評論
国立国会図書館 デジタルコレクション
https://dl.ndl.go.jp/pid/3508431/1/12
直角三角形内に,3 つの頂点が 3 つの辺上にある正方形を入れる。直角三角形の直角を挟む 2 辺の長さ(鈎,股とする)が与えられたとき,正方形の一辺の長さを得る方法を示せ。
辺上の頂点座標を (x1, 0), (0, y2), (x3, y3) とおき,以下の連立方程式を解く。
正方形の大きさは x1 により変わるので,鈎,股,x1 を含む式になる。
この問題は,算額(その491)と基本的に同じである。正方形の大きさは x1 に依存するので,算額(その491)は最小の正方形になるときの x1 を求めるものであった。
include("julia-source.txt");
using SymPy
@syms 鈎, 股, x1, y2, x3, y3, x4, y4
@syms 鈎::positive, 股::positive, x1::positive, y2::positive, x3::positive, y3::positive, x4::positive, y4::positive
x4 = x1 + x3
y4 = y3 - y2
eq1 = x3^2 + (y3 - y2)^2 - (x1^2 + y2^2)
eq2 = -y2/x1 * (y3 - y2)/x3 + 1
eq3 = y3/(股 - x3) - 鈎//股
res = solve([eq1, eq2, eq3], (y2, x3, y3))
2-element Vector{Tuple{Sym, Sym, Sym}}:
(股*(-x1 + 鈎)/(股 + 鈎), 股*(-x1 + 鈎)/(股 + 鈎), 鈎*(x1 + 股)/(股 + 鈎))
(股*(x1 + 鈎)/(股 - 鈎), -股*(x1 + 鈎)/(股 - 鈎), 鈎*(x1 + 股)/(股 - 鈎))
2 組の解が得られるが,最初のものが適解である。
正方形の一辺の長さは sqrt(x1^2 + y2^2) = sqrt(x1^2 + (股*(-x1 + 鈎)/(股 + 鈎))^2) である。
sqrt(x1^2 + (股*(-x1 + 鈎)/(股 + 鈎))^2) |> println
sqrt(x1^2 + 股^2*(-x1 + 鈎)^2/(股 + 鈎)^2)
鈎 = 3,股 = 5, x1 = 1.2 のとき,y2 = 1.125,一辺の長さは sqrt(1.2^2 + 1.125^2) = 1.644878414959598 である。
鈎 = 3
股 = 5
x1 = 1.2
y2 = 股*(-x1 + 鈎)/(股 + 鈎)
y2 |> println
sqrt(x1^2 + (股*(-x1 + 鈎)/(股 + 鈎))^2) |> println
sqrt(1.2^2 + 1.125^2) |> println
1.125
1.644878414959598
1.644878414959598
一辺の長さ = 1.64488; x1 = 1.2; y2 = 1.125; x3 = 1.125; y3 = 2.325; x4 = 2.325; y4 = 1.2
function draw(more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
(鈎, 股) = (3, 5)
x1 = 1.2
(y2, x3, y3) = (股*(-x1 + 鈎)/(股 + 鈎), 股*(-x1 + 鈎)/(股 + 鈎), 鈎*(x1 + 股)/(股 + 鈎))
方面 = sqrt(x1^2 + (股*(-x1 + 鈎)/(股 + 鈎))^2)
x4 = x1 + x3
y4 = y3 - y2
@printf("一辺の長さ = %g; x1 = %g; y2 = %g; x3 = %g; y3 = %g; x4 = %g; y4 = %g\n", 方面, x1, y2, x3, y3, x4, y4)
plot([0, 股, 0, 0], [0, 0, 鈎, 0], color=:black, lw=0.5)
plot!([x1, x4, x3, 0, x1], [0, y4, y3, y2, 0], 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)
end
end;