裏 RjpWiki

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

算額(その194)

2023年04月12日 | Julia

算額(その194)

中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額1(89)
長野県中野市田上 田上観音堂 文化6年(1809)

問3. 大円の中に,甲,乙,丙,丁,戊,己の 5 個の円が外円に内接すると同時に隣同士の円は外接している。さらに,子,丑,寅,卯,辰の 5 個の円が甲円と乙,丙,丁,戊,己円と外接している。大円の径が 76 寸のとき,辰円の径はいかほどか。


大円の中心座標,半径を (0, R0, R0) ただし R0 = 2
甲円の中心座標,半径を (0, R1, R1) および (0, 3R1, R1) ただし R1 = 1
乙円の中心座標,半径を (X2, Y2, R2)
丙円の中心座標,半径を (X3, Y3, R3)
丁円の中心座標,半径を (X4, Y4, R4)
戊円の中心座標,半径を (X5, Y5, R5)
己円の中心座標,半径を (X6, Y6, R6)
子円の中心座標,半径を (x2, y2, r2)
丑円の中心座標,半径を (x3, y3, r3)
寅円の中心座標,半径を (x4, y4, r4)
卯円の中心座標,半径を (x5, y5, r5)
辰円の中心座標,半径を (x6, y6, r6)
とおき方程式を解く。なお,解として得られるのは大円の半径を 2 としたときの各円の半径なので,元の大円の大きさ,単位(寸)での直径はそれぞれを 38 倍する。大円の半径は 2 の倍数のほうが良いが,大きさは任意に指定できない。SymPy のせいであろうが,16 以上にすると平方根の計算においてエラーになる。

using SymPy

@syms R0::positive, R1::positive,
     X2::positive, Y2::positive, R2::positive,
     x2::positive, y2::positive, r2::positive;

R0 = 2  # 大円の半径
R1 = R0 // 2  # 甲円の半径
X2 = R0 - R2
Y2 = 2R1
eq1 = X2^2 + R1^2 - (R1 + R2)^2 
R2 = solve(eq1, R2)[1]  # 乙円の半径

$\frac{2}{3}$

R0 - R0//3, Y2, R2  # 乙円の中心座標と半径

   (4//3, 2//1, 2/3)

eq2 = x2^2 + (y2 - R1)^2 - (R1 + r2)^2
eq3 = x2^2 + (3R1 - y2)^2 - (R1 + r2)^2
eq4 = (R0 - R2 - x2)^2 + (y2 - 2R1)^2 - (r2 + R2)^2;
(r2, x2, y2) = solve([eq2, eq3, eq4], (r2, x2, y2))[1]  # 子円の中心座標と半径

   (2/15, 8/15, 2)

乙円から始めて,丙円以降の中心座標と半径を求める漸化式を求める。

@syms Xn, Yn, Rn, Xnp1, Ynp1, Rnp1,
     xn, yn, rn, xnp1, ynp1, rnp1;
eq5 = (Xn - Xnp1)^2 + (Yn - Ynp1)^2 - (Rn + Rnp1)^2 |> expand
eq6 = Xnp1^2 + (R1 - Ynp1)^2 - (R1 + Rnp1)^2 |> expand
eq7 = Xnp1^2 + (2R1 - Ynp1)^2 - (R0 - Rnp1)^2 |> expand;
res = solve([eq5, eq6, eq7], (Xnp1, Ynp1, Rnp1));

println(res[2])

   出力省略

2番めの組が適切解である。これに基づいて,現在の円の中心座標と半径を与えて,次の円の中心座標と半径を求める関数を定義する。

NEXTCIRCLE(Xn, Yn, Rn) = return ((-4*Rn^2*Xn - 4*Rn*Xn + sqrt(2)*Rn*sqrt(-Rn^4 - 2*Rn^3 + 2*Rn^2*Xn^2 + 2*Rn^2*Yn^2 - 6*Rn^2*Yn + 8*Rn^2 + 2*Rn*Xn^2 + 2*Rn*Yn^2 - Xn^4 - 2*Xn^2*Yn^2 + 6*Xn^2*Yn - Yn^4 + 6*Yn^3 - 8*Yn^2) + 4*Xn^3 + 4*Xn*Yn^2 - 12*Xn*Yn + 16*Xn + 3*sqrt(2)*Yn*sqrt(-Rn^4 - 2*Rn^3 + 2*Rn^2*Xn^2 + 2*Rn^2*Yn^2 - 6*Rn^2*Yn + 8*Rn^2 + 2*Rn*Xn^2 + 2*Rn*Yn^2 - Xn^4 - 2*Xn^2*Yn^2 + 6*Xn^2*Yn - Yn^4 + 6*Yn^3 - 8*Yn^2) - 4*sqrt(2)*sqrt(-Rn^4 - 2*Rn^3 + 2*Rn^2*Xn^2 + 2*Rn^2*Yn^2 - 6*Rn^2*Yn + 8*Rn^2 + 2*Rn*Xn^2 + 2*Rn*Yn^2 - Xn^4 - 2*Xn^2*Yn^2 + 6*Xn^2*Yn - Yn^4 + 6*Yn^3 - 8*Yn^2))/(Rn^2 + 6*Rn*Yn - 8*Rn + 8*Xn^2 + 9*Yn^2 - 24*Yn + 16), 3*(-Rn^3 - 3*Rn^2*Yn + 4*Rn^2 + Rn*Xn^2 + Rn*Yn^2 + 3*Xn^2*Yn + 4*Xn^2 - 2*sqrt(2)*Xn*sqrt(-Rn^4 - 2*Rn^3 + 2*Rn^2*Xn^2 + 2*Rn^2*Yn^2 - 6*Rn^2*Yn + 8*Rn^2 + 2*Rn*Xn^2 + 2*Rn*Yn^2 - Xn^4 - 2*Xn^2*Yn^2 + 6*Xn^2*Yn - Yn^4 + 6*Yn^3 - 8*Yn^2) + 3*Yn^3 - 4*Yn^2)/(2*(Rn^2 + 6*Rn*Yn - 8*Rn + 8*Xn^2 + 9*Yn^2 - 24*Yn + 16)), -sqrt(2)*Xn*sqrt(-(Rn^2 - 2*Rn - Xn^2 - Yn^2 + 2*Yn)*(Rn^2 + 4*Rn - Xn^2 - Yn^2 + 4*Yn))/(Rn^2 + 6*Rn*Yn - 8*Rn + 8*Xn^2 + 9*Yn^2 - 24*Yn + 16) - (Rn^3 + 3*Rn^2*Yn - 4*Rn^2 - Rn*Xn^2 - Rn*Yn^2 - 3*Xn^2*Yn - 4*Xn^2 - 3*Yn^3 + 4*Yn^2)/(2*(Rn^2 + 6*Rn*Yn - 8*Rn + 8*Xn^2 + 9*Yn^2 - 24*Yn + 16)));

下側の甲円と乙円,丙円から始めて,丑円以降の中心座標と半径を求める漸化式を求める。

eq8 = xnp1^2 + (R1 -ynp1)^2 - (R1 + rnp1)^2 |> expand
eq9 = (Xn - xnp1)^2 + (Yn - ynp1)^2 - (Rn + rnp1)^2 |> expand
eq10 = (Xnp1 - xnp1)^2 + (ynp1 - Ynp1)^2 - (Rnp1 + rnp1)^2 |> expand
res2 = solve([eq8, eq9, eq10], (xnp1, ynp1, rnp1));

println(res2[1])

    出力省略

1番めの組が適切解である。これに基づいて,丑円以降の円の中心座標と半径を求める関数を定義する。

function nextcircle(Xn, Yn, Rn, Xnp1, Ynp1, Rnp1)
   term = sqrt(-Rn^4*Rnp1^2 + 2*Rn^4*Rnp1 + Rn^4*Xnp1^2 + Rn^4*Ynp1^2 - 2*Rn^4*Ynp1 + 2*Rn^3*Rnp1^3 - 2*Rn^3*Rnp1^2 - 2*Rn^3*Rnp1*Xnp1^2 - 2*Rn^3*Rnp1*Ynp1^2 + 4*Rn^3*Rnp1*Ynp1 - 4*Rn^3*Rnp1 - 2*Rn^3*Xnp1^2 - 2*Rn^3*Ynp1^2 + 4*Rn^3*Ynp1 - Rn^2*Rnp1^4 - 2*Rn^2*Rnp1^3 + 2*Rn^2*Rnp1^2*Xn^2 - 2*Rn^2*Rnp1^2*Xn*Xnp1 + 2*Rn^2*Rnp1^2*Xnp1^2 + 2*Rn^2*Rnp1^2*Yn^2 - 2*Rn^2*Rnp1^2*Yn*Ynp1 - 2*Rn^2*Rnp1^2*Yn + 2*Rn^2*Rnp1^2*Ynp1^2 - 2*Rn^2*Rnp1^2*Ynp1 + 8*Rn^2*Rnp1^2 - 4*Rn^2*Rnp1*Xn^2 + 4*Rn^2*Rnp1*Xn*Xnp1 + 2*Rn^2*Rnp1*Xnp1^2 - 4*Rn^2*Rnp1*Yn^2 + 4*Rn^2*Rnp1*Yn*Ynp1 + 4*Rn^2*Rnp1*Yn + 2*Rn^2*Rnp1*Ynp1^2 - 8*Rn^2*Rnp1*Ynp1 - 2*Rn^2*Xn^2*Xnp1^2 - 2*Rn^2*Xn^2*Ynp1^2 + 4*Rn^2*Xn^2*Ynp1 + 2*Rn^2*Xn*Xnp1^3 + 2*Rn^2*Xn*Xnp1*Ynp1^2 - 4*Rn^2*Xn*Xnp1*Ynp1 - Rn^2*Xnp1^4 - 2*Rn^2*Xnp1^2*Yn^2 + 2*Rn^2*Xnp1^2*Yn*Ynp1 + 2*Rn^2*Xnp1^2*Yn - 2*Rn^2*Xnp1^2*Ynp1^2 + 2*Rn^2*Xnp1^2*Ynp1 - 2*Rn^2*Yn^2*Ynp1^2 + 4*Rn^2*Yn^2*Ynp1 + 2*Rn^2*Yn*Ynp1^3 - 2*Rn^2*Yn*Ynp1^2 - 4*Rn^2*Yn*Ynp1 - Rn^2*Ynp1^4 + 2*Rn^2*Ynp1^3 + 2*Rn*Rnp1^4 - 2*Rn*Rnp1^3*Xn^2 - 2*Rn*Rnp1^3*Yn^2 + 4*Rn*Rnp1^3*Yn - 4*Rn*Rnp1^3 + 2*Rn*Rnp1^2*Xn^2 + 4*Rn*Rnp1^2*Xn*Xnp1 - 4*Rn*Rnp1^2*Xnp1^2 + 2*Rn*Rnp1^2*Yn^2 + 4*Rn*Rnp1^2*Yn*Ynp1 - 8*Rn*Rnp1^2*Yn - 4*Rn*Rnp1^2*Ynp1^2 + 4*Rn*Rnp1^2*Ynp1 + 2*Rn*Rnp1*Xn^2*Xnp1^2 + 2*Rn*Rnp1*Xn^2*Ynp1^2 - 4*Rn*Rnp1*Xn^2*Ynp1 + 4*Rn*Rnp1*Xn^2 - 8*Rn*Rnp1*Xn*Xnp1 + 2*Rn*Rnp1*Xnp1^2*Yn^2 - 4*Rn*Rnp1*Xnp1^2*Yn + 4*Rn*Rnp1*Xnp1^2 + 2*Rn*Rnp1*Yn^2*Ynp1^2 - 4*Rn*Rnp1*Yn^2*Ynp1 + 4*Rn*Rnp1*Yn^2 - 4*Rn*Rnp1*Yn*Ynp1^2 + 4*Rn*Rnp1*Ynp1^2 + 2*Rn*Xn^2*Xnp1^2 + 2*Rn*Xn^2*Ynp1^2 - 4*Rn*Xn^2*Ynp1 - 4*Rn*Xn*Xnp1^3 - 4*Rn*Xn*Xnp1*Ynp1^2 + 8*Rn*Xn*Xnp1*Ynp1 + 2*Rn*Xnp1^4 + 2*Rn*Xnp1^2*Yn^2 - 4*Rn*Xnp1^2*Yn*Ynp1 + 4*Rn*Xnp1^2*Ynp1^2 - 4*Rn*Xnp1^2*Ynp1 + 2*Rn*Yn^2*Ynp1^2 - 4*Rn*Yn^2*Ynp1 - 4*Rn*Yn*Ynp1^3 + 8*Rn*Yn*Ynp1^2 + 2*Rn*Ynp1^4 - 4*Rn*Ynp1^3 + Rnp1^4*Xn^2 + Rnp1^4*Yn^2 - 2*Rnp1^4*Yn - 2*Rnp1^3*Xn^2 - 2*Rnp1^3*Yn^2 + 4*Rnp1^3*Yn - Rnp1^2*Xn^4 + 2*Rnp1^2*Xn^3*Xnp1 - 2*Rnp1^2*Xn^2*Xnp1^2 - 2*Rnp1^2*Xn^2*Yn^2 + 2*Rnp1^2*Xn^2*Yn*Ynp1 + 2*Rnp1^2*Xn^2*Yn - 2*Rnp1^2*Xn^2*Ynp1^2 + 2*Rnp1^2*Xn^2*Ynp1 + 2*Rnp1^2*Xn*Xnp1*Yn^2 - 4*Rnp1^2*Xn*Xnp1*Yn - 2*Rnp1^2*Xnp1^2*Yn^2 + 4*Rnp1^2*Xnp1^2*Yn - Rnp1^2*Yn^4 + 2*Rnp1^2*Yn^3*Ynp1 + 2*Rnp1^2*Yn^3 - 2*Rnp1^2*Yn^2*Ynp1^2 - 2*Rnp1^2*Yn^2*Ynp1 + 4*Rnp1^2*Yn*Ynp1^2 - 4*Rnp1^2*Yn*Ynp1 + 2*Rnp1*Xn^4 - 4*Rnp1*Xn^3*Xnp1 + 2*Rnp1*Xn^2*Xnp1^2 + 4*Rnp1*Xn^2*Yn^2 - 4*Rnp1*Xn^2*Yn*Ynp1 - 4*Rnp1*Xn^2*Yn + 2*Rnp1*Xn^2*Ynp1^2 - 4*Rnp1*Xn*Xnp1*Yn^2 + 8*Rnp1*Xn*Xnp1*Yn + 2*Rnp1*Xnp1^2*Yn^2 - 4*Rnp1*Xnp1^2*Yn + 2*Rnp1*Yn^4 - 4*Rnp1*Yn^3*Ynp1 - 4*Rnp1*Yn^3 + 2*Rnp1*Yn^2*Ynp1^2 + 8*Rnp1*Yn^2*Ynp1 - 4*Rnp1*Yn*Ynp1^2 + Xn^4*Xnp1^2 + Xn^4*Ynp1^2 - 2*Xn^4*Ynp1 - 2*Xn^3*Xnp1^3 - 2*Xn^3*Xnp1*Ynp1^2 + 4*Xn^3*Xnp1*Ynp1 + Xn^2*Xnp1^4 + 2*Xn^2*Xnp1^2*Yn^2 - 2*Xn^2*Xnp1^2*Yn*Ynp1 - 2*Xn^2*Xnp1^2*Yn + 2*Xn^2*Xnp1^2*Ynp1^2 - 2*Xn^2*Xnp1^2*Ynp1 + 2*Xn^2*Yn^2*Ynp1^2 - 4*Xn^2*Yn^2*Ynp1 - 2*Xn^2*Yn*Ynp1^3 + 2*Xn^2*Yn*Ynp1^2 + 4*Xn^2*Yn*Ynp1 + Xn^2*Ynp1^4 - 2*Xn^2*Ynp1^3 - 2*Xn*Xnp1^3*Yn^2 + 4*Xn*Xnp1^3*Yn - 2*Xn*Xnp1*Yn^2*Ynp1^2 + 4*Xn*Xnp1*Yn^2*Ynp1 + 4*Xn*Xnp1*Yn*Ynp1^2 - 8*Xn*Xnp1*Yn*Ynp1 + Xnp1^4*Yn^2 - 2*Xnp1^4*Yn + Xnp1^2*Yn^4 - 2*Xnp1^2*Yn^3*Ynp1 - 2*Xnp1^2*Yn^3 + 2*Xnp1^2*Yn^2*Ynp1^2 + 2*Xnp1^2*Yn^2*Ynp1 - 4*Xnp1^2*Yn*Ynp1^2 + 4*Xnp1^2*Yn*Ynp1 + Yn^4*Ynp1^2 - 2*Yn^4*Ynp1 - 2*Yn^3*Ynp1^3 + 2*Yn^3*Ynp1^2 + 4*Yn^3*Ynp1 + Yn^2*Ynp1^4 + 2*Yn^2*Ynp1^3 - 8*Yn^2*Ynp1^2 - 2*Yn*Ynp1^4 + 4*Yn*Ynp1^3)
   return ((Rn^3*Rnp1*Xnp1 - Rn^3*Xnp1 - Rn^2*Rnp1^2*Xn - Rn^2*Rnp1^2*Xnp1 + 2*Rn^2*Rnp1*Xn - Rn^2*Rnp1*Xnp1 + Rn^2*Xn*Ynp1^2 - 2*Rn^2*Xn*Ynp1 + Rn^2*Xnp1^3 - Rn^2*Xnp1*Yn*Ynp1 + Rn^2*Xnp1*Yn + Rn^2*Xnp1*Ynp1^2 - Rn^2*Xnp1*Ynp1 + 2*Rn^2*Xnp1 + Rn*Rnp1^3*Xn - Rn*Rnp1^2*Xn + 2*Rn*Rnp1^2*Xnp1 - Rn*Rnp1*Xn^2*Xnp1 - Rn*Rnp1*Xn*Xnp1^2 - Rn*Rnp1*Xn*Ynp1^2 + 2*Rn*Rnp1*Xn*Ynp1 - 2*Rn*Rnp1*Xn - Rn*Rnp1*Xnp1*Yn^2 + 2*Rn*Rnp1*Xnp1*Yn - 2*Rn*Rnp1*Xnp1 + Rn*Xn^2*Xnp1 + Rn*Xn*Xnp1^2 - Rn*Xn*Ynp1^2 + 2*Rn*Xn*Ynp1 - 2*Rn*Xnp1^3 + Rn*Xnp1*Yn^2 + 2*Rn*Xnp1*Yn*Ynp1 - 4*Rn*Xnp1*Yn - 2*Rn*Xnp1*Ynp1^2 + 2*Rn*Xnp1*Ynp1 - Rn*Ynp1*term + Rn*term - Rnp1^3*Xn + Rnp1^2*Xn^3 + Rnp1^2*Xn*Yn^2 - Rnp1^2*Xn*Yn*Ynp1 - Rnp1^2*Xn*Yn + Rnp1^2*Xn*Ynp1 + 2*Rnp1^2*Xn + Rnp1^2*Xnp1*Yn^2 - 2*Rnp1^2*Xnp1*Yn - 2*Rnp1*Xn^3 + Rnp1*Xn^2*Xnp1 + Rnp1*Xn*Xnp1^2 - 2*Rnp1*Xn*Yn^2 + 2*Rnp1*Xn*Yn*Ynp1 + 2*Rnp1*Xn*Yn + Rnp1*Xn*Ynp1^2 - 4*Rnp1*Xn*Ynp1 - Rnp1*Xnp1*Yn^2 + 2*Rnp1*Xnp1*Yn + Rnp1*Yn*term - Rnp1*term - Xn^3*Ynp1^2 + 2*Xn^3*Ynp1 + Xn^2*Xnp1*Yn*Ynp1 - Xn^2*Xnp1*Yn - Xn^2*Xnp1*Ynp1 + Xn*Xnp1^2*Yn*Ynp1 - Xn*Xnp1^2*Yn - Xn*Xnp1^2*Ynp1 - Xn*Yn^2*Ynp1^2 + 2*Xn*Yn^2*Ynp1 + Xn*Yn*Ynp1^3 - Xn*Yn*Ynp1^2 - 2*Xn*Yn*Ynp1 - Xn*Ynp1^3 + 2*Xn*Ynp1^2 - Xnp1^3*Yn^2 + 2*Xnp1^3*Yn + Xnp1*Yn^3*Ynp1 - Xnp1*Yn^3 - Xnp1*Yn^2*Ynp1^2 - Xnp1*Yn^2*Ynp1 + 2*Xnp1*Yn^2 + 2*Xnp1*Yn*Ynp1^2 - 2*Xnp1*Yn*Ynp1 - Yn*term + Ynp1*term)/(2*(Rn^2*Xnp1^2 + Rn^2*Ynp1^2 - 2*Rn^2*Ynp1 + Rn^2 - 2*Rn*Rnp1*Xn*Xnp1 - 2*Rn*Rnp1*Yn*Ynp1 + 2*Rn*Rnp1*Yn + 2*Rn*Rnp1*Ynp1 - 2*Rn*Rnp1 + 2*Rn*Xn*Xnp1 - 2*Rn*Xnp1^2 + 2*Rn*Yn*Ynp1 - 2*Rn*Yn - 2*Rn*Ynp1^2 + 2*Rn*Ynp1 + Rnp1^2*Xn^2 + Rnp1^2*Yn^2 - 2*Rnp1^2*Yn + Rnp1^2 - 2*Rnp1*Xn^2 + 2*Rnp1*Xn*Xnp1 - 2*Rnp1*Yn^2 + 2*Rnp1*Yn*Ynp1 + 2*Rnp1*Yn - 2*Rnp1*Ynp1 - Xn^2*Ynp1^2 + 2*Xn^2*Ynp1 + 2*Xn*Xnp1*Yn*Ynp1 - 2*Xn*Xnp1*Yn - 2*Xn*Xnp1*Ynp1 - Xnp1^2*Yn^2 + 2*Xnp1^2*Yn + Yn^2 - 2*Yn*Ynp1 + Ynp1^2)), (Rn^3*Rnp1*Ynp1 - Rn^3*Rnp1 - Rn^3*Ynp1 + Rn^3 - Rn^2*Rnp1^2*Yn - Rn^2*Rnp1^2*Ynp1 + 2*Rn^2*Rnp1^2 + 2*Rn^2*Rnp1*Yn - Rn^2*Rnp1*Ynp1 - Rn^2*Rnp1 - Rn^2*Xn*Xnp1*Ynp1 + Rn^2*Xn*Xnp1 + Rn^2*Xnp1^2*Yn + Rn^2*Xnp1^2*Ynp1 - Rn^2*Yn + Rn^2*Ynp1^3 - Rn^2*Ynp1^2 + Rn^2*Ynp1 + Rn*Rnp1^3*Yn - Rn*Rnp1^3 - Rn*Rnp1^2*Yn + 2*Rn*Rnp1^2*Ynp1 - Rn*Rnp1^2 - Rn*Rnp1*Xn^2*Ynp1 + Rn*Rnp1*Xn^2 - 4*Rn*Rnp1*Xn*Xnp1 - Rn*Rnp1*Xnp1^2*Yn + Rn*Rnp1*Xnp1^2 - Rn*Rnp1*Yn^2*Ynp1 + Rn*Rnp1*Yn^2 - Rn*Rnp1*Yn*Ynp1^2 + Rn*Rnp1*Ynp1^2 + Rn*Xn^2*Ynp1 - Rn*Xn^2 + 2*Rn*Xn*Xnp1*Ynp1 + 2*Rn*Xn*Xnp1 - Rn*Xnp1^2*Yn - 2*Rn*Xnp1^2*Ynp1 - Rn*Xnp1^2 + Rn*Xnp1*term + Rn*Yn^2*Ynp1 - Rn*Yn^2 + Rn*Yn*Ynp1^2 - 2*Rn*Ynp1^3 + Rn*Ynp1^2 - Rnp1^3*Yn + Rnp1^3 + Rnp1^2*Xn^2*Yn + Rnp1^2*Xn^2*Ynp1 - Rnp1^2*Xn*Xnp1*Yn + Rnp1^2*Xn*Xnp1 + Rnp1^2*Yn^3 - Rnp1^2*Yn^2 + Rnp1^2*Yn - Rnp1^2*Ynp1 - 2*Rnp1*Xn^2*Yn - Rnp1*Xn^2*Ynp1 - Rnp1*Xn^2 + 2*Rnp1*Xn*Xnp1*Yn + 2*Rnp1*Xn*Xnp1 - Rnp1*Xn*term + Rnp1*Xnp1^2*Yn - Rnp1*Xnp1^2 - 2*Rnp1*Yn^3 + Rnp1*Yn^2*Ynp1 + Rnp1*Yn^2 + Rnp1*Yn*Ynp1^2 - Rnp1*Ynp1^2 + Xn^3*Xnp1*Ynp1 - Xn^3*Xnp1 - Xn^2*Xnp1^2*Yn - Xn^2*Xnp1^2*Ynp1 + 2*Xn^2*Xnp1^2 + Xn^2*Yn - Xn^2*Ynp1^3 + Xn^2*Ynp1^2 + Xn^2*Ynp1 + Xn*Xnp1^3*Yn - Xn*Xnp1^3 + Xn*Xnp1*Yn^2*Ynp1 - Xn*Xnp1*Yn^2 + Xn*Xnp1*Yn*Ynp1^2 - 2*Xn*Xnp1*Yn - Xn*Xnp1*Ynp1^2 - 2*Xn*Xnp1*Ynp1 + Xn*term - Xnp1^2*Yn^3 + Xnp1^2*Yn^2 + Xnp1^2*Yn + Xnp1^2*Ynp1 - Xnp1*term + Yn^3 - Yn^2*Ynp1 - Yn*Ynp1^2 + Ynp1^3)/(2*(Rn^2*Xnp1^2 + Rn^2*Ynp1^2 - 2*Rn^2*Ynp1 + Rn^2 - 2*Rn*Rnp1*Xn*Xnp1 - 2*Rn*Rnp1*Yn*Ynp1 + 2*Rn*Rnp1*Yn + 2*Rn*Rnp1*Ynp1 - 2*Rn*Rnp1 + 2*Rn*Xn*Xnp1 - 2*Rn*Xnp1^2 + 2*Rn*Yn*Ynp1 - 2*Rn*Yn - 2*Rn*Ynp1^2 + 2*Rn*Ynp1 + Rnp1^2*Xn^2 + Rnp1^2*Yn^2 - 2*Rnp1^2*Yn + Rnp1^2 - 2*Rnp1*Xn^2 + 2*Rnp1*Xn*Xnp1 - 2*Rnp1*Yn^2 + 2*Rnp1*Yn*Ynp1 + 2*Rnp1*Yn - 2*Rnp1*Ynp1 - Xn^2*Ynp1^2 + 2*Xn^2*Ynp1 + 2*Xn*Xnp1*Yn*Ynp1 - 2*Xn*Xnp1*Yn - 2*Xn*Xnp1*Ynp1 - Xnp1^2*Yn^2 + 2*Xnp1^2*Yn + Yn^2 - 2*Yn*Ynp1 + Ynp1^2)), sqrt(-(Rn^2 - 2*Rn - Xn^2 - Yn^2 + 2*Yn)*(Rnp1^2 - 2*Rnp1 - Xnp1^2 - Ynp1^2 + 2*Ynp1)*(Rn^2 - 2*Rn*Rnp1 + Rnp1^2 - Xn^2 + 2*Xn*Xnp1 - Xnp1^2 - Yn^2 + 2*Yn*Ynp1 - Ynp1^2))*(Xn*Ynp1 - Xn - Xnp1*Yn + Xnp1)/(2*(Rn^2*Xnp1^2 + Rn^2*Ynp1^2 - 2*Rn^2*Ynp1 + Rn^2 - 2*Rn*Rnp1*Xn*Xnp1 - 2*Rn*Rnp1*Yn*Ynp1 + 2*Rn*Rnp1*Yn + 2*Rn*Rnp1*Ynp1 - 2*Rn*Rnp1 + 2*Rn*Xn*Xnp1 - 2*Rn*Xnp1^2 + 2*Rn*Yn*Ynp1 - 2*Rn*Yn - 2*Rn*Ynp1^2 + 2*Rn*Ynp1 + Rnp1^2*Xn^2 + Rnp1^2*Yn^2 - 2*Rnp1^2*Yn + Rnp1^2 - 2*Rnp1*Xn^2 + 2*Rnp1*Xn*Xnp1 - 2*Rnp1*Yn^2 + 2*Rnp1*Yn*Ynp1 + 2*Rnp1*Yn - 2*Rnp1*Ynp1 - Xn^2*Ynp1^2 + 2*Xn^2*Ynp1 + 2*Xn*Xnp1*Yn*Ynp1 - 2*Xn*Xnp1*Yn - 2*Xn*Xnp1*Ynp1 - Xnp1^2*Yn^2 + 2*Xnp1^2*Yn + Yn^2 - 2*Yn*Ynp1 + Ynp1^2)) - (Rn^3*Xnp1^2 + Rn^3*Ynp1^2 - 2*Rn^3*Ynp1 + Rn^3 - Rn^2*Rnp1*Xn*Xnp1 - Rn^2*Rnp1*Yn*Ynp1 + Rn^2*Rnp1*Yn + Rn^2*Rnp1*Ynp1 - Rn^2*Rnp1 + Rn^2*Xn*Xnp1 - Rn^2*Xnp1^2 + Rn^2*Yn*Ynp1 - Rn^2*Yn - Rn^2*Ynp1^2 + Rn^2*Ynp1 - Rn*Rnp1^2*Xn*Xnp1 - Rn*Rnp1^2*Yn*Ynp1 + Rn*Rnp1^2*Yn + Rn*Rnp1^2*Ynp1 - Rn*Rnp1^2 - Rn*Xn^2*Xnp1^2 - Rn*Xn^2*Ynp1^2 + 2*Rn*Xn^2*Ynp1 - Rn*Xn^2 + Rn*Xn*Xnp1^3 + Rn*Xn*Xnp1*Ynp1^2 - 2*Rn*Xn*Xnp1*Ynp1 + 2*Rn*Xn*Xnp1 - Rn*Xnp1^2*Yn^2 + Rn*Xnp1^2*Yn*Ynp1 + Rn*Xnp1^2*Yn - Rn*Xnp1^2*Ynp1 - Rn*Xnp1^2 - Rn*Yn^2*Ynp1^2 + 2*Rn*Yn^2*Ynp1 - Rn*Yn^2 + Rn*Yn*Ynp1^3 - Rn*Yn*Ynp1^2 - Rn*Ynp1^3 + Rn*Ynp1^2 + Rnp1^3*Xn^2 + Rnp1^3*Yn^2 - 2*Rnp1^3*Yn + Rnp1^3 - Rnp1^2*Xn^2 + Rnp1^2*Xn*Xnp1 - Rnp1^2*Yn^2 + Rnp1^2*Yn*Ynp1 + Rnp1^2*Yn - Rnp1^2*Ynp1 + Rnp1*Xn^3*Xnp1 - Rnp1*Xn^2*Xnp1^2 + Rnp1*Xn^2*Yn*Ynp1 - Rnp1*Xn^2*Yn - Rnp1*Xn^2*Ynp1^2 + Rnp1*Xn^2*Ynp1 - Rnp1*Xn^2 + Rnp1*Xn*Xnp1*Yn^2 - 2*Rnp1*Xn*Xnp1*Yn + 2*Rnp1*Xn*Xnp1 - Rnp1*Xnp1^2*Yn^2 + 2*Rnp1*Xnp1^2*Yn - Rnp1*Xnp1^2 + Rnp1*Yn^3*Ynp1 - Rnp1*Yn^3 - Rnp1*Yn^2*Ynp1^2 - Rnp1*Yn^2*Ynp1 + Rnp1*Yn^2 + 2*Rnp1*Yn*Ynp1^2 - Rnp1*Ynp1^2 - Xn^3*Xnp1 + 2*Xn^2*Xnp1^2 - Xn^2*Yn*Ynp1 + Xn^2*Yn + Xn^2*Ynp1 - Xn*Xnp1^3 - Xn*Xnp1*Yn^2 + 4*Xn*Xnp1*Yn*Ynp1 - 2*Xn*Xnp1*Yn - Xn*Xnp1*Ynp1^2 - 2*Xn*Xnp1*Ynp1 - Xnp1^2*Yn*Ynp1 + Xnp1^2*Yn + Xnp1^2*Ynp1 - Yn^3*Ynp1 + Yn^3 + 2*Yn^2*Ynp1^2 - Yn^2*Ynp1 - Yn*Ynp1^3 - Yn*Ynp1^2 + Ynp1^3)/(2*(Rn^2*Xnp1^2 + Rn^2*Ynp1^2 - 2*Rn^2*Ynp1 + Rn^2 - 2*Rn*Rnp1*Xn*Xnp1 - 2*Rn*Rnp1*Yn*Ynp1 + 2*Rn*Rnp1*Yn + 2*Rn*Rnp1*Ynp1 - 2*Rn*Rnp1 + 2*Rn*Xn*Xnp1 - 2*Rn*Xnp1^2 + 2*Rn*Yn*Ynp1 - 2*Rn*Yn - 2*Rn*Ynp1^2 + 2*Rn*Ynp1 + Rnp1^2*Xn^2 + Rnp1^2*Yn^2 - 2*Rnp1^2*Yn + Rnp1^2 - 2*Rnp1*Xn^2 + 2*Rnp1*Xn*Xnp1 - 2*Rnp1*Yn^2 + 2*Rnp1*Yn*Ynp1 + 2*Rnp1*Yn - 2*Rnp1*Ynp1 - Xn^2*Ynp1^2 + 2*Xn^2*Ynp1 + 2*Xn*Xnp1*Yn*Ynp1 - 2*Xn*Xnp1*Yn - 2*Xn*Xnp1*Ynp1 - Xnp1^2*Yn^2 + 2*Xnp1^2*Yn + Yn^2 - 2*Yn*Ynp1 + Ynp1^2)));
end

   乙 (1.33333, 2.00000, 0.66667)
   丙 (1.33333, 1.00000, 0.33333)
   丁 (1.09091, 0.54545, 0.18182)
   戊 (0.88889, 0.33333, 0.11111)
   己 (0.74074, 0.22222, 0.07407)
   子 (0.53333, 2.00000, 0.13333) 元の単位で 5.06667 寸
   丑 (1.04348, 1.30435, 0.08696) 元の単位で 3.30435 寸
   寅 (1.02564, 0.76923, 0.05128) 元の単位で 1.94872 寸
   卯 (0.88889, 0.47619, 0.03175) 元の単位で 1.20635 寸
   辰 (0.75789, 0.31579, 0.02105) 元の単位で 0.80000 寸

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
   plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   R0 = 2  # 大円の半径
   R1 = R0 // 2  # 甲円の半径
   X2, Y2, R2 = (4//3, 2//1, 2//3)
   XnA = zeros(6)
   YnA = zeros(6)
   RnA = zeros(6)
   plot()
   circle(0, R0, R0, :black)
   circle(0, R1, R1, :blue)
   circle(0, 3R1, R1, :green)
   circle(X2, Y2, R2, :green)
   circle(-X2, Y2, R2, :green)
   (XnA[1], YnA[1], RnA[1]) = (Xn, Yn, Rn) = (X2, Y2, R2)
   large = Char["乙丙丁戊己 "...]
   for i = 1:5
       @printf("%s (%.5f, %.5f, %.5f)\n", large[i], Xn, Yn, Rn)
       circle(Xn, Yn, Rn, :green)
       circle(-Xn, Yn, Rn, :green)
       more && point(Xn, Yn, "  " * large[i], mark=false)
       i == 5 && break
       (XnA[i+1], YnA[i+1], RnA[i+1]) = (Xn, Yn, Rn) = NEXTCIRCLE(Xn, Yn, Rn)
   end
   (xn, yn, rn) = x2.evalf(), y2.evalf(), r2.evalf()
   circle(xn, yn, rn, :blue, fill=true)
   circle(-xn, yn, rn, :blue, fill=true)
   more && point(xn, yn, "子  ", :blue, :right, mark=false)
   small = Char["子丑寅卯辰"...]
   @printf("%s (%.5f, %.5f, %.5f) 元の単位で %.5f 寸\n", small[1], xn, yn, rn, 2rn * 76 / 4)
   for i = 1:4
       (xn, yn, rn) = nextcircle(XnA[i], YnA[i], RnA[i], XnA[i+1], YnA[i+1], RnA[i+1])
       @printf("%s (%.5f, %.5f, %.5f) 元の単位で %.5f 寸\n", small[i+1], xn, yn, rn, 2rn * 76 / 4)
       circle(xn, yn, rn, :blue, fill=true)
       circle(-xn, yn, rn, :blue, fill=true)
       more && i < 5 && point(xn, yn, small[i+1] * " ", :blue, :right, :bottom, mark=false)
   end
   if more == true
       point(0, 0, "O ", :green, :right, :bottom)
       point(0, R1, "R1 ", :green, :right, :bottom)
       point(0, R0, "R0=2R1", :green, :center, :bottom)
       point(0, R0+R1, "3R1 ", :green, :right, :bottom)
       point(0, 2R0, "2R0 ", :green, :right, :bottom)
       point(0, 3R1, " 甲", :green, mark=false)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
      plot!(showaxis=false)
   end
end;

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村