裏 RjpWiki

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

算額(その1080)

2024年06月20日 | Julia

算額(その1080)

九十八 岩手県江刺市 雨宝堂 現中善観音堂 文政10年(1827)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.
http://www.wasan.jp/yamamura/yamamura.html

キーワード:円5個,半円4個,長方形,斜線2本

長方形の中に 2 本の斜線と甲円(半円),乙円,丙円,丁円を容れる。丁円の直径が 1 寸のとき,乙円の直径はいかほどか。

原点を,中央の乙円の中心に置く。」
長方形の短辺,長辺の長さを 2a, 2r2 + 2r1
甲円の半径と中心座標を r1, (r2 + r1)
乙円の半径と中心座標を r2, (a, 0)
丙円の半径と中心座標を r3,(0, r2 + r3)
丁円の半径と中心座標を r4, (x4, y4)
とおき,以下の連立方程式を解く。

eq1, eq2 は他の条件と重複するので除外する。

残念ながら,SymPy で一度に解くことができないので,今回は既知の変数を前もって定義するという対応を取る。

右下がりの斜線と長方形の右辺を下に延長し交点を α とする。右の甲円,乙円の中心 の y 座標を β,γとすると,αβ,αγ を一辺とする直角三角形は相似で,相似比は 1:2 である。したがって,乙円と甲円の半径 r2, r1 は 1:2 である。

また,右下がりの斜線と y 軸の交点の y 座標を δ,中央下の丙円,乙円の中心の y 座標を ε,ζ とすると,δε,δζ を一辺とする直角三角形は相似で,相似比は 1:2 である。したがって,丙円と乙円の半径 r3, r2 は 1:2 である。
これを合わせると,r3:r2:r1 = 4:2:1 なので,r2 = 2r3, r1 = 4r3 という条件を加え,eq5, eq6 は除外する。

これで,もともとは 6 元連立方程式だったものが 4 元連立方程式になった。

include("julia-source.txt")

using SymPy

@syms a::positive, r1::positive, r2::positive,
     r3::positive, x3::positive, y3::positive,
     r4::positive, x4::positive, y4::positive
r2 = 2r3
r1 = 4r3
#eq1 = dist2(0, r1 + r2, a/2, 0, a, 0, r2)
#eq2 = dist2(0, r1 + r2, a/2, 0, 0, 0, r2)
eq3 = dist2(0, r1 + r2, a/2, 0, x4, y4, r4)
eq4 = dist2(0, r1 + r2, a/2, 0, 0, r2 + r3, r3)
#eq5 = dist2(0, r1 + r2, a/2, 0, a, r1 + r2, r1)
eq6 = (a - x4)^2 + (r1 + r2 - y4)^2 - (r1 + r4)^2 |> expand
eq7 = (a - x4)^2 + y4^2 - (r2 + r4)^2 |> expand;
#eq8 = r3/(r1 - r3) - r2/(r1 + r2)
#res = solve([eq3, eq4, eq5, eq6, eq7, eq8], (a, r1, r2, r3, x4, y4))

println(eq3, ",  # eq3")
println(eq4, ",  # eq4")
#println(eq5, ",  # eq5")
println(eq6, ",  # eq6")
println(eq7, ",  # eq7")
#println(eq8, ",  # eq8")

   36*a^2*r3^2 - 12*a^2*r3*y4 - a^2*r4^2 + a^2*y4^2 - 144*a*r3^2*x4 + 24*a*r3*x4*y4 - 144*r3^2*r4^2 + 144*r3^2*x4^2,  # eq3
   8*r3^2*(a^2 - 18*r3^2),  # eq4
   a^2 - 2*a*x4 + 20*r3^2 - 8*r3*r4 - 12*r3*y4 - r4^2 + x4^2 + y4^2,  # eq6
   a^2 - 2*a*x4 - 4*r3^2 - 4*r3*r4 - r4^2 + x4^2 + y4^2,  # eq7

最も式が簡単な eq4 を解いて a を求め,残りの 3 個の方程式に代入することで,更に次元を 1 つ減らすことができる。

ans_a = solve(eq4, a)[1]
ans_a |> println

   3*sqrt(2)*r3

eq3 = eq3(a => ans_a) |> simplify |> (x -> x/18r3^2)
eq6 = eq6(a => ans_a)
eq7 = eq7(a => ans_a) |> simplify
eq3 |> println
eq6 |> println
eq7 |> println

   36*r3^2 - 24*sqrt(2)*r3*x4 - 12*r3*y4 - 9*r4^2 + 8*x4^2 + 4*sqrt(2)*x4*y4 + y4^2
   38*r3^2 - 8*r3*r4 - 6*sqrt(2)*r3*x4 - 12*r3*y4 - r4^2 + x4^2 + y4^2
   14*r3^2 - 4*r3*r4 - 6*sqrt(2)*r3*x4 - r4^2 + x4^2 + y4^2

これで,SymPy でも連立方程式を解くことができるようになる。r3, x4, y4 が,与えられる r4 を含む式で表される。

res = solve([eq3, eq6, eq7], (r3, x4, y4))[1];
res[1] |> simplify |> println
res[2] |> simplify |> println
res[3] |> simplify |> println

乙円の半径 r2 は 丙円の半径 r3 の 2倍,更に r3 は 丁円の半径 r4 の (2√2 + 3)/4 倍である。つまり,r2 = r2*(2√2 + 3)/2 である。
丁円の直径が 1 寸のとき丙円の直径は 2.914213562373095 寸である。

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

r4 = 0.5;  r3 = 0.728553;  x4 = 1.61959;  y4 = 1.29044;  a = 3.09099;  r2 = 1.45711;  r1 = 2.91421

パラメータは以下のようにして逐次求めることができる。

r4 = 0.5
r3 = r4*(2*sqrt(2) + 3)/4
x4 = r4*(12 + 19*sqrt(2))/12
y4 = r4*(7 + 6*sqrt(2))/6
a = 3*sqrt(2)*r3
r2 = 2r3
r1 = 4r3
(a, r1, r2, r3, x4, y4)

   (3.0909902576697323, 2.914213562373095, 1.4571067811865475, 0.7285533905932737, 1.6195857368787003, 1.290440114519881)

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r4 = 0.5
   #(a, r1, r2, r3, x4, y4) = res[1]
   r3 = r4*(2*sqrt(2) + 3)/4
   x4 = r4*(12 + 19*sqrt(2))/12
   y4 = r4*(7 + 6*sqrt(2))/6
   a = 3*sqrt(2)*r3
   r2 = 2r3
   r1 = 4r3
   @printf("丁円の直径が %g のとき,乙円の直径は %g である。\n", 2r4, 2r2)
   @printf("r4 = %g;  r3 = %g;  x4 = %g;  y4 = %g;  a = %g;  r2 = %g;  r1 = %g\n",
       r4, r3, x4, y4, a, r2, r1)
   plot([a, a, -a, -a, a], [-r2, r2 + 2r1, r2 + 2r1, -r2, -r2], color=:green, lw=0.5)
   circle(0, 0, r2, :blue)
   circle(a, 0, r2, :blue, beginangle=90, endangle=270)
   circle(-a, 0, r2, :blue, beginangle=-90, endangle=90)
   circle(0, r2 + r3, r3, :magenta)
   circle(0, 2r1 + r2 - r3, r3, :magenta)
   circle(a, r2 + r1, r1, beginangle=90, endangle=270)
   circle(-a, r2 + r1, r1, beginangle=-90, endangle=90)
   circle2(x4, y4, r4, :green)
   x01 = a*(r1 + 2r2)/2(r1 + r2)
   x02 = a*r1/2(r1 + r2)
   segment(a, -r2 - r1, -x02, r2 + 2r1, :orange)
   segment(a, -r2, a, -r2 - r1, :orange)
   segment(-x01, -r2, x02, r2 + 2r1, :orange)
   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(a, -r2 - r1, " α", :gray50, :left, :vcenter)
       point(a, 0, " β", :gray40, :left, :vcenter)
       point(a, r2 + r1, " γ", :gray40, :left, :vcenter)
       point(0, 0, "ζ ", :gray40, :right, :vcenter, delta=delta)
       point(0, r2 + r3, "ε ", :gray40, :right, :vcenter)
       point(0, r2 + r1, "δ ", :gray40, :right, :vcenter)
       point(a, r2 + r1, "甲円:r1\n(a,r2+r1) ", :red, :right, :vcenter)
       point(a, 0, "乙円:r2 \n(a,0) ", :blue, :right, :vcenter)
       point(0, 0, "乙円:r2,(0,0) ", :blue, :center, delta=-delta/2)
       point(0, r2 + r3, " 丙円:r3,(0,r2+r3) ", :black, :left, :vcenter)
       point(0, 2r1 + r2 - r3, " 丙円:r3,(0,2r1+r2-r3) ", :black, :left, :vcenter)
       point(x4, y4, "丁円:r4,(x4,y4)", :black, :left, delta=-delta/2, deltax=-3delta)
   end
end;


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

コメントを投稿

Julia」カテゴリの最新記事