算額あれこれ

算額問題をコンピュータで解きます

算額(その179)

長野県上田市別所温泉 北向観音堂 安永7年(1778)

中村信弥「改訂増補 長野県の算額」(P.29)
http://www.wasan.jp/zoho/zoho.html
キーワード:累円,外円
#Julia #SymPy #算額 #和算 #数学


大円の中に天円 2 個,地円 2 個,人円 4 個を容れる。大円の径は 216 寸である。天, 地, 人, 甲, 乙, 丙, 丁, 戊, 己, 庚, 辛, 壬, 癸, 乾, 兌, 離, 震, 巽, 坎, 艮, 坤の各円の径を求めよ。

大,天,地,人円の半径と中心座標を \( (R,\ 0,\ 0),\ (r_1,\ r_1,\ 0),\ (r_2,\ 0,\ R - r_2),\ (r_3,\ x_3,\ y_3)\) とおき,以下の連立方程式を解く。

include("julia-source.txt");  # julia-source.txt ソース

using SymPy

@syms R::positive, r1::positive, r2::positive,
   r3::positive, x3::positive, y3::positive,
   r4::positive, x4::positive, y4::positive,
   r5::positive, x5::positive, y5::positive,
   r6::positive, x6::positive, y6::positive

R = 216 // 2
r1 = R // 2
eq1 = r1^2 + (R - r2)^2 - (r1 + r2)^2  # 天円と地円が外接する
eq2 = (r1 - x3)^2 + y3^2 - (r1 + r3)^2  # 天円と人円が外接する
eq3 = x3^2 + (R - r2 - y3)^2 - (r2 + r3)^2  # 地円と人円が外接する
eq4 = x3^2 + y3^2 - (R - r3)^2;  # 人円が外円に内接する

eq5 = (x4 - x3)^2 + (y3 - y4)^2 - (r3 + r4)^2  # 円と次の円が外接する
eq6 = x4^2 + y4^2 - (R - r4)^2                 # 次の円が外円に内接する
eq7 = (x4 - r1)^2 + y4^2 - (r1 + r4)^2         # 天円と次の円が外接する

eq8 = (x5 - x4)^2 + (y4 - y5)^2 - (r4 + r5)^2
eq9 = x5^2 + y5^2 - (R - r5)^2
eq10 = (x5 - r1)^2 + y5^2 - (r1 + r5)^2

eq11 = (x6 - x5)^2 + (y5 - y6)^2 - (r5 + r6)^2
eq12 = x6^2 + y6^2 - (R - r6)^2
eq13 = (x6 - r1)^2 + y6^2 - (r1 + r6)^2;

eq1 ~ eq4 を解いて \(r_2,\ r_3,\ x_3,\ y_3\) を得る。

res = solve([eq1, eq2, eq3, eq4], (r2, r3, x3, y3))[1]

    (36, 18, 54, 72)

eq1 ~ eq13 を解くと \(r_2,\ r_3,\ x_3,\ y_3,\ r_4,\ x_4,\ y_4,\ r_5,\ x_5,\ y_5,\ r_6,\ x_6,\ y_6\) が得られる(1組目が適解)。

res = solve([eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8, eq9, eq10,
      eq11, eq12, eq13],
  (r2, r3, x3, y3, r4, x4, y4, r5, x5, y5, r6, x6, y6))

   3-element Vector{NTuple{13, Sym}}:
    (36, 18, 54, 72, 108/11, 864/11, 648/11, 6, 90, 48, 4, 96, 40)
    (36, 18, 54, 72, 108/11, 864/11, 648/11, 6, 90, 48, 108/11, 864/11, 648/11)
    (36, 18, 54, 72, 108/11, 864/11, 648/11, 18, 54, 72, 108/11, 864/11, 648/11)

eq5, eq6, eq7 と eq8, eq9, eq10 を見れば,3つの連立方程式は漸化式になっている。そこで,以下の 3 連立方程式を \(r_i,\ x_i,\ y_i\) について,現在の円から次の円の半径,と中心座標を求める関数を定義する。

@syms ri, xi, yi, rip1, xip1, yip1
eq01 = (xip1 - xi)^2 + (yi - yip1)^2 - (ri + rip1)^2
eq02 = xip1^2 + yip1^2 - (R - rip1)^2
eq03 = (xip1 - r1)^2 + yip1^2 - (r1 + rip1)^2
res0 = solve([eq01, eq02, eq03], (rip1, xip1, yip1)) 

以下がその関数である。現在注目している円の半径,中心座標から,次の円の半径,中心座標を求める。

nextcircle(ri, xi, yi) = return ( (-ri^3 + 3*ri^2*xi - 108*ri^2 + ri*xi^2 - 216*ri*xi + ri*yi^2 + 11664*ri - 3*xi^3 + 756*xi^2 - 3*xi*yi^2 - 58320*xi + 540*yi^2 - 2*sqrt(2)*yi*sqrt(-ri^4 - 108*ri^3 + 2*ri^2*xi^2 - 108*ri^2*xi + 2*ri^2*yi^2 + 11664*ri^2 + 108*ri*xi^2 - 23328*ri*xi + 108*ri*yi^2 + 1259712*ri - xi^4 + 108*xi^3 - 2*xi^2*yi^2 + 11664*xi^2 + 108*xi*yi^2 - 1259712*xi - yi^4 + 11664*yi^2) + 1259712)/(2*(ri^2 - 6*ri*xi + 216*ri + 9*xi^2 - 648*xi + 8*yi^2 + 11664)), 3*(ri^3 - 3*ri^2*xi + 180*ri^2 - ri*xi^2 - 216*ri*xi - ri*yi^2 + 3888*ri + 3*xi^3 - 108*xi^2 + 3*xi*yi^2 + 11664*xi + 36*yi^2 + 2*sqrt(2)*yi*sqrt(-ri^4 - 108*ri^3 + 2*ri^2*xi^2 - 108*ri^2*xi + 2*ri^2*yi^2 + 11664*ri^2 + 108*ri*xi^2 - 23328*ri*xi + 108*ri*yi^2 + 1259712*ri - xi^4 + 108*xi^3 - 2*xi^2*yi^2 + 11664*xi^2 + 108*xi*yi^2 - 1259712*xi - yi^4 + 11664*yi^2) - 419904)/(2*(ri^2 - 6*ri*xi + 216*ri + 9*xi^2 - 648*xi + 8*yi^2 + 11664)), -4*yi*(ri^2 + 54*ri - xi^2 + 54*xi - yi^2 - 5832)/(ri^2 - 6*ri*xi + 216*ri + 9*xi^2 - 648*xi + 8*yi^2 + 11664) + sqrt(2)*sqrt(-(ri^2 - 108*ri - xi^2 + 108*xi - yi^2)*(ri^2 + 216*ri - xi^2 - yi^2 + 11664))*(ri - 3*xi + 108)/(ri^2 - 6*ri*xi + 216*ri + 9*xi^2 - 648*xi + 8*yi^2 + 11664));

人円を初期値として,甲,乙,丙...と求める。ここで,\(R\) を外円の半径 108 として順次求められる円の半径 \(r\) で割ったもの \(R/r\) が整数で,規則があることがわかる。すなわち,外円の半径と \(i\) 番目の円の半径の比は \(i^2 + 2i + 3\) である。

R = 108
(r, x, y) = (18, 54, 72)
@printf("i = 1;  r = %g;  R/r = %g\n", r, R/r)
for i = 2:10
   (r, x, y) = nextcircle(r, x, y)
   println("i = %d;  r = %g;  R/r = %g, %g\n", i, r, round(Int, R/r), i^2+2i+3)
end

   i = 1;  r = 18;  R/r = 6.0
   i = 2;  r = 9.818181818181818;  R/r = 11, 11
   i = 3;  r = 5.999999999999991;  R/r = 18, 18
   i = 4;  r = 4.0;  R/r = 27, 27
   i = 5;  r = 2.8421052631578947;  R/r = 38, 38
   i = 6;  r = 2.117647058823516;  R/r = 51, 51
   i = 7;  r = 1.6363636363636425;  R/r = 66, 66
   i = 8;  r = 1.3012048192770946;  R/r = 83, 83
   i = 9;  r = 1.058823529411749;  R/r = 102, 102
   i = 10;  r = 0.8780487804877857;  R/r = 123, 123

人円から始めて,乾,兌,離,震,巽,坎,艮,坤についても同様に行う。

using SymPy
@syms R, r1, r2, r3, x3, y3, r4, x4, y4

R = 216 // 2
r1 = R // 2
eq1 = r1^2 + (R - r2)^2 - (r1 + r2)^2  # 天円と地円が外接する
eq2 = (r1 - x3)^2 + y3^2 - (r1 + r3)^2  # 天円と人円が外接する
eq3 = x3^2 + (R - r2 - y3)^2 - (r2 + r3)^2  # 地円と人円が外接する
eq4 = x3^2 + y3^2 - (R - r3)^2;  # 人円が外円に内接する
eq5 = (x3 - x4)^2 + (y4 - y3)^2 - (r3 + r4)^2  # 円と次の円が外接する
eq6 = x4^2 + y4^2 - (R - r4)^2                 # 次の円が外円に内接する
eq7 = x4^2 + (y4 - R + r2)^2 - (r2 + r4)^2     # 地円と次の円が外接する

res = solve([eq1, eq2, eq3, eq4, eq5, eq6, eq7], (r2, r3, x3, y3, r4, x4, y4))

   4-element Vector{NTuple{7, Sym}}:
    (36, 18, 54, 72, 54/7, 270/7, 648/7)
    (36, 18, 54, 72, 54, 54, 0)
    (36, 54, -54, 0, 18, -54, 72)
    (36, 54, -54, 0, 54, 54, 0)

@syms r3, x3, y3, r4, x4, x5
r2 = 36
eq5 = (x3 - x4)^2 + (y4 - y3)^2 - (r3 + r4)^2  # 円と次の円が外接する
eq6 = x4^2 + y4^2 - (R - r4)^2                 # 次の円が外円に内接する
eq7 = x4^2 + (y4 - R + r2)^2 - (r2 + r4)^2     # 地円と次の円が外接する
solve([eq5, eq6, eq7], (r4, x4, y4))

nextcircle2(r3, x3, y3) = return ( (-r3^3 + 2*r3^2*y3 - 108*r3^2 + r3*x3^2 + r3*y3^2 - 216*r3*y3 + 11664*r3 - 2*x3^2*y3 + 324*x3^2 - sqrt(3)*x3*sqrt(-r3^4 - 144*r3^3 + 2*r3^2*x3^2 + 2*r3^2*y3^2 - 144*r3^2*y3 + 7776*r3^2 + 144*r3*x3^2 + 144*r3*y3^2 - 31104*r3*y3 + 1679616*r3 - x3^4 - 2*x3^2*y3^2 + 144*x3^2*y3 + 7776*x3^2 - y3^4 + 144*y3^3 + 7776*y3^2 - 1679616*y3 + 45349632) - 2*y3^3 + 540*y3^2 - 46656*y3 + 1259712)/(2*(r3^2 - 4*r3*y3 + 216*r3 + 3*x3^2 + 4*y3^2 - 432*y3 + 11664)), (-3*r3^2*x3 - 216*r3*x3 + sqrt(3)*r3*sqrt(-r3^4 - 144*r3^3 + 2*r3^2*x3^2 + 2*r3^2*y3^2 - 144*r3^2*y3 + 7776*r3^2 + 144*r3*x3^2 + 144*r3*y3^2 - 31104*r3*y3 + 1679616*r3 - x3^4 - 2*x3^2*y3^2 + 144*x3^2*y3 + 7776*x3^2 - y3^4 + 144*y3^3 + 7776*y3^2 - 1679616*y3 + 45349632) + 3*x3^3 + 3*x3*y3^2 - 216*x3*y3 + 11664*x3 - 2*sqrt(3)*y3*sqrt(-r3^4 - 144*r3^3 + 2*r3^2*x3^2 + 2*r3^2*y3^2 - 144*r3^2*y3 + 7776*r3^2 + 144*r3*x3^2 + 144*r3*y3^2 - 31104*r3*y3 + 1679616*r3 - x3^4 - 2*x3^2*y3^2 + 144*x3^2*y3 + 7776*x3^2 - y3^4 + 144*y3^3 + 7776*y3^2 - 1679616*y3 + 45349632) + 108*sqrt(3)*sqrt(-r3^4 - 144*r3^3 + 2*r3^2*x3^2 + 2*r3^2*y3^2 - 144*r3^2*y3 + 7776*r3^2 + 144*r3*x3^2 + 144*r3*y3^2 - 31104*r3*y3 + 1679616*r3 - x3^4 - 2*x3^2*y3^2 + 144*x3^2*y3 + 7776*x3^2 - y3^4 + 144*y3^3 + 7776*y3^2 - 1679616*y3 + 45349632))/(2*(r3^2 - 4*r3*y3 + 216*r3 + 3*x3^2 + 4*y3^2 - 432*y3 + 11664)), sqrt(3)*x3*sqrt(-(-r3^2 - 216*r3 + x3^2 + y3^2 - 11664)*(-r3^2 + 72*r3 + x3^2 + y3^2 - 144*y3 + 3888))/(r3^2 - 4*r3*y3 + 216*r3 + 3*x3^2 + 4*y3^2 - 432*y3 + 11664) + (r3^3 - 2*r3^2*y3 + 216*r3^2 - r3*x3^2 - r3*y3^2 - 216*r3*y3 + 11664*r3 + 2*x3^2*y3 + 2*y3^3 - 108*y3^2)/(r3^2 - 4*r3*y3 + 216*r3 + 3*x3^2 + 4*y3^2 - 432*y3 + 11664));

R = 108
r2 = 36
(r, x, y) = (54/7, 270/7, 648/7)
for i = 1:10
   println("%d, r = %g, x = %g, y = %g, %g, %g\n"), i, r, x, y, R/r, R/(2i^2 + 6i + 6))
   (r, x, y) = nextcircle2(r, x, y)
end

   1, r = 7.714285714285714, x = 38.57142857142857, y = 92.57142857142857, 14.0, 7.714285714285714
   2, r = 4.153846153846184, x = 29.076923076923112, y = 99.69230769230774, 25.999999999999808, 4.153846153846154
   3, r = 2.571428571428608, x = 23.142857142857242, y = 102.85714285714286, 41.9999999999994, 2.5714285714285716
   4, r = 1.741935483871028, x = 19.16129032258083, y = 104.51612903225802, 61.99999999999786, 1.7419354838709677
   5, r = 1.2558139534883404, x = 16.32558139534871, y = 105.48837209302322, 86.00000000000217, 1.255813953488372
   6, r = 0.9473684210525465, x = 14.210526315789048, y = 106.10526315789478, 114.00000000001025, 0.9473684210526315
   7, r = 0.7397260273971918, x = 12.575342465752794, y = 106.52054794520554, 146.0000000000135, 0.7397260273972602
   8, r = 0.5934065934064815, x = 11.274725274724002, y = 106.81318681318686, 182.00000000003433, 0.5934065934065934
   9, r = 0.48648648648640563, x = 10.216216216215297, y = 107.0270270270272, 222.0000000000369, 0.4864864864864865
   10, r = 0.40601503759393454, x = 9.338345864660884, y = 107.18796992481218, 266.000000000033, 0.40601503759398494

\(R/r\) の数列は \(2i^2 + 6i + 6\) である。したがって,\(r_i = R/(2i^2 + 6i + 6)\) である。

描画関数プログラムのソースを見る

function draw(more)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   R = 216 / 2
   r1 = R / 2
   (r2, r3, x3, y3) = (36, 18, 54, 72)
   @printf("地円の半径 = %g, 人円の半径 = %g", r2, r3)
   plot()
   circle(0, 0, R, :black)
   circle(r1, 0, r1, :red)
   circle(-r1, 0, r1, :red)
   circle(0, R - r2, r2, :blue)
   circle(0, -R + r2, r2, :blue)
   name1 = ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"]
   (r, x, y) = (r3, x3, y3)
   for i = 1:10
       @printf("%s円の半径 %g 中心座標 (%g, %g)\n", name1[i], r, x, y)
       circle(x, y, r, i)
       circle(x, -y, r, i)
       circle(-x, y, r, i)
       circle(-x, -y, r, i)
       (r, x, y) = nextcircle(r, x, y)
   end
   name2 = ["乾", "兌", "離", "震", "巽", "坎", "艮", "坤"]
   (r, x, y) = (54/7, 270/7, 648/7)
   for i = 1:8
       @printf("%s円の半径 %g, 中心座標 (%g, %g)\n", name2[i], r, x, y)
       circle4(x, y, r, i)
       (r, x, y) = nextcircle2(r, x, y)
   end
   if more
       point(0, 0, " O")
       point(r1, 0, " r1")
       point(R, 0, " R")
       point(0, R-r2, " R-r2")
       point(x3, y3, "(X3,y3,r3)")
       point(50, 25, "天円", mark=false)
       point(10, 85, "地円", mark=false)
       point(50, 85, "人円", mark=false)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   end
end;

draw(false)

   地円の半径 = 36, 人円の半径 = 18
   甲円の半径 18, 中心座標 54, 72
   乙円の半径 9.818181818181818, 中心座標 78.54545454545455, 58.90909090909091
   丙円の半径 5.999999999999991, 中心座標 90.0, 48.0
   丁円の半径 4.0, 中心座標 96.0, 40.0
   戊円の半径 2.8421052631578947, 中心座標 99.47368421052632, 34.10526315789474
   己円の半径 2.117647058823516, 中心座標 101.64705882352943, 29.64705882352941
   庚円の半径 1.6363636363636425, 中心座標 103.09090909090908, 26.181818181818187
   辛円の半径 1.3012048192770946, 中心座標 104.09638554216873, 23.421686746987955
   壬円の半径 1.058823529411749, 中心座標 104.82352941176475, 21.176470588235293
   癸円の半径 0.8780487804877857, 中心座標 105.36585365853662, 19.317073170731703
   乾円の半径 7.714285714285714, 中心座標 38.57142857142857, 92.57142857142857
   兌円の半径 4.153846153846184, 中心座標 29.076923076923112, 99.69230769230774
   離円の半径 2.571428571428608, 中心座標 23.142857142857242, 102.85714285714286
   震円の半径 1.741935483871028, 中心座標 19.16129032258083, 104.51612903225802
   巽円の半径 1.2558139534883404, 中心座標 16.32558139534871, 105.48837209302322
   坎円の半径 0.9473684210525465, 中心座標 14.210526315789048, 106.10526315789478
   艮円の半径 0.7397260273971918, 中心座標 12.575342465752794, 106.52054794520554
   坤円の半径 0.5934065934064815, 中心座標 11.274725274724002, 106.81318681318686


以下のアイコンをクリックして応援してください