裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

算額(その607)

2024年01月03日 | Julia

算額(その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;


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 算額(その606) | トップ | 算額(その608) »
最新の画像もっと見る

コメントを投稿

Julia」カテゴリの最新記事