裏 RjpWiki

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

算額(その667)

2024年01月31日 | Julia

算額(その667)

長野市元善町 善光寺 寛政8年(1796)
中村信弥「改訂増補 長野県の算額」(p.56)

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

台形内に甲円が内接する直角三角形を入れる。乙円,丙円も台形の辺と直角三角形の辺に内接する。甲円,乙円,丙円の直径がそれぞれ 20寸,24寸,10寸のとき,甲円が内接する直角三角形の直覚を挟む二辺のうち短い方の辺(鈎)の長さはいかほどか。

甲円が内接する直角三角形の頂点座標を (b, 0), (0, c), (a, d) とする。
甲円の半径と中心座標を r1, (x1, y1)
乙円の半径と中心座標を r2, (r2, r2)
丙円の半径と中心座標を r3, (a - r3, r3)
とおき,以下の連立方程式を解く。
求めるべき,「甲円が内接する直角三角形の直覚を挟む二辺のうち短い方の辺(鈎)の長さ」は (b, 0), (a, d) を端点とする直線の長さ sqrt((a - b)^2 + d^2) である。

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

using SymPy
@syms a::positive, b::positive, c::positive, d::positive,
     x1::positive, y1::positive,
     r1::positive, r2::positive, r3::positive,
     鈎::positive, 股::positive, 弦::positive
弦 = sqrt(a^2 + (c - d)^2)
鈎 = sqrt((a - b)^2 + d^2)
股 = sqrt(b^2 + c^2)
eq1 = 鈎^2 + 股^2 - 弦^2 |> simplify
eq2 = 鈎 + 股 - 弦 - 2r1
eq3 = b + c - 股 - 2r2
eq4 = d + (a - b) - 鈎 -2r3
eq5 = dist(0, c, a, d, x1, y1) - r1^2
eq6 = dist(b, 0, a, d, x1, y1) - r1^2;
# res = solve([eq1, eq2, eq3, eq4, eq5, eq6], (a, b, c, d, x1, y1))

using NLsolve

function nls(func, params...; ini = [0.0])
   if typeof(ini) <: Number
       r = nlsolve((vout, vin) -> vout[1] = func(vin[1], params..., [ini]), ftol=big"1e-40")
       v = r.zero[1]
   else
       r = nlsolve((vout, vin)->vout .= func(vin, params...), ini, ftol=big"1e-40")
       v = r.zero
   end
   return v, r.f_converged
end;

function H(u)
   (a, b, c, d, x1, y1) = u
   return [
       -2*a*b + 2*b^2 + 2*c*d,  # eq1
       -2*r1 - sqrt(a^2 + (c - d)^2) + sqrt(b^2 + c^2) + sqrt(d^2 + (a - b)^2),  # eq2
       b + c - 2*r2 - sqrt(b^2 + c^2),  # eq3
       a - b + d - 2*r3 - sqrt(d^2 + (a - b)^2),  # eq4
       -r1^2 + (-a*(a*x1 + (-c + d)*(-c + y1))/(a^2 + (-c + d)^2) + x1)^2 + (-c + y1 - (-c + d)*(a*x1 + (-c + d)*(-c + y1))/(a^2 + (-c + d)^2))^2,  # eq5
       -r1^2 + (-d*(d*y1 + (a - b)*(-b + x1))/(d^2 + (a - b)^2) + y1)^2 + (-b + x1 - (a - b)*(d*y1 + (a - b)*(-b + x1))/(d^2 + (a - b)^2))^2,  # eq6
   ]
end;

(r1, r2, r3) = (20, 24, 10) .// 2
iniv = BigFloat[59, 46, 37, 22, 43, 15]
res = nls(H, ini=iniv)

   (BigFloat[63.00000000000000000000000000000000000000000000000000000000000000635922298913147, 48.00000000000000000000000000000000000000000000000000000000000001088653549950012, 35.99999999999999999999999999999999999999999999999999999999999998913806908318885, 20.00000000000000000000000000000000000000000000000000000000000000452357741848939, 46.00000000000000000000000000000000000000000000000000000000000000725087619460416, 13.99999999999999999999999999999999999999999999999999999999999999999791841656566], true)

「甲円が内接する直角三角形の直覚を挟む二辺のうち短い方の辺(鈎)の長さ」は (b, 0), (a, d) を端点とする線分の長さ sqrt((a - b)^2 + d^2) である。
a = 63, b = 48, d = 20 なので,線分の長さは 25 である。

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

   a = 63;  b = 48;  c = 36;  d = 20;  x1 = 46;  y1 = 14
   鈎 = 25;  股 = 60;  弦 = 65

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (a, b, c, d, x1, y1) = res[1]
   @printf("a = %g;  b = %g;  c = %g;  d = %g;  x1 = %g;  y1 = %g\n", a, b, c, d, x1, y1)
   鈎 = sqrt((a - b)^2 + d^2)
   股 = sqrt(b^2 + c^2)
   弦 = sqrt(a^2 + (c - d)^2)
   @printf("鈎 = %g;  股 = %g;  弦 = %g\n", 鈎, 股, 弦)
   plot([0, a, a, 0, 0], [0, 0, d, c, 0], color=:black, lw=0.5)
   plot!([0, b, a], [c, 0, d], color=:orange, lw=0.5)
   circle(x1, y1, r1)
   circle(r2, r2, r2, :blue)
   circle(a - r3, r3, r3, :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(x1, y1, "甲円:r1,(x1,y1)", :red, :center, delta=-delta/2)
       point(r2, r2, "乙円:r2,(r2,r2)", :blue, :center, delta=-delta/2)
       point(a - r3, r3, "丙円:r3,(a-r3,r3)", :black, :right, delta=-2delta)
       point(a, 0, " a", :black, :center, delta=-1.5delta)
       point(b, 0, " b", :black, :center, delta=-1.5delta)
       point(0, c, "c ", :black, :right, :vcenter)
       point(a, d, "(a,d)", :black, :center, :bottom, delta=2delta)
       plot!(xlims=(-3, 66), ylims=(-3, 37))
   end
end;

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

算額(その666)

2024年01月31日 | ブログラミング

算額(その666)

長野市元善町 善光寺 寛政8年(1796)
中村信弥「改訂増補 長野県の算額」(p.52)

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

三角形の中に全,大,中,小の正方形が入っている。底辺の長さが 48 寸,中正方形,小正方形の一辺の長さがそれぞれ,6寸,3寸のとき,大正方形の一辺の長さはいかほどか。

図のように記号を定め,相似比,正方形の一辺の長さについての連立方程式を解く。

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

using SymPy
@syms x1::positive, x2::positive, x3::positive, x4::positive, x5::positive, x6::positive,
     y1::positive, y2::positive, y3::positive, y4::positive,
     a::positive, b::positive, h::positive
a = 48
y1 = 6
eq1 = y1/x1 - h/b
eq2 = (y2 - y1)/(x2 - x1) - h/b
eq3 = (y3 - y2)/(x3 - x2) - h/b
eq4 = (h - y3)/(b - x3) - h/b  # 従属
eq5 = (h - y3)/(x4 - b) - h/(a - b)
eq6 = (y3 - y2)/(x5 - x4) - h/(a - b)
eq7 = (y2 - y4)/(x6 - x5) - h/(a - b)
eq8 = y4/(a - x6) - h/(a - b)  # 従属
eq9 = x2 - x1 - 6
eq10 = x5 - x2 - y2
eq11 = x6 - x5 - y4
eq12 = x4 - x3 - 3
eq13 = y3 - y2 - 3
res = solve([eq1, eq2, eq3, eq5, eq6, eq7, eq9, eq10, eq11, eq12, eq13],
   (x1, x2, x3, x4, x5, x6, y2, y3, y4, b, h))

   1-element Vector{NTuple{11, Sym}}:
    (6, 12, 15, 18, 24, 32, 12, 15, 8, 16, 16)

x1 = 6;  x2 = 12;  x3 = 15;  x4 = 18;  x5 = 24;  x6 = 32
y1 = 6;  y2 = 12;  y3 = 15;  y4 = 8;  a = 48;  b = 16;  h = 16
大正方形の一辺の長さ =x6-x5 = y4 = 8 である。

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   a = 48
   y1 = 6
   (x1, x2, x3, x4, x5, x6, y2, y3, y4, b, h) = (6, 12, 15, 18, 24, 32, 12, 15, 8, 16, 16)
   @printf("x1 = %g;  x2 = %g;  x3 = %g;  x4 = %g;  x5 = %g;  x6 = %g\n",
       x1, x2, x3, x4, x5, x6)
   @printf("y1 = %g;  y2 = %g;  y3 = %g;  y4 = %g;  a = %g;  b = %g;  h = %g\n",
       y1, y2, y3, y4, a, b, h)
   @printf("大正方形の一辺の長さ(x6-x5 = y4) = %g\n", y4)
   plot([0, a, b, 0], [0, 0, h, 0], color=:black, lw=0.5)
   rect(x1, 0, x2, y1, :blue)
   rect(x2, 0, x5, y2, :blue)
   rect(x3, y2, x4, y3, :blue)
   rect(x5, 0, x6, y4, :blue)
   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)
       vline!([x1, x2, x3, x4, x5, x6, b], color=:gray20, lw=0.1)
       hline!([y1, y2, y3, y4], color=:gray20, lw=0.1)
       point.([x1, x2, x3, x4, x5, x6, b], 0,
           ["x1", "x2", "x3", "x4", "x5", "x6", "b"],
           :blue, :center, delta=-2delta)
       point.(0, [y1, y2, y3, y4],
           ["y1 ", "y2 ", "y3 ", "y4 "],
           :blue, :right, :vcenter)
       point((x2 + x5)/2, y2/2, "全", :red, :center, :vcenter, mark=false)
       point((x5 + x6)/2, y4/2, "大", :red, :center, :vcenter, mark=false)
       point((x1 + x2)/2, y1/2, "中", :red, :center, :vcenter, mark=false)
       point((x3 + x4)/2, (y2 + y3)/2, "小", :red, :center, :vcenter, mark=false)
       point(a, 0, "a", :black, delta=-2delta)
       point(b, h, "(b,h)", :black, :center, :bottom, delta=2delta)
       plot!(xlims=(-3, 50), ylims=(-3, 19))
   end
end;

 

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

算額(その665)

2024年01月31日 | Julia

算額(その665)

長野市若穂 清水寺観音堂 寛政6年(1794)
中村信弥「改訂増補 長野県の算額」(p.45-46)

http://www.wasan.jp/zoho/zoho.html
キーワード:円2個,直角三角形,斜線
#Julia, #SymPy, #算額, #和算

直角三角形内に斜線と大円,小円を入れる。直角を挟む二辺(鈎と股)の和が 42 寸,斜辺(弦)の長さが 30 寸,大円の直径が 9 寸のとき,小円の直径を求めよ。

直角三角形の 3 辺の長さを,鈎,股,弦とおく。
大円の半径と中心座標を r1, (r1, y1)
小円の半径と中心座標を r2, (x2, r2)
斜線と斜辺の交点座標を (x, y)
斜線の長さを l, (x, y) と (0, 鈎) を結ぶ線分の長さを m
とおき,以下の連立方程式を解く。

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

using SymPy
@syms r1::positive, y1::positive, r2::positive,
     x2::positive, x::positive, y::positive,
     鈎::positive, 股::positive, 弦::positive
弦 = 30
鈎股の和 = 42
r1 = 9//2
l = sqrt(x^2 + y^2)
m = sqrt(x^2 + (鈎 - y)^2)
eq1 = y/(股 - x) - 鈎/股
eq2 = 鈎 + 股 - 鈎股の和
eq3 = 鈎^2 + 股^2 - 弦^2
eq4 = (鈎 + l + m)*r1 +(弦 - m + l + 股)*r2 - 鈎*股
eq5 = dist(0, 鈎, 股, 0, r1, y1) - r1^2
eq6 = dist(0, 鈎, 股, 0, x2, r2) - r2^2
eq7 = dist(0, 0, x, y, r1, y1) - r1^2
res = solve([eq1, eq2, eq3, eq4, eq5, eq6, eq7],
   (鈎, 股, y1, r2, x2, x, y))

   8-element Vector{NTuple{7, Sym}}:
    (18, 24, 9, 4, 12, 12, 9)
    (18, 24, 9, 4, 76/3, 12, 9)
    (18, 24, 81/4, 1443/352, 4119/352, 81/13, 693/52)
    (18, 24, 81/4, 1443/352, 8929/352, 81/13, 693/52)
    (24, 18, 21/2, 4, 10, 21/2, 10)
    (24, 18, 21/2, 4, 20, 21/2, 10)
    (24, 18, 51/2, 117/32, 171/16, 153/26, 210/13)
    (24, 18, 51/2, 117/32, 1269/64, 153/26, 210/13)

解は 8 組得られるが,最初のものが適解である。
小円の直径は 8 寸である。
その他のパラメータは以下の通りである。
鈎 = 18;  股 = 24;  y1 = 9;  r2 = 4;  x2 = 12;  x = 12;  y = 9

なお,5 番目のものも(普通は「鈎<股」なので),図を y = x の直線で裏返せば最初のものとは異なる図形が得られる。
ただし,大円と小円の位置が異なるので,適解とはいえない。
小円の直径 = 8;  鈎 = 24;  股 = 18;  y1 = 10.5;  r2 = 4;  x2 = 10;  x = 10.5;  y = 10

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (鈎, 股, y1, r2, x2, x, y) = res[n]
   弦 = 30
   鈎股 = 42
   r1 = 9//2
   l = sqrt(x^2 + y^2)
   m = sqrt(x^2 + (鈎 - y)^2)
   @printf("小円の直径 = %g;  鈎 = %g;  股 = %g;  y1 = %g;  r2 = %g;  x2 = %g;  x = %g;  y = %g\n",
           2r2, 鈎, 股, y1, r2, x2, x, y)
   plot([0, 股, 0, 0], [0, 0, 鈎, 0], color=:black, lw=0.5)
   circle(r1, y1, r1)
   circle(x2, r2, r2, :blue)
   segment(0, 0, x, y)
   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, y1, "大円:r1,(r1,y1)", :red, :center, delta=-delta)
       point(x2, r2, "小円:r2,(x2,r2)", :blue, :center, delta=-delta)
       point(x, y, " (x,y)", :black, :left, :bottom)
       point(0, 鈎, " 鈎", :black, :left, :bottom)
       point(股, 0, " 股", :black, :left, :bottom)
       plot!(xlims=(-1, 26))
   end
end;

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

算額(その664)

2024年01月30日 | Julia

算額(その664)

北海道函館市谷地頭町 函館八幡宮 文化2年(1805)
中村信弥「幻の算額」

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

正方形の中に半円 2 個と容円 1 個が入っている容円の直径を「黒積」で表わせ。

黒積とは,名前とは相反して「図形の背景の空白領域の面積」を表すことが常識的であるようだ。この問題の場合は,正方形の内部の半円,容円以外の部分,図で灰色で示した部分の面積を指す。

半円の半径と中心座標を r1, (2r1, r1)
容円の半径と中心座標を r2, (r2, r2)
黒積を A とする。
正方形の一辺の長さは 2r1 である。

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

using SymPy
@syms r1::positive, r2::positive, A::positive
s3 = sqrt(Sym(3));

黒積 A は

(2r1)^2 -(PI*r1^2 - 2(PI*r1^2/4 - r1^2/2)) - PI*r2^2
= -PI*r1^2/2 + 3*r1^2 - PI*r2^2

である。

(2r1)^2 -(PI*r1^2 - 2(PI*r1^2/4 - r1^2/2)) - PI*r2^2 |> simplify |> println

   -pi*r1^2/2 + 3*r1^2 - pi*r2^2

eq1 = A - (-PI*r1^2/2 + 3*r1^2 - PI*r2^2)
eq1 |> println

   A - 3*r1^2 + pi*r1^2/2 + pi*r2^2

eq1 から solve() により r1 を求める。

res = solve(eq1, r1)[1]
res |> println  # r1

   sqrt(2*A + 2*pi*r2^2)/sqrt(6 - pi)

r1 を表すこの式には r2 が含まれるので,r2 を消去する。

そこで,半円と容円が外接することに基づき,半円,容円の半径の関係を求める。
最初の解が適解である。すなわち,r2 = 2(2 - √3)*r1 である。

eq2 = (2r1 - r2)^2 + (r1 - r2)^2 - (r1 + r2)^2
res = solve(eq2, r2)
res |> println

   Sym[2*r1*(2 - sqrt(3)), 2*r1*(sqrt(3) + 2)]

この r1 に上で求めた式を代入し,方程式 eq2 を解いて r2 を求めれば,A を含む式で解が得られる。

eq2 = 2*(sqrt(2*A + 2*PI*r2^2)/sqrt(6 - PI))*(2 - s3) - r2 |> simplify
eq2 |> println

   (-r2*sqrt(6 - pi) + (4 - 2*sqrt(3))*sqrt(2*A + 2*pi*r2^2))/sqrt(6 - pi)

res = solve(eq2, r2)[1] |> sympy.sqrtdenest |> simplify;

res |> display



res |> println

   2*sqrt(2)*sqrt(A)*(2 - sqrt(3))/sqrt(-57*pi + 6 + 32*sqrt(3)*pi)

容円の半径は
2*sqrt(2)*sqrt(A)*(2 - sqrt(3))/sqrt(-57*pi + 6 + 32*sqrt(3)*pi)
である。

この式が正しいことを逆算して確かめる。
黒積 A が 2 のとき,容円の半径 r2 は 1.0440008465400472 である。

r2 = (2*sqrt(2)*sqrt(2)*(2 - sqrt(3))/sqrt(-57*pi + 6 + 32*sqrt(3)*pi))

   1.0440008465400472

r2 = 2*r1*(2 - sqrt(3)) なので,半円の半径 r1 は 1.9481321012161867 である。

r1 = r2/(2(2 - sqrt(3)))

   1.9481321012161867

黒積は,以下の通り 1.9999999999999942 ≒ 2 になる。

-pi*r1^2/2 + 3*r1^2 - pi*r2^2

   1.9999999999999942

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r1 = 1
   r2 = 2*r1*(2 - sqrt(3))
   @printf("r1 = %g;  r2 = %g\n", r1, r2)
   plot([0, 2r1, 2r1, 0, 0], [0, 0, 2r1, 2r1, 0], color=:black, lw=0.5,seriestype=:shape, fillcolor=:gray)
   circlef(2r1, r1, r1, beginangle=90, endangle=270)
   circlef(r1, 2r1, r1, beginangle=180, endangle=360)
   circle(2r1, r1, r1, :black, beginangle=90, endangle=270)
   circle(r1, 2r1, r1, :black, beginangle=180, endangle=360)
   circlef(r2, r2, r2, :blue)
   plot!([0, 2r1, 2r1, 0, 0], [0, 0, 2r1, 2r1, 0], color=:black)
   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(2r1, 0, "2r1 ", :black, :right, :bottom, delta=delta/2)
       point(2r1, r1, "(2r1,r1) ", :black, :right, :vcenter)
       point(r1, 2r1, "(r1,2r1) ", :black, :center, delta=-delta/2)
       point(r2, r2, "容円:r2,(r2, r2)", :black, :center, delta=-delta/2)
   end
end;

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

算額(その663)

2024年01月30日 | Julia

算額(その663)

茨城県真壁郡十里村 子権現 文化10年(1813)
中村信弥「改訂増補 長野県の算額」

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

直角三角形内に中鈎,大円,中円,小円を入れる。中円,小円の直径が 1寸6分,1寸2分のとき,大円の中心と底辺の右側の頂点を結ぶ斜線(線分)の長さを求めよ。

直角を挟む二辺のうち,短い方を「鈎」,長い方を「股」,斜辺を「弦」とする。直角の頂点から弦への垂線を「中鈎」,垂線の脚の座標を (x, y) とする。
大円の半径と中心座標を r1, (r1, r1)
中円の半径と中心座標を r2, (x2, r2)
小円の半径と中心座標を r3, (r3, y3)
とおき,以下の連立方程式を解く。

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

using SymPy
@syms 鈎::positive, 股::positive, 弦::positive,
     長弦::positive, 短弦::positive, 中鈎::positive,
     r1::positive, r2::positive, r3::positive,
     x2::positive, y3::positive,
     x::positive, y::positive
eq1 = x^2 + y^2 - 中鈎^2
eq2 = 鈎^2 - 中鈎^2 - 短弦^2
eq3 = 股^2 - 中鈎^2 - 長弦^2
eq4 = 鈎^2 + 股^2 - 弦^2
eq5 = r1/(股 - r1) - r2/(股 - x2)
eq6 = 鈎 + 股 - 弦 - 2r1
eq7 = 中鈎 + 長弦 - 股 - 2r2
eq8 = 短弦 + 中鈎 - 鈎 - 2r3
eq9 = y/(股 - x) - 鈎/股
eq10 = distance(0, 鈎, 股, 0, r3, y3) - r3^2
eq11 = distance(0, 0, x, y, r3, y3) - r3^2;

using NLsolve

function nls(func, params...; ini = [0.0])
   if typeof(ini) <: Number
       r = nlsolve((vout, vin) -> vout[1] = func(vin[1], params..., [ini]), ftol=big"1e-40")
       v = r.zero[1]
   else
       r = nlsolve((vout, vin)->vout .= func(vin, params...), ini, ftol=big"1e-40")
       v = r.zero
   end
   return v, r.f_converged
end;

function H(u)
   (鈎, 股, 弦, 長弦, 短弦, 中鈎, r1, x2, y3, x, y) = u
   return [
x^2 + y^2 - 中鈎^2,  # eq1
-中鈎^2 - 短弦^2 + 鈎^2,  # eq2
-中鈎^2 + 股^2 - 長弦^2,  # eq3
-弦^2 + 股^2 + 鈎^2,  # eq4
r1/(-r1 + 股) - r2/(-x2 + 股),  # eq5
-2*r1 - 弦 + 股 + 鈎,  # eq6
-2*r2 + 中鈎 - 股 + 長弦,  # eq7
-2*r3 + 中鈎 + 短弦 - 鈎,  # eq8
y/(-x + 股) - 鈎/股,  # eq9
-r3^2 + (r3 - 股*(r3*股 - y3*鈎 + 鈎^2)/(股^2 + 鈎^2))^2 + (y3 - 鈎*(-r3*股 + y3*鈎 + 股^2)/(股^2 + 鈎^2))^2,  # eq10
-r3^2 + (r3 - x*(r3*x + y*y3)/(x^2 + y^2))^2 + (-y*(r3*x + y*y3)/(x^2 + y^2) + y3)^2,  # eq11
   ]
end;

(r2, r3) = (16, 12) .// 20
iniv = BigFloat[3.12, 4.21, 4.9, 3.54, 1.57, 2.34, 0.97, 1.57, 1.71, 1.31, 1.97]
res = nls(H, ini=iniv)

   (BigFloat[2.999999999999999999999999999999999999999999999998364504764585263757442728869067, 3.99999999999999999999999999999999999999999999999983729201826455417895867769145, 4.999999999999999999999999999999999999999999999998887822096160394442079955076626, 3.200000000000000000000000000000000000000000000001750994840687508520418164311052, 1.800000000000000000000000000000000000000000000000278207587008218098902215488639, 2.399999999999999999999999999999999999999999999998086297177577045658540513381006, 0.9999999999999999999999999999999999999999999999996569873433447117471607257418246, 1.599999999999999999999999999999999999999999999998962056077717036894336519529871, 1.799999999999999999999999999999999999999999999998692438333645772214535803150353, 1.440000000000000000000000000000000000000000000000475520887507759448903957591724, 1.919999999999999999999999999999999999999999999998011029938669057719045586200767], true)

鈎 = 3;  股 = 4;  弦 = 5;  長弦 = 3.2;  短弦 = 1.8;  中鈎 = 2.4;  r1 = 1;  x2 = 1.6;  y3 = 1.8;  x = 1.44;  y = 1.92

「斜線」は (r1, r1) と (股, 0) を結ぶものなので,その長さは sqrt((股 - r1)^2 +(r1 - 0)^2) = sqrt(10) = 3.1622776601683795 である。

sqrt(10)

   3.1622776601683795

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r2, r3) = (16, 12) .// 20
   (鈎, 股, 弦, 長弦, 短弦, 中鈎, r1, x2, y3, x, y) = res[1]
   @printf("鈎 = %g;  股 = %g;  弦 = %g;  長弦 = %g;  短弦 = %g;  中鈎 = %g;  r1 = %g;  x2 = %g;  y3 = %g;  x = %g;  y = %g\n",
           鈎, 股, 弦, 長弦, 短弦, 中鈎, r1, x2, y3, x, y)
   plot([0, 股, 0, 0], [0, 0, 鈎, 0], color=:green, lw=0.5)
   circle(r1, r1, r1)
   circle(x2, r2, r2, :blue)
   circle(r3, y3, r3, :orange)
   segment(0, 0, x, y)
   segment(r1, r1, 股, 0, :cyan, lw=1)
   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\n (r1,r1)", :red, :left, :bottom)
       point(x2, r2, "中円:r2\n(x2,r2)", :blue, :center, delta=-delta)
       point(r3, y3, "小円:r3\n(r3,y3)", :orange, :left, delta=-delta)
       point(2.5, 0.65, "斜線", :brown, mark=false)
       point(0, 鈎, " 鈎", :green, :left, :bottom)
       point(股, 0, " 股", :green, :left, :bottom, delta=delta/2)
       point(x, y, " (x,y)", :green, :left, :bottom)
       plot!(xlims=(-0.2, 4.2))
   end
end;

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

算額(その662)

2024年01月29日 | Julia

算額(その662)

茨城県笠間市福原 吾國山上頂神(吾国山上頂神前) 文化7年(1810)
中村信弥(2001):幻の算額

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

長径,短径が 8 寸,6 寸の菱形の中に一辺の長さ 3 寸の正方形と斜線が入っている。斜線の長さはいかほどか。

斜線と菱形の辺の交点座標を (x, y) とおき,以下の連立方程式を解く。

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

using SymPy
@syms x::negative, y::negative
(a, b) = (Sym(4), Sym(3))
eq1 = (b - y)/(-x) - b//2
eq2 = sqrt((a + x)^2 + (-y)^2) + sqrt((-x)^2 + (b + y)^2) - sqrt(a^2 + b^2)
res = solve([eq1, eq2], (x, y))

   1-element Vector{Tuple{Sym, Sym}}:
    (-8/3, -1)

(x, y) = (-8/3, -1)
長さは sqrt(x^2 + (b - y)^2) = 4√13/3 = 4.80740170061865,4寸8分あまりである。

(x, y) = res[1]
長さ = sqrt(x^2 + (b - y)^2)
(長さ, 長さ.evalf()) |> println

   (4*sqrt(13)/3, 4.80740170061865)

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (a, b) = (4, 3)
   (x, y) = (-8/3, -1)
   plot([a, 0, -a, 0, a], [0, b, 0, -b, 0], color=:green, lw=0.5)
   plot!([2, -1, -1, 2, 2], [3/2, 3/2, -3/2, -3/2, 3/2], color=:orange, lw=0.5)
   segment(0, 3, x, y)
   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(x, y, "(x,y) ", :red, :right, :vcenter)
       point(a, 0, " a", :green, :left, :bottom)
       point(0, b, " b", :green, :left, :bottom)
       point(a/2, b/2, " (a/2,b/", :green, :left, :bottom)
   end
end;

 

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

算額(その661)

2024年01月29日 | Julia

算額(その661)

茨城県東海村 村松虚空蔵(村松虚空蔵尊) 文化15年(1818)
中村信弥(2001):幻の算額

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

正三角形内に全円が内接している。2本の斜線を引き,区画領域に甲円,乙円を入れる。甲円の直径が 6 寸のとき,乙円の直径を求めよ。

正三角形の一辺の長さを 2a とし,斜線と底辺の交点座標を (b, 0) とする。
全円の半径と中心座標を r0, (0, r0)
甲円の半径と中心座標を r1, (x1, r1)
乙円の半径と中心座標を r2, (0, 2r0 + r2)
とおき,以下の連立方程式を解く。

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

using SymPy
@syms a::positive, b::positive, r0::positive,
     r1::positive, x1::positive, r2::positive
eq0 = r0 - a/√(Sym(3))
eq1 = (a - x1)/√(Sym(3)) - r1
eq2 = r2/(√(Sym(3))a - 2r0 - r2) - b/sqrt(b^2 + 3a^2)
eq3 = x1^2 + (r0 - r1)^2 - (r0 + r1)^2
eq4 = dist(0, √(Sym(3))a, b, 0, x1, r1) - r1^2
res = solve([eq0, eq1, eq2, eq3, eq4], (a, b, r0, r2, x1))

   2-element Vector{NTuple{5, Sym}}:
    (3*sqrt(3)*r1, 11*sqrt(3)*r1/7, 3*r1, 33*r1/49, 2*sqrt(3)*r1)
    (3*sqrt(3)*r1, 3*sqrt(3)*r1, 3*r1, r1, 2*sqrt(3)*r1)

2 組の解が得られるが,最初のものが適解である。

乙円の半径は甲円の半径の 33/49 倍である。「術」でも「置甲円径三十三因四十九除而得乙円径」とあり,一致する。
甲円の直径が 6 のとき,乙円の直径は 6*33/49 = 4.040816326530612 となる。「答」には,「乙円径四寸九分寸之二」とあるが,「乙円径四寸四九分寸之二(4 寸と 2/49)」の誤りだそうだ。

4 + 2/49, (4*49 + 2)/49, 198/49

   (4.040816326530612, 4.040816326530612, 4.040816326530612)

その他のパラメータは以下の通り。

 r1 = 3;  a = 15.5885;  b = 8.16538;  r0 = 9;  r2 = 2.02041;  x1 = 10.3923

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r1 = 6//2
   (a, b, r0, r2, x1) = (3*sqrt(3)*r1, 11*sqrt(3)*r1/7, 3*r1, 33*r1/49, 2*sqrt(3)*r1)
   @printf("乙円の直径 = %g;  r1 = %g;  a = %g;  b = %g;  r0 = %g;  r2 = %g;  x1 = %g\n", 2r2, r1, a, b, r0, r2, x1)
   plot([a, 0, -a, 0], [0, √3a, 0, 0], color=:green, lw=0.5)
   plot!([b, 0, -b], [0, √3a, 0], color=:orange, lw=0.5)
   circle(0, r0, r0)
   circle(x1, r1, r1, :blue)
   circle(-x1, r1, r1, :blue)
   circle(0, 2r0 + r2, r2, :magenta)
   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(0, r0, " 全円:r0\n (0,r0)", :red, :left, :vcenter)
       point(x1, r1, " 甲円:r1,(x1,r1)", :black, :center, delta=-delta/2)
       point(0, 2r0 + r2, " 乙円:r2,(2r0+r2)", :black, :left, :vcenter)
       point(0, √3a, " √3a", :green, :left, :bottom)
       point(a, 0, "a", :green, :left, :bottom, delta=delta/2)
   end
end;

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

算額(その660)

2024年01月29日 | Julia

算額(その660)

二十六 岩手県一関市萩荘 赤萩観音寺 佐藤亀蔵 弘化4年(1847)

山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市. http://www.wasan.jp/yamamura/yamamura.html

相馬美貴子: 連載 和算資料の電子化(4): 一関の和算,東北大学附属図書館報 木這子,ISSN 0385-7506, Vol. 29, No. 1, pp. 5-8, 2004.

https://www.library.tohoku.ac.jp/about/kiboko/29-1/kbk29-1.pdf

算額の図,問,答,術は,一関市博物館 https://www.city.ichinoseki.iwate.jp/museum/より引用されているが,最終リンクが示されていない(「現存 岩手の算額」であろう)。

直角三角形の中に正方形,大円 1 個,中円 3 個,小円 2 個が入っている。小円の直径が与えられたとき,大円の直径を求めよ。

直角三角形の直角を挟む二辺の長い方(底辺)を「股」,短い方を「鈎」とする。
正方形の一辺の長さを a とする。中円の半径は a/4 である。
大円の半径と中心座標を r1,(股 - a - r1, r1)
中円の半径と中心座標を r2, (股 - r2, a + r2), (股 - a/2, r2)
小円の半径と中心座標を r3, (股 - r3, a/2)

とおき,以下の連立方程式を解き a, 鈎, 股, r3 を求める。それぞれの式には r1 が含まれる。
注:r3 を式に含む「a, 鈎, 股, r1」を求めようとすると SymPy ではエラーが発生する。

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

using SymPy
@syms a::positive, 鈎::positive, 股::positive,
     r1::positive, r2::positive, r3::positive
r2 = a/4
eq1 = (a/2 - r3)^2 + (a/2 - r2)^2 - (r2 + r3)^2
eq2 = r2/r1 - a/(股 - a)
eq3 = (股 -  a)*a/2 + a*(鈎 - a)/2 + a^2 - 鈎*股/2
eq4 = (股 - a) + a - sqrt((股 - a)^2 + a^2) - 2r1
res = solve([eq1, eq2, eq3, eq4], (a, 鈎, 股, r3))

   1-element Vector{NTuple{4, Sym}}:
    (3*r1, 21*r1/4, 7*r1, r1/2)

a, 鈎, 股, r3 はそれぞれ大円の半径(r1) の 3, 21/4, 7, 1/2 倍である。
r2 は 3/4 倍である。

大円の直径は小円の直径の 2 倍である。

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r1 = 2
   (a, 鈎, 股, r3) =  r1 .* (3, 21/4, 7, 1/2)
   r2 = a/4
   @printf("a = %g;  鈎 = %g;  股 = %g;  r1 = %g;  r2 = %g;  r3 = %g\n", a, 鈎, 股, r1, r2, r3)
   plot([0, 股, 股, 0], [0, 0, 鈎, 0], color=:green, lw=0.5)
   plot!([股 - a, 股, 股, 股 - a, 股 - a], [ 0, 0, a, a, 0], color=:orange, lw=0.5)
   circle(股 - a - r1, r1, r1)
   circle(股 - r2, a + r2, r2, :blue)
   circle(股 - a/2, r2, r2, :blue)
   circle(股 - a/2, 3r2, r2, :blue)
   circle(股 - a + r3, a/2, r3, :magenta)
   circle(股 - r3, a/2, r3, :magenta)
   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(股 - r3, a/2, "小円:r3\n(股-r3,a/2)", :black, :center, delta=-delta)
       point(股 - a/2, r2, "中円:r2\n(股-a/2,r2)", :blue, :center, delta=-delta)
       point(股 - r2, a + r2, "中円:r2\n(股-r2,a+r2)", :blue, :center, delta=-delta)
       point(股 - a - r1, r1, "大円:r1\n(股-a-r1,r1)", :red, :center, delta=-delta)
       point(股 - a, a, "(股-a,a) ", :orange, :right, :bottom)
       point(股, 0, " 股", :green, :left, :bottom, delta=delta)
       point(股, 鈎, "(股,鈎)", :green, :right, :bottom, delta=delta)
   end
end;

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

算額(その659)

2024年01月28日 | Julia

算額(その659)

長野県上田市別所温泉 北向観音堂 慶応元年(1865)
中村信弥「改訂増補 長野県の算額」

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

外円内に正三角形が内接し,天円,地円,人円が入っている。外円の直径の平方根が xxx.625,天円の直径の平方根が yyy.96875 のようになっている(小数部がわかっている)。条件を満たすような最小の外円の直径を求めよ。

基本的には r1 と r3 だけの関係式が分かれば問題は解けるのだが,それだけにこだわると逆に落とし穴にハマる。R がわかっているときに,残りすべてのパラメータを求めよう。
R がわかっているときに,r1, r2, r3, x2 の 4 個のパラメータを推定するには,条件が 4 個必要である。eq1 〜 eq3 は比較的簡単に導けるが,eq4 はちょっと盲点かもしれない。

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

using SymPy
@syms R::positive, r1::positive, r2::positive,
     r2::positive, x2::positive, r3::positive,
     constant::positive

eq1 = x2^2 + (R - r1 - (r2 - R/2))^2 - (r1 + r2)^2
eq2 = x2^2 + (r2 - r3)^2 - (r2 + r3)^2
eq3 = 2r1 + 2r3 - 3R/2
eq4 = 2sqrt(r2*r3) + sqrt(Sym(3))*r2 - R*sqrt(Sym(3))/2

res = solve([eq1, eq2, eq3], (r2, x2, r3))
res = solve([eq1, eq2, eq3, eq4], (r1, r2, x2, r3))

   1-element Vector{NTuple{4, Sym}}:
    (9*R/16, R/4, sqrt(3)*R/4, 3*R/16)

つまり,天円の半径 r1 は外円の半径 R の 9/16 である。
解を求めるには以下の3条件を満たす整数 a, b を求めればよい。
いままで,r1, R は半径としてきたが,直径の場合は単に半径を2敗するだけであるから関係式は変わらない。
これ以降 r1, R は直径として読む。
r1/R = 9/16
sqrt(R) = a + 0.625
sqrt(r1) = b + 0.96875

ブルートフォースで該当する解を探索する。

function search()
   for a = 1:10
       R = (a + 0.625)^2
       for b = 1:a
           r1 = (b + 0.96875)^2
           r1 > R && break
           if isapprox(r1/R, 9/16)
               @printf("R = %g;  r1 = %g\n", R, r1)
               return
           end
       end
   end
end
search()    

   R = 6.89062;  r1 = 3.87598

条件を満たす外円の直径は 6.89062 である。
ちなみに,そのときの,各パラメータは以下の通り。
R = 6.89062;  r1 = 3.87597;  r2 = 1.72266;  r3 = 1.29199;  x2 = 2.98373

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (R, r1) = (6.89062, 3.87598)
   (r1, r2, x2, r3) = R .* (9/16, 1/4, √3/4, 3/16)
   @printf("R = %g;  r1 = %g;  r2 = %g;  r3 = %g;  x2 = %g\n", R, r1, r2, r3, x2)
   plot([√3R/2, 0, -√3R/2, √3R/2], [-R/2, R, -R/2], color=:green, lw=0.5)
   circle(0, 0, R)
   circle(0, R - r1, r1, :blue)
   circle(x2, r2 - R/2, r2, :magenta)
   circle(-x2, r2 - R/2, r2, :magenta)
   circle(0, r3 - R/2, r3, :orange)
   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(0, R - r1, " 天円:r1\n (0,R-r1)", :black, :left, :vcenter)
       point(x2, r2 - R/2, " 地円:r2\n (√3R/2,-R/2)", :black, :left, :vcenter)
       point(0, r3 - R/2, " 人円:r3\n (0,r3-R/2)", :black, :left, :vcenter)
       point(R, 0, " R", :red, :left, :bottom, delta=delta/2)
   end
end;

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

算額(その658)

2024年01月28日 | Julia

算額(その658)

埼玉県東松山市岩殿 正法寺(岩殿観音) 明治11年(1878)
山口正義:毛呂周辺の算額

https://yamabukiwasan.sakura.ne.jp/22moroshuuhen.pdf
山口正義:やまぶき,和算と歴史随想 からリンク
https://yamabukiwasan.sakura.ne.jp/page3.html

大円の中に 4 本の斜線を引き,分割された領域に甲円 2 個,乙円 2 個,丙円 4 個を入れる。乙円の直径がわかっているときに丙円の直径を求めよ。

大円の半径と中心座標を R, (0, 0)
甲円の半径と中心座標を r1, (0, R - r1), (0, r1 - R)
乙円の半径と中心座標を r2, (R - r2, 0)
丙円の半径と中心座標を r3, (x3, y3)
とおき以下の連立方程式を解く。

未知数は R, r3, x3, y3, x で,以下の 5 個の方程式を立てる。連立方程式を解いた式には r2 が含まれる(任意の r2 でそれぞれのパラメータが計算できる)。

SymPy の性能上,連立方程式を一度に解くことができないが,個々の方程式の独立性を考えて以下のように順次といてゆく。

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

using SymPy
@syms R::positive, r1::positive, r2::positive,
     r3::positive, x3::positive, y3::positive,
     x, y
# r2 = 1 最終的な未知数として,解に含まれる
r1 = R/2
y = sqrt(R^2 - x^2)

eq1 = x3^2 + (y3 - r1)^2 - (r1 - r3)^2
eq2 = dist(0, -R, x, y, 0, R - r1) - r1^2
eq3 = dist(0, -R, x, y, R - r2, 0) - r2^2
eq4 = 2*sqrt(r1^2 - (r1 - 2r3)^2) - sqrt((2r1)^2 - (2r1/3)^2)
eq5 = (y3 - r1)/x3 - 1//3;

まず最初に R と x を求めるために eq2, eq3 の連立方程式を解くが,これも SymPy の性能上解けないので,まず eq2 を x について解く。

res1 = solve(eq2, x) |>  println  # x

   Sym[-4*sqrt(2)*R/9, 4*sqrt(2)*R/9]

2 番目のものが適解である。x, およびそれにより計算される y を用いて eq3 を書き直す。

x = 4*sqrt(Sym(2))*R/9
y = sqrt(R^2 - x^2)
eq3 = dist(0, -R, x, y, R - r2, 0) - r2^2;

R について解く。2 番目の解が適解である。

res2 = solve(eq3, R)
res2 |> println

   Sym[-3*r2/sqrt(9 - 4*sqrt(2)) + 2*r2*(-4 + sqrt(2))/(-9 + 4*sqrt(2)), 2*r2*(-4 + sqrt(2))/(-9 + 4*sqrt(2)) + 3*r2/sqrt(9 - 4*sqrt(2))]

res2[1](r2 => 1).evalf(), res2[2](r2 => 1).evalf()  # 2 番目が適解

   (-0.0938363213560543, 3.18767264271211)

2 番目の解を簡約化する。

res2[2] |> sympy.sqrtdenest |> simplify |> println  # R

   11*r2/7 + 8*sqrt(2)*r2/7

R, x, y を書き直す。なお,r1 は R の 1/2 である。

R = 11*r2/7 + 8*sqrt(Sym(2))*r2/7
x = 4*sqrt(Sym(2))*R/9
y = 7*R/9
r1 = R/2;

ここまでで,r3 は以下のように単純に求めることができるようになる。最初の解が適解である。r3 は 大円の半径の 1/ 6 である

res3 = solve(eq4, r3)[1]  # r3
res3 |> println

   R/6

eq1, eq5 の連立方程式を解けば乙円の中心座標 (x3, y3) が求まる。
2 組の解が求まるが,2 番目のものが適解である。

eq1 = x3^2 + (y3 - r1)^2 - (r1 - r3)^2
eq5 = (y3 - r1)/x3 - 1//3;
res4 = solve([eq1, eq5], (x3, y3))

   1-element Vector{Tuple{Sym, Sym}}:
    (3*sqrt(1760*sqrt(2)*r2^2 + 2490*r2^2 - 2240*sqrt(2)*r2*r3 - 3080*r2*r3 + 1960*r3^2)/140, r2*(11 + 8*sqrt(2))/14 + sqrt(1760*sqrt(2)*r2^2 + 2490*r2^2 - 2240*sqrt(2)*r2*r3 - 3080*r2*r3 + 1960*r3^2)/140)

以上をまとめると,
乙円の半径を r2 とする。
大円の半径 R が決まる。R = 11*r2/7 + 8*sqrt(2)*r2/7
(x, y) が決まる。x = 4*sqrt(2)*R/9,y = 7*R/9
丙円の半径が決まる。r3 = R/6
丙円の中心座標が決まる。(x3, y3) = (3*sqrt(10)*(R - 2*r3)/20, R/2 + sqrt(10)*(R - 2*r3)/20)

r2 = 1
R = 11*r2/7 + 8*sqrt(2)*r2/7
r1 = R/2
(x, y) = (4*sqrt(2)*R/9, 7*R/9)
r3 = R/6
(x3, y3) = (3*sqrt(10)*(R - 2*r3)/20, R/2 + sqrt(10)*(R - 2*r3)/20)
@printf("r2 = %g;  R = %g;  r3 = %g;  x3 = %g;  y3 = %g;  x = %g;  y = %g\n", r2, R, r3, x3, y3, x, y)

   r2 = 1;  R = 3.18767;  r3 = 0.531279;  x3 = 1.00803;  y3 = 1.92985;  x = 2.00358;  y = 2.4793

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r2 = 123
   R = 11*r2/7 + 8*sqrt(2)*r2/7
   r1 = R/2
   (x, y) = (4*sqrt(2)*R/9, 7*R/9)
   r3 = R/6
   (x3, y3) = (3*sqrt(10)*(R - 2*r3)/20, R/2 + sqrt(10)*(R - 2*r3)/20)
   @printf("r2 = %g;  R = %g;  r3 = %g;  x3 = %g;  y3 = %g;  x = %g;  y = %g\n", r2, R, r3, x3, y3, x, y)
   plot()
   circle(0, 0, R)
   circle(0, r1, r1, :blue)
   circle(0, -r1, r1, :blue)
   circle(R - r2, 0, r2, :orange)
   circle(r2 - R, 0, r2, :orange)
   circle4(x3, y3, r3, :magenta)
   plot!([-x, 0, x], [-y, R, -y], color=:green, lw=0.5)
   plot!([-x, 0, x], [y, -R, y], color=:green, lw=0.5)
   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(x, y, " (x,y)", :green, :left, :vcenter)
       point(0, r1, " 甲円:r1,(0, r1)", :black, :left, :vcenter)
       point(R - r2, 0, " 乙円:r2,(R-r2,0)", :black, :center, :bottom, delta=delta/2)
       point(x3, y3, " 丙円:r3,(x3, y3)", :black, :left, :vcenter)
       point(R, 0, " R", :black, :left, :bottom, delta=delta/2)
   end
end;

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

算額(その657)

2024年01月27日 | Julia

算額(その657)

千葉胤秀『算法新書』,文政13年(1830)
一関博物館>>和算に挑戦>>平成17年度出題問題(1)[中級問題]&解答例

https://www.city.ichinoseki.iwate.jp/museum/wasan/h17/normal.html

平成17年度中級
大,中,小の正方形が図のように配置されている。左右の大正方形は同じ大きさである。小サイズの正方形の一辺の長さが 1cm のとき,中サイズの正方形の一辺の長さはいかほどか。

中サイズの正方形の右端の頂点の座標を (x1, √2 + x1) とする。また,大正方形が x 軸と接する座標を (x2, 0) とすると,x2 = √2/2 + (√2 + x1 - √2/2) である。
以下の方程式を解いて x1 を得る。

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

using SymPy
@syms x1::positive

x2 = sqrt(Sym(2))/2 + (sqrt(Sym(2)) + x1 - sqrt(Sym(2))/2)
eq = (x1 - sqrt(Sym(2))/2)^2 + (sqrt(Sym(2)) + x1 - sqrt(Sym(2))/2)^2 - (x2 - sqrt(Sym(2))/2)^2 - (sqrt(Sym(2))/2)^2
solve(eq)[1] |> println # x1

   sqrt(2)

x1 = √2 なので,中正方形の一辺の長さは sqrt(2x1^2) = 2 である。
中正方形の一辺の長さは 2cm である。

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   x1 = √2
   x2 = √2/2 + (√2 + x1 - √2/2)
   plot([0, √2/2, 0, -√2/2, 0], [0, √2/2, √2, √2/2, 0], color=:blue, lw=0.5)
   plot!([0, x1, 0, -x1, 0], [√2, √2 + x1, √2 + 2x1, √2 + √2, √2])
   plot!([√2/2, x2, x2 + x1 - √2/2, x1, √2/2], [√2/2, 0, √2 + x1 - √2/2, √2 + x1, √2/2])
   plot!(-[√2/2, x2, x2 + x1 - √2/2, x1, √2/2], [√2/2, 0, √2 + x1 - √2/2, √2 + x1, √2/2])
   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(√2/2, √2/2, " (√2/2,√2/2)", :black, :left, :bottom, delta=delta/3)
       point(x2, 0, " x2", :black, :left, :bottom, delta=delta/3)
       point(x1, √2 + x1, " (x1,√2+x1)", :black, :left, :bottom, delta=delta/3)
       point(0, √2, " √2", :black, :left, :vcenter)
       point(0, √2 + 2x1, " √2+2x1", :black, :left, :vcenter)
       point(2, 1.7, "大", mark=false)
       point(0.3, 3, "中", mark=false)
       point(0.1, 0.8, "小", mark=false)
   end
end;

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

算額(その656)

2024年01月27日 | Julia

算額(その656)

群馬の和算 111(1/2) 倉賀野神社 慶応3年
http://takasakiwasan.web.fc2.com/gunnsann/g111_1.html

正三角形内に最も大きな円弧を置き,その円弧と2辺に接する甲円を置く。甲円と円弧と底辺に接する乙円を置き,同様に順次丙円,丁円...を置く。
これらの直径を求めよ。

正三角形の一辺の長さを a とおき,甲円,乙円...の半径と中心座標を (r1, x1), (r2, x2)...とする。

甲円のパラメータ (r1, x1) が決まったあと,乙円のパラメータは (r1, x1) で記述できる。その後も,丙円,丁円と同じ関係式でパラメータが決まる。

まず最初に,正三角形内の最大弧を決定する。弧を形成する円は正三角形の 2 つの辺に頂点で接するものである。その中心座標は (a, a/√3) であることは簡単な計算で分る。この中心座標を (x, y) とおき,甲円の r1, x1 を以下の連立方程式を解いて求める。

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

using SymPy
@syms R::positive, a::positive,
     r1::positive, x1::positive,
     r2::positive, x2::positive
a = 8
R = a/sqrt(Sym(3))
(x, y) = (a, R)
eq1 = (x - x1)^2 + (y - r1)^2 - (R + r1)^2
eq2 = r1/x1 - y/x
res = solve([eq1, eq2], (r1, x1))

   2-element Vector{Tuple{Sym, Sym}}:
    (8*sqrt(3)/9, 8/3)
    (8*sqrt(3), 24)

2 組の解が得られるが,2 番目のものが適解である。
すなわち,r1 = 8*sqrt(3)/9, x1 = 8/3 である。

次に,乙円のパラメータ r2, x2 は,r1, x1 を未知数のままにして(r2, x2 が r1, x1 を含む式で表される)以下の連立方程式で求めることができる。

eq3 = (x - x2)^2 + (y - r2)^2 - (R + r2)^2
eq4 = (x2 - x1)^2 + (r1 - r2)^2 - (r1 + r2)^2;

簡単な二元連立方程式であるが,SymPy の能力的に solve([eq3, eq4], (r2, x2)) は有限の時間内には解けないようなので,手動で解く。

まず,eq4 から x2 を求める。x2 は r2 が決まれば求めることができる。

# x2 を求める式
solve(eq4, x2) |> println

   Sym[-2*sqrt(r1)*sqrt(r2) + x1, 2*sqrt(r1)*sqrt(r2) + x1]

2 組の解が得られるが,2 番目のものが適解である。 すなわち,x2 = 2*sqrt(r1)*sqrt(r2) + x1 である。この式は算額において有名な式で,つまる所は,直線の上に載っている,互いに接している円の中心間の水平距離は 2 つの円の積の平方根の 2 倍である,つまり,x2 - x1 = 2√(r1*r2) にほかならない。

得られた x2 を eq3 に代入すると以下の方程式が得られる。

eq3 = (x - (2sqrt(r1)*sqrt(r2) + x1))^2 + (y - r2)^2 - (R + r2)^2
eq3 |> println

   (-r2 + 8*sqrt(3)/3)^2 - (r2 + 8*sqrt(3)/3)^2 + (-2*sqrt(r1)*sqrt(r2) - x1 + 8)^2

この方程式から r2 を求める。

res = solve(eq3, r2)
res |> println

   Sym[(x1 - 8)^2*(4*sqrt(2)*3^(3/4)*sqrt(r1)*(-3*r1^2 + 16*sqrt(3)*r1 - 64) + (3*r1 + 8*sqrt(3))*(3*r1^2 - 16*sqrt(3)*r1 + 64))/(4*(3*r1^2 - 16*sqrt(3)*r1 + 64)^2), (x1 - 8)^2*(4*sqrt(2)*3^(3/4)*sqrt(r1) + 3*r1 + 8*sqrt(3))/(4*(3*r1^2 - 16*sqrt(3)*r1 + 64))]

2 組の解が得られるが,最初のものが適解である。 簡約化すると以下のようになる。

# r2 を求める式
r2 = res[1] |> simplify |> println

   (x1 - 8)^2*(-4*sqrt(2)*3^(3/4)*sqrt(r1) + 3*r1 + 8*sqrt(3))/(4*(3*r1^2 - 16*sqrt(3)*r1 + 64))

以上で求めた r2, x2 を求める式は r1, x1 だけを含む。また,この式は互いに接する円の間に成り立つので,たとえば丙円と丁円の間においても成り立つ。そこで,以下のような関数としてまとめておく。

function nextcircle(r1, x1)
   # # r2 = (x1 - 8)^2*(-4*sqrt(Sym(2))*3^Sym(3//4)*sqrt(r1) + 3*r1 + 8*sqrt(Sym(3)))/(4*(3*r1^2 - 16*sqrt(Sym(3))*r1 + 64))
   r2 = (x1 - 8)^2*(-4*sqrt(2)*3^(3/4)*sqrt(r1) + 3*r1 + 8*sqrt(3))/(4*(3*r1^2 - 16*sqrt(3)*r1 + 64))
   x2 = 2*sqrt(r1)*sqrt(r2) + x1
   return (r2, x2)
end;

この関数を使って,累円のパラメータを求めてみよう。

(r1, x1) = (8*sqrt(3)/9, 8/3)

   (1.5396007178390019, 2.6666666666666665)

nextcircle(1.5396007178390019, 2.6666666666666665)

   (0.6188021535170058, 4.618802153517006)

nextcircle(0.6188021535170058, 4.618802153517006)

   (0.3316150746190428, 5.524791385931975)

nextcircle(0.3316150746190428, 5.524791385931975)

   (0.20626738450566878, 6.04786451314966)

   甲円の直径 = 3.0792014;  中心の X 座標 = 2.6666667
   乙円の直径 = 1.2376043;  中心の X 座標 = 4.6188022
   丙円の直径 = 0.6632301;  中心の X 座標 = 5.5247914
   丁円の直径 = 0.4125348;  中心の X 座標 = 6.0478645
   戊円の直径 = 0.2811508;  中心の X 座標 = 6.3884294
   己円の直径 = 0.2038283;  中心の X 座標 = 6.6278172
   庚円の直径 = 0.1545148;  中心の X 座標 = 6.8052841
   辛円の直径 = 0.1211510;  中心の X 座標 = 6.9421037
   壬円の直径 = 0.0975328;  中心の X 座標 = 7.0508060
   癸円の直径 = 0.0802036;  中心の X 座標 = 7.1392508

術では以下のような解が述べられている。関係式は簡潔であるが,直径(半径)の情報しか得られない。上述した式は半径と中心座標を求めることができる解である。

極 = 8/sqrt(0.75)
甲 = 極/3; 甲 |> println
子 = 甲*極; 乙 = 子/(2√子 + 極 + 甲); 乙 |> println
丑 = 乙*極; 丙 = 丑/(2√丑 + 極 + 乙); 丙 |> println

   3.0792014356780046
   1.2376043070340124
   0.6632301492380859

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   names = Char["甲乙丙丁戊己庚辛壬癸"...]
   n = length(names)
   rs = Vector{Float64}(undef, n)
   xs = Vector{Float64}(undef, n)
   a = 8
   R = a/sqrt(Sym(3))
   (x, y) = (a, R)
   plot([0, a, a/2, 0], [0, 0, √3a/2, 0], color=:blue, lw=0.5)
   circle(x, y, R, :green)
   (r1, x1) = (8*sqrt(3)/9, 8/3)
   circle(x1, r1, r1)
   for i = 1:n
       @printf("%s円の直径 = %.7f;  中心の X 座標 = %.7f\n", names[i], 2r1, x1)
       (rs[i], xs[i]) = (r1, x1)
       (r2, x2) = nextcircle(r1, x1)
       circle(x2, r2, r2)
       (r1, x1) = (r2, x2)
   end
   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)
       for i = 1:3
           point(xs[i], rs[i], names[i], :red, :center, :vcenter, mark=false)
       end
   end
end;

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

算額(その655)

2024年01月26日 | Julia

算額(その655)

『蠡管算法 巻上』の第13問 をまなぶ(1/1)
http://takasakiwasan.web.fc2.com/kaihouhenomiti_1/reikannsannpou_jyou_13.html

「算法直術正解」第35問
http://takasakiwasan.web.fc2.com/kaihouhenomiti_1/pdf/sanpochokujutuseikai_35_2.pdf

団扇の中に菱形と 2 つの等円が入っている。団扇の直径が 10 寸で,菱形の一辺の長さが 6 寸の場合,等円の直径はいかほどか。

後者では 14 ページにわたる解法を示している。

菱形の長径と短径を 2a, 2b
団扇の半径と中心座標を R, (0, 0)
等円の半径と中心座標を r, (x, y)
とする。

菱形の一辺の長さが 6 寸で,右端の頂点が半径 5 の円周上にあることから以下の方程式の eq4 を立てるが,R が与えられているので,b = 18/5 であることが容易に計算できる。

eq1 は等円が団扇に内接すること,eq2 は扇の下部の弧と等円が外接すること,eq3 は等円の中心と菱形の右下の辺までの距離が等円の直径であることを表している。この 3 方程式を解くと r, x, y が正確に求まる。

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

using SymPy
@syms R::positive, a::positive, b::positive,
     r::positive, x::positive, y::negative
R = 10//2
b = 18//5
eq1 = x^2 + y^2 - (R - r)^2
eq2 = x^2 + (y + R)^2 - (2R - 2b + r)^2
eq3 = distance(0, R - 2b, sqrt(R^2 - (R - b)^2), R - b, x, y) - r^2
eq4 = sqrt(6^2 - b^2) - sqrt(R^2 - (R - b)^2);
res = solve([eq1, eq2, eq3], (r, x, y))

   1-element Vector{Tuple{Sym, Sym, Sym}}:
    (26208/17405, 51408/17405, -6499/3481)

等円の直径は 2*26208/17405 = 3.011548405630566
中心座標は (2.9536340132145935, -1.8669922436081585) である。

2*26208/17405, 51408/17405, -6499/3481

   (3.011548405630566, 2.9536340132145935, -1.8669922436081585)

団扇の円と下部の円弧の交点座標 (ax, ay) は以下の連立方程式を解いて求めることができる。

@syms ax::positive, ay::negative
eq5 = ax^2 + ay^2 - R^2
eq6 = ax^2 + (ay + R)^2 - (2R - 2b)^2
solve([eq5, eq6], (ax, ay))

   1-element Vector{Tuple{Sym, Sym}}:
    (336/125, -527/125)

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   R = 10//2
   b = 18//5
   (r, x, y) = res[1]
   a = sqrt(6^2 - b^2)
   @printf("等円の直径 = %g;  r = %g;  x = %g;  y = %g;  a = %g;   b = %g\n",
       2r, r, x, y, a, b)
   plot([a, 0, -a, 0, a], [R - b, R, R - b, R - 2b, R-b], color=:blue, lw=0.5)
   circle(0, 0, R)
   circle(x, y, r, :green)
   (ax, ay) = (336/125, -527/125)
   @printf("ax = %g; ay = %g\n", ax, ay)
   θ = atand((R + ay)/ax)
   println(θ)
   circle(0, -R, 2R - 2b, :orange, beginangle=θ, endangle=180-θ)
   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(0, R - b, " R-b")
       point(0, R - 2b, " R-2b")
       point(a, R - b, "(a,R-b) ", :blue, :right, :vcenter)
       point(x, y, "(x,y)")
       point(ax, ay, "(ax,ay)")
       point(0, R, " R", :red, :left, :bottom, delta=delta/2)
   end
end;

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

算額(その654)

2024年01月26日 | Julia

算額(その654)

群馬の算額 44-2 八幡宮
http://takasakiwasan.web.fc2.com/gunnsann/g044-2.html

下底 20 寸,上底 15 寸,高さ 6 寸の台形内に,円弧と等円 2 個を置く。等円の直径を求めよ。

算額の原図を左右反転させ,台形の左下頂点を原点に置き,下底の長さを a,高さを h とする。
台形は等脚台形でなくてもよいので,左上,右上の頂点座標を(b1, h), (b2, h) とおく。
等円の半径と中心座標を r, (x1, r), (x2, h - r)
円弧を構成する円の半径と中心座標を R, (x, y)
とおき,以下の連立方程式を解く。

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

using SymPy
@syms a::positive, b1::positive, b2::positive, h::positive,
     R::positive, x::positive, y::positive,
     r::positive, x1::positive, x2::positive
eq1 = (x - a)^2 + y^2 - R^2
eq2 = (x - b1)^2 + (y - h)^2 - R^2
eq3 = (x - x1)^2 + (y - r)^2 - (R + r)^2
eq4 = (x - x2)^2 + (y - h + r)^2 - (R - r)^2
eq5 = dist(0, 0, b1, h, x1, r) - r^2
eq6 = dist(a, 0, b2, h, x2, h - r) - r^2;

using NLsolve

function nls(func, params...; ini = [0.0])
   if typeof(ini) <: Number
       r = nlsolve((vout, vin) -> vout[1] = func(vin[1], params..., [ini]), ftol=big"1e-40")
       v = r.zero[1]
   else
       r = nlsolve((vout, vin)->vout .= func(vin, params...), ini, ftol=big"1e-40")
       v = r.zero
   end
   return v, r.f_converged
end;

function H(u)
   (R, x, y, r, x1, x2) = u
   return [
       -R^2 + y^2 + (-a + x)^2,  # eq1
       -R^2 + (-b1 + x)^2 + (-h + y)^2,  # eq2
       -(R + r)^2 + (-r + y)^2 + (x - x1)^2,  # eq3
       -(R - r)^2 + (x - x2)^2 + (-h + r + y)^2,  # eq4
       -r^2 + (-b1*(b1*x1 + h*r)/(b1^2 + h^2) + x1)^2 + (-h*(b1*x1 + h*r)/(b1^2 + h^2) + r)^2,  # eq5
       -r^2 + (-a + x2 - (-a + b2)*(h*(h - r) + (-a + b2)*(-a + x2))/(h^2 + (-a + b2)^2))^2 + (h - h*(h*(h - r) + (-a + b2)*(-a + x2))/(h^2 + (-a + b2)^2) - r)^2,  # eq6
   ]
end;

(a, b1, b2, h) = (20, 2.5, 17.5, 6)
iniv = BigFloat[58, 30, 57, 2.5, 4, 16]

res = nls(H, ini=iniv)

   (BigFloat[57.56982255166217430368373764600179694519317160797444036827676398212356912948373, 29.67870619946091644204851752021563342318059299182850454725481532377198840972876, 56.75039308176100628930817610062893081761006289283313826282654469433496619510539, 2.522911051212938005390835579514824797843665768189002299181505707691245681699234, 3.784366576819407008086253369272237196765498652305250418532069716249659729439736, 15.81805929919137466307277628032345013477088948787348219211610072959637679631966], true)

台形が等脚台形(h = 6;  a = 20;  b1 = 2.5;  b2 = 17.5)の場合,R = 57.5698;  x = 29.6787;  y = 56.7504;  r = 2.52291;  x1 = 3.78437;  x2 = 15.8181
となり,等円の直径は約 5.04582 である。

なお,台形は等脚台形でなくても構わない(条件の範囲内で)。
たとえば,下図のような場合,パラメータは以下の通りである。
h = 6;  a = 20;  b1 = 9;  b2 = 17.5;  R = 13.1643;  x = 20.0441;  y = 13.1643;  r = 2.55614;  x1 = 8.44236;  x2 = 15.7959

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (R, x, y, r, x1, x2) = res[1]
   @printf("h = %g;  a = %g;  b1 = %g;  b2 = %g;  R = %g;  x = %g;  y = %g;  r = %g;  x1 = %g;  x2 = %g\n", h, a, b1, b2, R, x, y, r, x1, x2)
   plot([0, a, b2, b1, 0], [0, 0, h, h, 0], color=:black, lw=0.5)
   circle(x1, r, r)
   circle(x2, h - r, r)
   θ1 = atand((y - h)/(x - b1))
   θ2 = atand(y/(x - a))
   circle(x, y, R, :blue, beginangle=180 + θ1, endangle=180 + θ2, by=0.05)  
   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(x1, r, "(x1,r)", :red, :center, delta=-3delta)
       point(x2, h - r, "(x2,h-r)", :red, :center, delta=-3delta)
       point(b1, h, "(b1,h)", :black, :center, :bottom, delta=delta)
       point(b2, h, "(b2,h)", :black, :center, :bottom, delta=delta)
       point(a, 0, " a", :black, :center, :bottom, delta=delta)
       point(a/2, h/2, "円弧:R,(x,y)", :blue, :center, :bottom, delta=3delta, mark=false)
   end
end;

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

算額(その653)

2024年01月25日 | Julia

算額(その653)

群馬県前橋市河原浜町 大胡神社 大正4年(1915)
http://www.wasan.jp/gunma/ohgo.html

この算額の問・答・術はほとんど判読できない。図はかろうじて見ることができるので,以下のようなものでもあろうかと推測して問を建ててみた。

外円内に互いに外接する 7 個の等円がある。更に外側の等円に外接し外円に内接する 7 個の小円がある。
外円の直径が与えられたとき,等円と小円の直径を求めよ。

外円の半径と中心座標を R, (0, 0)
等円の半径と中心座標を r1, (0, 0), (√3r1, r1)
小円の半径と中心座標を r2, (R - r2, 0)
とおき,以下の連立方程式を解く。

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

using SymPy
@syms R::positive, r1::positive, r2::positive
eq1 = (sqrt(Sym(3))r1 - R + r2)^2 + r1^2 - (r1 + r2)^2
eq2 = (sqrt(Sym(3))r1)^2 + r1^2 - (R - r1)^2
res = solve([eq1, eq2], (r1, r2))

   2-element Vector{Tuple{Sym, Sym}}:
    (-R/6 + sqrt(3)*R/3 + (1/2 - 2*sqrt(3)/3)*(10*sqrt(3)*R/39 + 9*R/13 - 4*sqrt(6)*R*sqrt(11894 - 6867*sqrt(3))/(3*(625 - 361*sqrt(3)))), 10*sqrt(3)*R/39 + 9*R/13 - 4*sqrt(6)*R*sqrt(11894 - 6867*sqrt(3))/(3*(625 - 361*sqrt(3))))
    (-R/6 + sqrt(3)*R/3 + (1/2 - 2*sqrt(3)/3)*(4*sqrt(6)*R*sqrt(11894 - 6867*sqrt(3))/(3*(625 - 361*sqrt(3))) + 10*sqrt(3)*R/39 + 9*R/13), 4*sqrt(6)*R*sqrt(11894 - 6867*sqrt(3))/(3*(625 - 361*sqrt(3))) + 10*sqrt(3)*R/39 + 9*R/13)

2 組の解が得られるが,2 番目のものが適解である。
表示される式は長いが簡約化すれば R/3,(5 - 2√3)R/13 になる。

res[2][1] |> sympy.sqrtdenest |> simplify |> println
res[2][2] |> sympy.sqrtdenest |> simplify |> println

   R/3
   -2*sqrt(3)*R/13 + 5*R/13

外円の直径が 3 のとき,等円の直径は 1,小円の直径は 3(5 - 2√3)/13 = 0.3544380888143644 である。

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   R = 3/2
   (r1, r2) = R .* [1/3, (5 - 2√3)/13]
   @printf("R = %g;  r1 = %g;  r2 = %g\n", R, r1, r2)
   plot()
   circle(0, 0, R, :green)
   circle(0, 0, r1)
   rotate(√3r1, r1, r1, angle=60)
   rotate(R - r2, 0, r2, :blue, angle=60)
   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(√3r1, r1, "等円:r1,(√3r1,r1)", :red, :center, delta=-delta/2)
       point(R - r2, 0, "小円:r2\n(R-r2,0)", :blue, :right, delta=-delta/2)
   end
end;

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

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

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