裏 RjpWiki

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

算額(その427)

2023年09月11日 | Julia

算額(その427)

長野県諏訪市中洲 諏訪大社上社 明治12年(1897)

中村信弥(1999):算額への招待
http://www.wasan.jp/syotai/syotai.html

大円は鈎股弦(直角三角形)の,鈎と弦に接しており,中円,小円は弦と大円に接しかつそれぞれも互いに接している。鈎,股がそれぞれ 3000 寸,4000 寸,小円の直径が 456 寸のとき,大円の直径を求めよ。

鈎,股,弦の長さをそれぞれ鈎,股,弦
大円の半径と中心座標を r1, (r1, r1)
中円の半径と中心座標を r2, (x2, x2)
小円の半径と中心座標を r3, (x31, y31), (x32, y32)
として,連立方程式を解く。

solve() の能力的に一度では解けないので,まず最初に大円と中円の半径を求める。このためには,図を反時計回りに回転させ,弦(下図の紫の線)が水平になるように回転させて方程式を解くとよい。eq13 はr1 と鈎股弦の面積の関係式である(上図を参照)。

include("julia-source.txt");

using SymPy
@syms 鈎::positive, 股::positive, 弦::positive,
     r1::positive, r2::positive,
     r3::positive, x3::positive;

eq11 = x3^2 + (r1 - 2r2 + r3)^2 - (r1 - r3)^2
eq12 = x3^2 + (r2 - r3)^2 - (r2 + r3)^2
eq13 = r1*(鈎 + 股) + (r1 - 2r2)*弦 - 鈎*股
res1 = solve([eq11, eq12, eq13], (r1, r2, x3))

   4-element Vector{Tuple{Sym, Sym, Sym}}:
    ((-2*r3*弦^2 - 弦*sqrt(4*r3^2*弦^2 - 4*r3*股^2*鈎 - 4*r3*股*鈎^2 + 股^2*鈎^2) + 股^2*鈎 + 股*鈎^2)/(-弦^2 + 股^2 + 2*股*鈎 + 鈎^2), (-r3*弦 + 股*鈎/2 - sqrt(4*r3^2*弦^2 - 4*r3*股^2*鈎 - 4*r3*股*鈎^2 + 股^2*鈎^2)/2)/(-弦 + 股 + 鈎), -sqrt(4*r3^2*弦/(弦 - 股 - 鈎) - 2*r3*股*鈎/(弦 - 股 - 鈎) + 2*r3*sqrt(4*r3^2*弦^2 - 4*r3*股^2*鈎 - 4*r3*股*鈎^2 + 股^2*鈎^2)/(弦 - 股 - 鈎)))
    ((-2*r3*弦^2 - 弦*sqrt(4*r3^2*弦^2 - 4*r3*股^2*鈎 - 4*r3*股*鈎^2 + 股^2*鈎^2) + 股^2*鈎 + 股*鈎^2)/(-弦^2 + 股^2 + 2*股*鈎 + 鈎^2), (-r3*弦 + 股*鈎/2 - sqrt(4*r3^2*弦^2 - 4*r3*股^2*鈎 - 4*r3*股*鈎^2 + 股^2*鈎^2)/2)/(-弦 + 股 + 鈎), sqrt(4*r3^2*弦/(弦 - 股 - 鈎) - 2*r3*股*鈎/(弦 - 股 - 鈎) + 2*r3*sqrt(4*r3^2*弦^2 - 4*r3*股^2*鈎 - 4*r3*股*鈎^2 + 股^2*鈎^2)/(弦 - 股 - 鈎)))
    ((-2*r3*弦^2 + 弦*sqrt(4*r3^2*弦^2 - 4*r3*股^2*鈎 - 4*r3*股*鈎^2 + 股^2*鈎^2) + 股^2*鈎 + 股*鈎^2)/(-弦^2 + 股^2 + 2*股*鈎 + 鈎^2), (-r3*弦 + 股*鈎/2 + sqrt(4*r3^2*弦^2 - 4*r3*股^2*鈎 - 4*r3*股*鈎^2 + 股^2*鈎^2)/2)/(-弦 + 股 + 鈎), -sqrt(4*r3^2*弦/(弦 - 股 - 鈎) - 2*r3*股*鈎/(弦 - 股 - 鈎) - 2*r3*sqrt(4*r3^2*弦^2 - 4*r3*股^2*鈎 - 4*r3*股*鈎^2 + 股^2*鈎^2)/(弦 - 股 - 鈎)))
    ((-2*r3*弦^2 + 弦*sqrt(4*r3^2*弦^2 - 4*r3*股^2*鈎 - 4*r3*股*鈎^2 + 股^2*鈎^2) + 股^2*鈎 + 股*鈎^2)/(-弦^2 + 股^2 + 2*股*鈎 + 鈎^2), (-r3*弦 + 股*鈎/2 + sqrt(4*r3^2*弦^2 - 4*r3*股^2*鈎 - 4*r3*股*鈎^2 + 股^2*鈎^2)/2)/(-弦 + 股 + 鈎), sqrt(4*r3^2*弦/(弦 - 股 - 鈎) - 2*r3*股*鈎/(弦 - 股 - 鈎) - 2*r3*sqrt(4*r3^2*弦^2 - 4*r3*股^2*鈎 - 4*r3*股*鈎^2 + 股^2*鈎^2)/(弦 - 股 - 鈎)))

4 組の解が得られるが,そのうちの最初の 2 組が適解である。1 番目と 2 番目は,小円の位置(x3)が対称なもので実質的に同じである。

println("r1 = ", res1[2][1](鈎 => 3000, 股 => 4000, 弦 => 5000, r3 => 456//2))
println("r2 = ", res1[2][2](鈎 => 3000, 股 => 4000, 弦 => 5000, r3 => 456//2))
println("x3 = ", res1[2][3](鈎 => 3000, 股 => 4000, 弦 => 5000, r3 => 456//2))

   r1 = 1250
   r2 = 300
   x3 = 120*sqrt(19)

算額の解としては大円の半径が 1250,直径は 2500 でここまででよい。

次いで,図を描くために,r1, r2 が既知として,小円の中心座標を求める。

using SymPy
@syms r1::positive, r2::positive, x2::positive, y2::positive,
     r3::positive, x31::positive, y31::positive,
     x32::positive, y32::positive;

(r1, r2, r3) = (1250, 300, 456//2)
x2 = r1 + (r1 - r2)*3//5
y2 = r1 + (r1 - r2)*4//5
eq1 = (x2 - x31)^2 + (y2 - y31)^2 - (r2 + r3)^2
eq2 = (x2 - x32)^2 + (y2 - y32)^2 - (r2 + r3)^2
eq5 = (x31 - r1)^2 + (y31 - r1)^2 - (r1 - r3)^2
eq6 = (x32 - r1)^2 + (y32 - r1)^2 - (r1 - r3)^2
res2 = solve([eq1, eq2, eq5, eq6], (x31, y31, x32, y32))

   4-element Vector{NTuple{4, Sym}}:
    (8884/5 - 96*sqrt(19), 72*sqrt(19) + 9762/5, 8884/5 - 96*sqrt(19), 72*sqrt(19) + 9762/5)
    (8884/5 - 96*sqrt(19), 72*sqrt(19) + 9762/5, 96*sqrt(19) + 8884/5, 9762/5 - 72*sqrt(19))
    (96*sqrt(19) + 8884/5, 9762/5 - 72*sqrt(19), 8884/5 - 96*sqrt(19), 72*sqrt(19) + 9762/5)
    (96*sqrt(19) + 8884/5, 9762/5 - 72*sqrt(19), 96*sqrt(19) + 8884/5, 9762/5 - 72*sqrt(19))

4 組の解が得られるが,2 番目と 3 番目のものが適解である(小円の位置関係が逆になるだけ)。

(8884/5 - 96*sqrt(19), 72*sqrt(19) + 9762/5, 96*sqrt(19) + 8884/5, 9762/5 - 72*sqrt(19)) |> println
(96*sqrt(19) + 8884/5, 9762/5 - 72*sqrt(19), 8884/5 - 96*sqrt(19), 72*sqrt(19) + 9762/5) |> println

   (1358.3457014200953, 2266.2407239349286, 2195.2542985799046, 1638.5592760650716)
   (2195.2542985799046, 1638.5592760650716, 1358.3457014200953, 2266.2407239349286)

2 つの解をまとめると,以下のようになる。

   鈎 = 3000;  股 = 4000;  r3 = 228
   r1 = 1250;  r2 = 300;  x31 = 2195.25;  y31 = 1638.56;  x32 = 1358.35;  y32 = 2266.24
   大円の直径 = 2500

using Plots

function draw0(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r2, r3, x3) = (1250, 300, 456//2, 120*sqrt(19))
   plot()
   circle(0, 0, r1)
   circle(0, r1 - r2, r2, :blue)
   circle(x3, r1 - 2r2 + r3, r3, :green)
   circle(-x3, r1 - 2r2 + r3, r3, :green)
   x = sqrt(r1^2 - (r1 - 2r2)^2)
   segment(-x, r1 - 2r2, x, r1 - 2r2, :magenta)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
       point(0, r1-r2, " r1-r2", :blue)
       point(0, r1-2r2, " r1-2r2", :magenta, delta=-delta)
       point(x3, r1 - 2r2 + r3, "(x3,r1-2r2+r3)", :green, :center, :top, delta=-delta)
       point(r1, 0, "r1 ", :red, :right, :bottom, delta=delta)
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (鈎, 股, r3) = (3000, 4000, 456//2)
   (r1, r2) = (1250, 300)
   (x31, y31, x32, y32) = res2[3]
   x2 = r1 + (r1 - r2)*3/5
   y2 = r1 + (r1 - r2)*4/5
   @printf("鈎 = %g;  股 = %g;  r3 = %g\n", 鈎, 股, r3)
   @printf("r1 = %g;  r2 = %g;  x31 = %g;  y31 = %g;  x32 = %g;  y32 = %g\n", r1, r2, x31, y31, x32, y32)
   @printf("大円の直径 = %.8g\n", 2r1)
   plot([0, 股, 0, 0], [0, 0, 鈎, 0], color=:magenta, lw=0.5)
   circle(r1, r1, r1)
   circle(x2, y2, r2, :blue)
   circle(x31, y31, r3, :green)
   circle(x32, y32, r3, :green)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
       point(r1, r1, " 大円:r1,(r1,r1)", :red, :left, :vcenter)
       point(r1 + (r1 - r2)*3/5, r1 + (r1 - r2)*4/5, " 中円:r2,(x2,y2)", :blue, :left, :vcenter)
       point(x31, y31, " 小円:r3,(x31,y31)", :green, :left, :vcenter)
       point(x32, y32, " 小円:r3,(x32,y32)", :green, :left, :bottom, delta=delta)
       point(股, 0, "股", :black, :left, :bottom, delta=delta)
       point(0, 鈎, " 鈎", :black, :left, :bottom)
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

 


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

コメントを投稿

Julia」カテゴリの最新記事