裏 RjpWiki

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

算額(その1216)

2024年08月14日 | Julia

算額(その1216)

(19) 兵庫県姫路市広峯山 広峰神社 明治18年(1885)
近畿数学史学会:近畿の算額「数学の絵馬を訪ねて」,平成4年5月16日 初版第一刷,大阪教育図書株式会社,大阪市.
キーワード:円4個,楕円

楕円の中に,甲円 4 個,乙円 2 個を容れる。楕円の長径と短径が与えられたとき,甲円の直径はいかほどか。

注:甲円,乙円,楕円は共通接点で接する。
楕円に内接する 2 個の等円については算法助術の公式84を適用する。

楕円の長半径,短半径,中心座標を a, b, (0, 0)
甲円の半径と中心座標を r1, (r1, 0)
乙円の半径と中心座標を r2, (x2, r2)
甲円,乙円,楕円の共通接点を (x0, y0)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms a::positive, b::positive, r1::positive,
     r2::positive, x2::positive,
     x0::positive, y0::positive
eq1 = (2r1)^2/4 - (a^2 - b^2)*(b^2 - r1^2)/b^2  # 算法助術の公式84
eq2 = (x2 - r1)^2 + r2^2 - (r1 - r2)^2
eq3 = (x0 - r1)^2 + y0^2 - r1^2
eq4 = (x0 - x2)^2 + (y0 - r2)^2 - r2^2
eq5 = x0^2/a^2 + y0^2/b^2 - 1;

連立方程式を解くと,かなり長い式で表される解が得られる。

res = solve([eq1, eq2, eq3, eq4, eq5], (r1, r2, x2, x0, y0))[4]  # 4 0f 4

   (b*(a^2 - b^2)*sqrt(1/(a - b))/(a*sqrt(a + b)), (a^4*sqrt((a^2 - 2*b^2)/(a^2 - b^2)) - a^4*sqrt(a + b)*sqrt(1/(a - b)) + a^3*b*sqrt(a + b)*sqrt(1/(a - b)) - 2*a^2*b^2*sqrt((a^2 - 2*b^2)/(a^2 - b^2)) + 2*a^2*b^2*sqrt(a + b)*sqrt(1/(a - b)) - 2*a*b^3*sqrt(a + b)*sqrt(1/(a - b)) + b^4*sqrt((a^2 - 2*b^2)/(a^2 - b^2)))/b^3, (-a^2*sqrt((a^2 - 2*b^2)/(a^2 - b^2)) + a^2*sqrt(a + b)*sqrt(1/(a - b)) - a*b*sqrt(a + b)*sqrt(1/(a - b)) + b^2*sqrt((a^2 - 2*b^2)/(a^2 - b^2)))/b, a*b*sqrt(1/(a - b))/sqrt(a + b), b*sqrt((a^2 - 2*b^2)/(a^2 - b^2)))

乙円の半径は r1 = b*(a^2 - b^2)*sqrt(1/(a - b))/(a*sqrt(a + b)) となるが,eq1 を r1 についてとくと,もう少し簡約化された解 r1 = b*sqrt(a^2 - b^2)/a が得られる。

ans_r1 = solve(eq1, r1)[1]
ans_r1 |> println

   b*sqrt(a^2 - b^2)/a

甲円の式も長いものであるが,たとえば長径,短径がそれぞれ 11170 寸,4204 寸のとき,式に代入することにより甲円の直径は 1934.000000079764 寸である。

res[2] |> println

   (a^4*sqrt((a^2 - 2*b^2)/(a^2 - b^2)) - a^4*sqrt(a + b)*sqrt(1/(a - b)) + a^3*b*sqrt(a + b)*sqrt(1/(a - b)) - 2*a^2*b^2*sqrt((a^2 - 2*b^2)/(a^2 - b^2)) + 2*a^2*b^2*sqrt(a + b)*sqrt(1/(a - b)) - 2*a*b^3*sqrt(a + b)*sqrt(1/(a - b)) + b^4*sqrt((a^2 - 2*b^2)/(a^2 - b^2)))/b^3

2res[2](a => 11170/2, b => 4204/2).evalf() |> println

   1934.00000007983

その他のパラメータは以下のとおりである

  a = 5585;  b = 2102;  r1 = 1947.44280674992, r2 = 967.000000039889, x2 = 2109.24;  x0 = 2268.82;  y0 = 1920.74

function draw(a, b, more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r1 = b*sqrt(a^2 - b^2)/a
   println("r1 = $r1")
   (r1, r2, x2, x0, y0) = (b*(a^2 - b^2)*sqrt(1/(a - b))/(a*sqrt(a + b)), (a^4*sqrt((a^2 - 2*b^2)/(a^2 - b^2)) - a^4*sqrt(a + b)*sqrt(1/(a - b)) + a^3*b*sqrt(a + b)*sqrt(1/(a - b)) - 2*a^2*b^2*sqrt((a^2 - 2*b^2)/(a^2 - b^2)) + 2*a^2*b^2*sqrt(a + b)*sqrt(1/(a - b)) - 2*a*b^3*sqrt(a + b)*sqrt(1/(a - b)) + b^4*sqrt((a^2 - 2*b^2)/(a^2 - b^2)))/b^3, (-a^2*sqrt((a^2 - 2*b^2)/(a^2 - b^2)) + a^2*sqrt(a + b)*sqrt(1/(a - b)) - a*b*sqrt(a + b)*sqrt(1/(a - b)) + b^2*sqrt((a^2 - 2*b^2)/(a^2 - b^2)))/b, a*b*sqrt(1/(a - b))/sqrt(a + b), b*sqrt((a^2 - 2*b^2)/(a^2 - b^2)))
   println("r1 = $r1")
   @printf("長径,短径がそれぞれ %g,%g のとき,甲円の直径は %.15g 寸である。\n", 2a, 2b, 2r2)
   @printf("a = %g;  b = %g;  r1 = %.15g, r2 = %.15g, x2 = %g;  x0 = %g;  y0 = %g\n", a, b, r1, r2, x2, x0, y0)
   plot()
   ellipse(0, 0, a, b, color=:green)
   circle2(r1, 0, r1)
   circle4(x2, r2, r2, :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)
       point(x2, r2, "甲円:r2\n(x2,r2)", :blue, :center, delta=-delta)
       point(r1, 0, " 乙円:r1\n (r1,0)", :red, :center, delta=-4delta)
       point(x0, y0, "(x0,y0)", :green, :left, :bottom, delta=delta)
       point(a, 0, " a", :green, :left, :bottom, delta=delta)
       point(0, b, " b", :green, :left, :bottom, delta=delta)
   end
end;

draw(11170/2, 4204/2, true)


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

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

Julia」カテゴリの最新記事