以下の内容はhttps://sangaku0418.hatenablog.com/entry/2024/07/25/155108より取得しました。


和算の心(その005)

三角形に内接する楕円 -- 算法助術の公式97

1. 不等辺三角形の場合

不等辺三角形の場合について一般解が示されている。
和算の慣例として,楕円の長軸(長径),短軸(短径)を p, q としているが,ここでは長半径,短半径を使用することにする。

include("julia-source.txt");

@syms a, b, c, h, p, q
eq97 = -(b^2 - c^2)^2*h*q^2 + (b^2 - c^2)^2*q^3 + a^4*h*(2h - q)^2 - a^4*q*(2h - q)^2 - a^2*h*p^2*(2h - q)^2
eq97 = eq97(q => 2q, p => 2p)
eq_97 = eq97/4 |> simplify
eq_97 |> println

   a^4*h*(h - q)^2 - 2*a^4*q*(h - q)^2 - 4*a^2*h*p^2*(h - q)^2 - h*q^2*(b^2 - c^2)^2 + 2*q^3*(b^2 - c^2)^2

2. 二等辺三角形の場合

b = c の場合は,簡単になる。

eq97_2 = eq97(c => b) |> factor
eq97_2 |> println

   -4*a^2*(-h + q)^2*(-a^2*h + 2*a^2*q + 4*h*p^2)

更に a ≠ 0, h ≠ q なので非常に簡単な式になる。

eq97_3 = eq97_2/(4a^2*(q - h)^2)
eq97_3 |> println

   a^2*h - 2*a^2*q - 4*h*p^2

2.1. a, h, q を与えて p を知るとき

res_p = solve(eq97_3, p)[2]
res_p |> println

   a*sqrt( (h - 2*q)/h)/2

a = 5; h = 4; q = 1 のとき

ans_p = res_p(a => 5, h => 4, q => 1)
ans_p |> println
ans_p.evalf() |> println

   5*sqrt(2)/4
   1.76776695296637

2.2. a, h, p を与えて q を知るとき

res_q = solve(eq97_3, q)[1]
res_q |> println

   h/2 - 2*h*p^2/a^2

a = 5; h = 4; q = 2 のとき

ans_q = res_q(a => 5, h => 4, p => 2)
ans_q |> println
ans_q.evalf() |> println

   18/25
   0.720000000000000

3. 関数として定義する

function formula97(a, h; p=0, q = 0)
   p == 0 && q == 0 && return "error"
   p != 0 && return h/2 - 2h*p^2/a^2
   q != 0 && return a*sqrt( (h - 2q)/h)/2
end;

formula97(5, 4, p=1)

   1.68

formula97(5, 4, q=1)

   1.7677669529663689

formula97(5, 4)

   "error"

4. 図を描いて確かめる

function draw(a, h, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   plot([0, a, a/2, 0], [0, 0, h, 0], color=:blue, lw=0.5)
   delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
   q = 1
   p = formula97(a, h, q=1)
   @printf("p = %g;  q = %g\n", p, q)
   point(a/2, q, @sprintf("長半径 = %g\n短半径 = %g", p, q), :green, :center, delta=-delta/2)
   ellipse(a/2, q, p, q, color=:green)

   p = 1
   q = formula97(a, h, p=1)
   @printf("p = %g;  q = %g\n", p, q)
   point(a/2, q, @sprintf("長半径 = %g\n短半径 = %g", p, q), :red, :center, delta=-delta/2)
   ellipse(a/2, q, p, q, color=:red)
   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)
   end
end;




以上の内容はhttps://sangaku0418.hatenablog.com/entry/2024/07/25/155108より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14