裏 RjpWiki

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

算額(その659)

2024年01月28日 | Julia

算額(その659)

長野県上田市別所温泉 北向観音堂 慶応元年(1865)
中村信弥「改訂増補 長野県の算額」

http://www.wasan.jp/zoho/zoho.html

外円内に正三角形が内接し,天円,地円,人円が入っている。外円の直径の平方根が xxx.625,天円の直径の平方根が yyy.96875 のようになっている(小数部がわかっている)。条件を満たすような最小の外円の直径を求めよ。

基本的には r1 と r3 だけの関係式が分かれば問題は解けるのだが,それだけにこだわると逆に落とし穴にハマる。R がわかっているときに,残りすべてのパラメータを求めよう。
R がわかっているときに,r1, r2, r3, x2 の 4 個のパラメータを推定するには,条件が 4 個必要である。eq1 〜 eq3 は比較的簡単に導けるが,eq4 はちょっと盲点かもしれない。

include("julia-source.txt");
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf

using SymPy
@syms R::positive, r1::positive, r2::positive,
     r2::positive, x2::positive, r3::positive,
     constant::positive

eq1 = x2^2 + (R - r1 - (r2 - R/2))^2 - (r1 + r2)^2
eq2 = x2^2 + (r2 - r3)^2 - (r2 + r3)^2
eq3 = 2r1 + 2r3 - 3R/2
eq4 = 2sqrt(r2*r3) + sqrt(Sym(3))*r2 - R*sqrt(Sym(3))/2

res = solve([eq1, eq2, eq3], (r2, x2, r3))
res = solve([eq1, eq2, eq3, eq4], (r1, r2, x2, r3))

   1-element Vector{NTuple{4, Sym}}:
    (9*R/16, R/4, sqrt(3)*R/4, 3*R/16)

つまり,天円の半径 r1 は外円の半径 R の 9/16 である。
解を求めるには以下の3条件を満たす整数 a, b を求めればよい。
いままで,r1, R は半径としてきたが,直径の場合は単に半径を2敗するだけであるから関係式は変わらない。
これ以降 r1, R は直径として読む。
r1/R = 9/16
sqrt(R) = a + 0.625
sqrt(r1) = b + 0.96875

ブルートフォースで該当する解を探索する。

function search()
   for a = 1:10
       R = (a + 0.625)^2
       for b = 1:a
           r1 = (b + 0.96875)^2
           r1 > R && break
           if isapprox(r1/R, 9/16)
               @printf("R = %g;  r1 = %g\n", R, r1)
               return
           end
       end
   end
end
search()    

   R = 6.89062;  r1 = 3.87598

条件を満たす外円の直径は 6.89062 である。
ちなみに,そのときの,各パラメータは以下の通り。
R = 6.89062;  r1 = 3.87597;  r2 = 1.72266;  r3 = 1.29199;  x2 = 2.98373

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (R, r1) = (6.89062, 3.87598)
   (r1, r2, x2, r3) = R .* (9/16, 1/4, √3/4, 3/16)
   @printf("R = %g;  r1 = %g;  r2 = %g;  r3 = %g;  x2 = %g\n", R, r1, r2, r3, x2)
   plot([√3R/2, 0, -√3R/2, √3R/2], [-R/2, R, -R/2], color=:green, lw=0.5)
   circle(0, 0, R)
   circle(0, R - r1, r1, :blue)
   circle(x2, r2 - R/2, r2, :magenta)
   circle(-x2, r2 - R/2, r2, :magenta)
   circle(0, r3 - R/2, r3, :orange)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
       point(0, R - r1, " 天円:r1\n (0,R-r1)", :black, :left, :vcenter)
       point(x2, r2 - R/2, " 地円:r2\n (√3R/2,-R/2)", :black, :left, :vcenter)
       point(0, r3 - R/2, " 人円:r3\n (0,r3-R/2)", :black, :left, :vcenter)
       point(R, 0, " R", :red, :left, :bottom, delta=delta/2)
   end
end;


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

コメントを投稿

Julia」カテゴリの最新記事