裏 RjpWiki

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

算額(その664)

2024年01月30日 | Julia

算額(その664)

北海道函館市谷地頭町 函館八幡宮 文化2年(1805)
中村信弥「幻の算額」

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

正方形の中に半円 2 個と容円 1 個が入っている容円の直径を「黒積」で表わせ。

黒積とは,名前とは相反して「図形の背景の空白領域の面積」を表すことが常識的であるようだ。この問題の場合は,正方形の内部の半円,容円以外の部分,図で灰色で示した部分の面積を指す。

半円の半径と中心座標を r1, (2r1, r1)
容円の半径と中心座標を r2, (r2, r2)
黒積を A とする。
正方形の一辺の長さは 2r1 である。

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

using SymPy
@syms r1::positive, r2::positive, A::positive
s3 = sqrt(Sym(3));

黒積 A は

(2r1)^2 -(PI*r1^2 - 2(PI*r1^2/4 - r1^2/2)) - PI*r2^2
= -PI*r1^2/2 + 3*r1^2 - PI*r2^2

である。

(2r1)^2 -(PI*r1^2 - 2(PI*r1^2/4 - r1^2/2)) - PI*r2^2 |> simplify |> println

   -pi*r1^2/2 + 3*r1^2 - pi*r2^2

eq1 = A - (-PI*r1^2/2 + 3*r1^2 - PI*r2^2)
eq1 |> println

   A - 3*r1^2 + pi*r1^2/2 + pi*r2^2

eq1 から solve() により r1 を求める。

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

   sqrt(2*A + 2*pi*r2^2)/sqrt(6 - pi)

r1 を表すこの式には r2 が含まれるので,r2 を消去する。

そこで,半円と容円が外接することに基づき,半円,容円の半径の関係を求める。
最初の解が適解である。すなわち,r2 = 2(2 - √3)*r1 である。

eq2 = (2r1 - r2)^2 + (r1 - r2)^2 - (r1 + r2)^2
res = solve(eq2, r2)
res |> println

   Sym[2*r1*(2 - sqrt(3)), 2*r1*(sqrt(3) + 2)]

この r1 に上で求めた式を代入し,方程式 eq2 を解いて r2 を求めれば,A を含む式で解が得られる。

eq2 = 2*(sqrt(2*A + 2*PI*r2^2)/sqrt(6 - PI))*(2 - s3) - r2 |> simplify
eq2 |> println

   (-r2*sqrt(6 - pi) + (4 - 2*sqrt(3))*sqrt(2*A + 2*pi*r2^2))/sqrt(6 - pi)

res = solve(eq2, r2)[1] |> sympy.sqrtdenest |> simplify;

res |> display



res |> println

   2*sqrt(2)*sqrt(A)*(2 - sqrt(3))/sqrt(-57*pi + 6 + 32*sqrt(3)*pi)

容円の半径は
2*sqrt(2)*sqrt(A)*(2 - sqrt(3))/sqrt(-57*pi + 6 + 32*sqrt(3)*pi)
である。

この式が正しいことを逆算して確かめる。
黒積 A が 2 のとき,容円の半径 r2 は 1.0440008465400472 である。

r2 = (2*sqrt(2)*sqrt(2)*(2 - sqrt(3))/sqrt(-57*pi + 6 + 32*sqrt(3)*pi))

   1.0440008465400472

r2 = 2*r1*(2 - sqrt(3)) なので,半円の半径 r1 は 1.9481321012161867 である。

r1 = r2/(2(2 - sqrt(3)))

   1.9481321012161867

黒積は,以下の通り 1.9999999999999942 ≒ 2 になる。

-pi*r1^2/2 + 3*r1^2 - pi*r2^2

   1.9999999999999942

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r1 = 1
   r2 = 2*r1*(2 - sqrt(3))
   @printf("r1 = %g;  r2 = %g\n", r1, r2)
   plot([0, 2r1, 2r1, 0, 0], [0, 0, 2r1, 2r1, 0], color=:black, lw=0.5,seriestype=:shape, fillcolor=:gray)
   circlef(2r1, r1, r1, beginangle=90, endangle=270)
   circlef(r1, 2r1, r1, beginangle=180, endangle=360)
   circle(2r1, r1, r1, :black, beginangle=90, endangle=270)
   circle(r1, 2r1, r1, :black, beginangle=180, endangle=360)
   circlef(r2, r2, r2, :blue)
   plot!([0, 2r1, 2r1, 0, 0], [0, 0, 2r1, 2r1, 0], color=:black)
   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(2r1, 0, "2r1 ", :black, :right, :bottom, delta=delta/2)
       point(2r1, r1, "(2r1,r1) ", :black, :right, :vcenter)
       point(r1, 2r1, "(r1,2r1) ", :black, :center, delta=-delta/2)
       point(r2, r2, "容円:r2,(r2, r2)", :black, :center, delta=-delta/2)
   end
end;


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

コメントを投稿

Julia」カテゴリの最新記事