裏 RjpWiki

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

算額(その180)

2023年03月27日 | Julia

算額(その180)

中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額1(56)
長野県長野市元善町 善光寺 寛政8年(1796)

第6問: 長方形内に 8 個の円を入れる。甲円の径が 17寸7分4厘 のとき,丙円の径を求めよ。

甲円の径を 100 倍して整数で取り扱う。長方形の長辺を 2x,甲円の半径は 887,乙円の半径を r1, 丙円の半径を r2 とする。以下のように連立方程式を立て,解く。

using SymPy
@syms x::positive, r2::positive, r1::positive

eq1 = (x - 887)^2 + (887 - r1)^2 - (r1 + 887)^2
eq2 = (x - 887 - r2)^2 + 887^2 - (887 + r2)^2
eq3 = r2^2 + (1774 - r1)^2 - (r1 + r2)^2
res = solve([eq1, eq2, eq3], (x, r1, r2))

   2-element Vector{Tuple{Sym, Sym, Sym}}:
    (-887*sqrt(5 + 4*sqrt(2)) + 887*sqrt(2) + 887*sqrt(10 + 8*sqrt(2)), -887*sqrt(10 + 8*sqrt(2)) + 887/2 + 2661*sqrt(5 + 4*sqrt(2))/2, -887*sqrt(5 + 4*sqrt(2)) + 887 + 1774*sqrt(2))
    (-887*sqrt(10 + 8*sqrt(2)) + 887*sqrt(2) + 887*sqrt(5 + 4*sqrt(2)), -2661*sqrt(5 + 4*sqrt(2))/2 + 887/2 + 887*sqrt(10 + 8*sqrt(2)), 887 + 1774*sqrt(2) + 887*sqrt(5 + 4*sqrt(2)))

最初の組の解が適解である。
丙円の半径 r2 は -887*sqrt(5 + 4*sqrt(2)) + 887 + 1774*sqrt(2)

直径は

2(-887*sqrt(5 + 4*sqrt(2)) + 887 + 1774*sqrt(2))

   1000.4355208571196

元の単位でいえば「10寸0分0厘あまりあり」ということである。

using Plots

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.25)
   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 draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (x, r1, r2) = res[1]
   println("丙円の径 = $(2r2) = $(2r2.evalf())")
   println("乙円の径 = $(2r1) = $(2r1.evalf())")
   println("長方形の長辺 = $(2x) = $(2x.evalf())")
   plot([x, x, -x, -x, x], [-1774, 1774, 1774, -1774, -1774], color=:black, lw=0.5)
   circle(x - 887, 887, 887)
   circle(x - 887, -887, 887)
   circle(-x + 887, 887, 887)
   circle(-x + 887, -887, 887)
   circle(0, 1774 - r1, r1, :blue)
   circle(0, -1774 + r1, r1, :blue)
   circle(r2, 0, r2, :orange)
   circle(-r2, 0, r2, :orange)
   if more == true
       point(x - 887, 887, "甲円 (x-887,887)", :green, :top)
       point(0, 1774 - r1, " 1774-r1")
       point(200, 1300, "乙円", mark=false)
       point(r2, 0, " r2")
       point(r2, 300, "丙円", mark=false)
       point(x, 0, " x")
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
      plot!(showaxis=false)
   end
end;

draw(false)

   丙円の径 = -1774*sqrt(5 + 4*sqrt(2)) + 1774 + 3548*sqrt(2) = 1000.43552085712
   乙円の径 = -1774*sqrt(10 + 8*sqrt(2)) + 887 + 2661*sqrt(5 + 4*sqrt(2)) = 1383.80591988999
   長方形の長辺 = -1774*sqrt(5 + 4*sqrt(2)) + 1774*sqrt(2) + 1774*sqrt(10 + 8*sqrt(2)) = 4907.60603898119

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

算額(その179)

2023年03月27日 | Julia

算額(その179)

長野県上田市別所温泉 北向観音堂 安永7年(1778)
中村信弥「改訂増補 長野県の算額」(29)

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

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

大,天,地,人円の半径と中心座標を (0, 0, R), (r1, 0, r1), (0, R-r2, r2), (x3, y3, r3) とする。以下のように連立方程式を立て,解く。

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 を解いて r2, r3, x3, y3 を得る。

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

   1-element Vector{NTuple{4, Sym}}:
    (36, 18, 54, 72)

eq1 ~ eq13 を解くと r2, r3, x3, y3, r4, x4, y4, r5, x5, y5, r6, x6, y6 が得られる(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 連立方程式を ri, xi, yi について,現在の円から次の円の半径,と中心座標を求める関数を定義する。

@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)
println("i = 1;  r = $r;  R/r = $(R/r)")
for i = 2:10
   (r, x, y) = nextcircle(r, x, y)
   println("i = $i;  r = $r;  R/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("$i, r = $r, x = $x, y = $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 である。したがって,ri = R/(2i^2 + 6i + 6) である。

using Plots

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.25)
   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 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)
   println("地円の半径 = $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
       println("$(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
       println("$(name2[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) = nextcircle2(r, x, y)
   end
   if more == true
       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)
   else
      plot!(showaxis=false)
   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

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

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

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