裏 RjpWiki

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

算額(その622)

2024年01月09日 | Julia

算額(その622)

和算図形問題あれこれ
令和 2 年 12 月の問題 - No.2?
飯塚文庫『関流叚書見題部円類五十問本書』より

https://gunmawasan.web.fc2.com/kongetu-no-mondai.html

正方形内に斜線を引き,甲円,乙円,丙円を入れる。正方形の一辺の長さが 1 寸のとき,甲円の直径はいかほどか。

正方形の一辺の長さを a
甲円の半径と中心座標を r1, (r1, r1)
乙円の半径と中心座標を r2, (a - r2, a - r2)
丙円の半径と中心座標を r3, (r3, a - r2)
斜線の y 切片の座標を (0, b)
とおき,以下の連立方程式を解く。

乙円と丙円の半径と中心座標の間の関係を表す 2 つの式は同等の条件を表現しているので,どちらを使っても方程式は解ける。しかし,今回の場合は方程式1 を使うと SymPy は 'NotImplementedError' を起こしてしまい,解が求まらない。方程式2 を使えば解ける。

方程式1: (a - r2 - r3)^2 + (r2 - r3)^2 = (r2 + r3)^2
方程式2: a - r2 - r3 = sqrt((r2 + r3)^2 - (r2 - r3)^2)

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

using SymPy

@syms r1::positive, r2::positive, r3::positive, a::positive, b::positive
@syms r1, r2, r3, a, b

a = 1
eq1 = (a - r2 - r3)^2 + (r2 - r3)^2 - (r2 + r3)^2
eq2 = a - r2 - r3  - sqrt((r2 + r3)^2 - (r2 - r3)^2)
eq3 = a + b - sqrt(a^2 + b^2) - 2r1
eq4 = distance(a, 0, 0, b, a - r2, a - r2) - r2^2
eq5 = distance(a, 0, 0, b, r3, a - r3) - r3^2;res = solve([eq2, eq3, eq4, eq5], (r1, r2, r3, b));

2 組の解が得られるが,2 番目のものが適解である。
それぞれの式はかなり長い。甲円の半径は以下のような式になる。

res[2][1] |> println

   sqrt(7)*(-14^(3/4)*(3*sqrt(183) + 62)^(1/3)*sqrt(3*(-sqrt(14)*(3*sqrt(183) + 62)^(1/6)*sqrt(-44*sqrt(14)*(3*sqrt(183) + 62)^(1/3)*sqrt(-22*(3*sqrt(183) + 62)^(1/3) + 91 + 7*(3*sqrt(183) + 62)^(2/3)) - 7*sqrt(14)*(3*sqrt(183) + 62)^(2/3)*sqrt(-22*(3*sqrt(183) + 62)^(1/3) + 91 + 7*(3*sqrt(183) + 62)^(2/3)) - 91*sqrt(14)*sqrt(-22*(3*sqrt(183) + 62)^(1/3) + 91 + 7*(3*sqrt(183) + 62)^(2/3)) + 444*sqrt(21)*sqrt(3*sqrt(183) + 62)) + 2*2^(1/4)*sqrt(3)*7^(3/4)*(3*sqrt(183) + 62)^(1/3)*(-22*(3*sqrt(183) + 62)^(1/3) + 91 + 7*(3*sqrt(183) + 62)^(2/3))^(1/4) + 14^(3/4)*(3*sqrt(183) + 62)^(1/6)*(-22*(3*sqrt(183) + 62)^(1/3) + 91 + 7*(3*sqrt(183) + 62)^(2/3))^(3/4))^2 + 3087*sqrt(14)*(3*sqrt(183) + 62)^(2/3)*sqrt(-22*(3*sqrt(183) + 62)^(1/3) + 91 + 7*(3*sqrt(183) + 62)^(2/3)))*(-22*(3*sqrt(183) + 62)^(1/3) + 91 + 7*(3*sqrt(183) + 62)^(2/3))^(5/4)/4116 - 14^(1/4)*sqrt(3)*sqrt(3*sqrt(183) + 62)*(-22*(3*sqrt(183) + 62)^(1/3) + 91 + 7*(3*sqrt(183) + 62)^(2/3))^(5/4)*sqrt(-44*sqrt(14)*(3*sqrt(183) + 62)^(1/3)*sqrt(-22*(3*sqrt(183) + 62)^(1/3) + 91 + 7*(3*sqrt(183) + 62)^(2/3)) - 7*sqrt(14)*(3*sqrt(183) + 62)^(2/3)*sqrt(-22*(3*sqrt(183) + 62)^(1/3) + 91 + 7*(3*sqrt(183) + 62)^(2/3)) - 91*sqrt(14)*sqrt(-22*(3*sqrt(183) + 62)^(1/3) + 91 + 7*(3*sqrt(183) + 62)^(2/3)) + 444*sqrt(21)*sqrt(3*sqrt(183) + 62))/294 - sqrt(42)*(3*sqrt(183) + 62)^(2/3)*(-7*sqrt(3*sqrt(183) + 62) + 22*(3*sqrt(183) + 62)^(1/6))*(-22*(3*sqrt(183) + 62)^(1/3) + 91 + 7*(3*sqrt(183) + 62)^(2/3))/294 + sqrt(126*sqrt(183) + 2604)*(-28028*(3*sqrt(183) + 62)^(1/3) + 115934 + 8918*(3*sqrt(183) + 62)^(2/3))/4116 + 9*sqrt(7)*(3*sqrt(183) + 62)^(2/3)*(-22*(3*sqrt(183) + 62)^(1/3) + 91 + 7*(3*sqrt(183) + 62)^(2/3))^(3/2)/98)/((3*sqrt(183) + 62)^(2/3)*(-22*(3*sqrt(183) + 62)^(1/3) + 91 + 7*(3*sqrt(183) + 62)^(2/3))^(3/2))

それぞれの式を評価した結果を以下に示す。
順に,甲円の半径,乙円の半径,丙円の半径,斜線の y 切片 b

res[2][1].evalf(), res[2][2].evalf(), res[2][3].evalf(), res[2][4].evalf()

   (0.246773416321210, 0.336189121793897, 0.176552761905338, 0.734031532621976)

甲円の直径は 0.493546832642421 寸である。

2res[2][1].evalf() |> println

   0.493546832642421

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   a = 1
   (r1, r2, r3, b) = (0.246773416321210, 0.336189121793897, 0.176552761905338, 0.734031532621976)
   @printf("甲円の直径 = %g;  r1 = %g;  r2 = %g;  r3 = %g;  b = %g\n", 2r1, r1, r2, r3, b)
   plot([0, a, a, 0, 0], [0, 0, a, a, 0], color=:black, lw=0.5, xlims=(-0.05, 1.05))
   circle(r1, r1, r1)
   circle(a - r2, a - r2, r2, :blue)
   circle(r3, a - r3, r3, :magenta)
   segment(0, b, a, 0, :green)
   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(r1, r1, "甲円:r1,(r1,r1)", :red, :center, delta=-delta/2)
       point(a - r2, a - r2, "乙円:r2,(a-r2,a-r2)", :blue, :center, delta=-delta/2)
       point(r3, a - r3, "丙円:r3,(r3,a-r3)", :magenta, :center, delta=-delta/2)
       point(0, a, "a ", :green, :right, :vcenter)
       point(a, 0, " a", :green, :left, :bottom, delta=delta/2)
       point(0, b, "b ", :green, :right, :vcenter)
   end
end;


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

コメントを投稿

Julia」カテゴリの最新記事