裏 RjpWiki

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

算額(その1107)

2024年06月30日 | Julia

算額(その1107)

二 岩手県花巻市大田 清水寺 嘉永三年(1850)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円6個,二等辺三角形

二等辺三角形の中に,中円 4 個,小円 1 個を容れる。中円 3 個に外接する大円の直径を求めよ。

二等辺三角形の底辺の長さを 2a,高さを h
大円の半径と中心座標を r0, (x0, r1*(1 + √3))
中円の半径と中心座標を r1, (r1, r1), (0, r1*(1 + √3)), (0, r1*(3 + √3))
小円の半径と中心座標を r2, (0, r1*(4 + √3) + r2)
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy
@syms a::positive, b::positive,
     r1::positive, r2::positive, r0::positive, x0::positive
eq1 = dist2(0, b, a, 0, 0, (4 + √Sym(3))r1 + r2, r2)
eq2 = dist2(0, b, a, 0, 0, (3 + √Sym(3))r1, r1)
eq3 = dist2(0, b, a, 0, r1, r1, r1)
eq4 = x0^2 + r1^2 - (r0 + r1)^2
eq5 = (x0 - r1)^2 + r1^2*(1 + √Sym(3))^2 - (r0 + r1)^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 Float64.(v), r.f_converged
end;

function H(u)
   (a, b, r1, r0, x0) = u
   return [
       (a^2*b^2 - 8*a^2*b*r1 - 2*sqrt(3)*a^2*b*r1 - 2*a^2*b*r2 + 8*sqrt(3)*a^2*r1^2 + 19*a^2*r1^2 + 2*sqrt(3)*a^2*r1*r2 + 8*a^2*r1*r2 - b^2*r2^2)/(a^2 + b^2),  # eq1
       (a^2*b^2 - 6*a^2*b*r1 - 2*sqrt(3)*a^2*b*r1 + 6*sqrt(3)*a^2*r1^2 + 11*a^2*r1^2 - b^2*r1^2)/(a^2 + b^2),  # eq2
       a*b*(a*b - 2*a*r1 - 2*b*r1 + 2*r1^2),  # eq3
       r1^2 + x0^2 - (r0 + r1)^2,  # eq4
       r1^2*(1 + sqrt(3))^2 - (r0 + r1)^2 + (-r1 + x0)^2,  # eq5
   ]
end;
r2 = 1/2
iniv = BigFloat[1.96, 7.3, 0.85, 2.4, 3.17]
res = nls(H, ini=iniv)

   ([1.9558948090462631, 7.299498801620881, 0.8491981862085499, 2.431851652578137, 3.1692507766256446], true)

大円の半径は,小円の半径の 2.431851652578137/0.5 = 4.863703305156274 倍である。
小円の直径が 1 寸のとき,大円の直径は 4.863703305156274 寸である。

「術」では,「置四十八開平方加八個開平方加一個乗小円径」とあるが,これを山村は √48 + 1 倍とケアレスミスをしている。
術は,√(√48 + 8) + 1 倍といっており,これは二重根号を外して 1 + √2 + √6 となるが,いずれにしろそれは 4.863703305156273 倍ということで,上の数値解と一致している。

sqrt(√Sym(48) + 8)+1 |>sympy.sqrtdenest |> println
1 + sqrt(2) + sqrt(6) |> println

   1 + sqrt(2) + sqrt(6)
   4.863703305156273

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

   r2 = 0.5;  a = 1.95589;  b = 7.2995;  r1 = 0.849198;  r0 = 2.43185;  x0 = 3.16925

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r2 = 1/2
   (a, b, r1, r0, x0) = res[1]
   @printf("小円の直径が %g のとき,大円の直径は %g である。\n", 2r2, 2r0)
   @printf("r2 = %g;  a = %g;  b = %g;  r1 = %g;  r0 = %g;  x0 = %g\n", r2, a, b, r1, r0, x0)
   plot([a, 0, -a, a], [0, b, 0, 0], color=:magenta, lw=0.5)
   circle2(r1, r1, r1)
   circle(0, r1*(1 + √3), r1, :red)
   circle(0, r1*(3 + √3), r1, :red)
   circle(0, r1*(4 + √3)+ r2, r2, :blue)
   circle(x0, r1*(2 + √3), r0, :green)
   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(r1, r1, "中円:r1\n(r1,r1)", :red, :center, delta=-delta/2)
       point(0, r1*(1 + √3), "中円:r1\n(0,r1*(1+√3))", :red, :center, delta=-delta/2)
       point(0, r1*(3 + √3), "中円:r1\n(0,r1*(3+√3))", :red, :center, delta=-delta/2)
       point(0, r1*(4 + √3) + r2, "小円:r1\n(0,r1*(4+√3)+r2)", :red, :center, delta=-delta/2)
       point(x0, r1*(2 + √3), "大円:r0,(x0,r1*(2+√3))", :green, :center, delta=-delta/2)
       point(a, 0, "a", :magenta, :left, :bottom, delta=delta/2)
       point(0, b, " b", :magenta, :left, :vcenter)
   end
end;

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

算額(その1106)

2024年06月30日 | Julia

算額(その1106)

百四 岩手県大船渡市田茂山 根城八幡宮 天保12年(1841)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円4個,斜線,直線上

直線上に 1 個の小円を挟んで 2 個の大円が載り,その3円に外接して大円 1 個が載っている。小円の直径が与えられたとき,大円の直径を求めよ。

大円の半径と中心座標を r1, (x1, r1)
小円の半径と中心座標を r2, (0, r2)
斜線の端点の座標を (0, 0), (x1, y1)
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy
@syms r1::positive, x1::positive, y1::positive, r2::positive
eq1 = x1^2 + (r1 - r2)^2 - (r1 + r2)^2
eq2 = dist2(0, 0, x1, y1, 0, 2r2 + r1, r1)
eq3 = dist2(0, 0, x1, y1, x1, r1, r1)
res = solve([eq1, eq2, eq3], (r1, x1, y1))[1]

   (r2*(-1 + sqrt(17))/2, r2*sqrt(-2 + 2*sqrt(17)), r2 + sqrt(17)*r2)

大円の半径 r1 は,小円の半径の (√17 - 1)/2 倍である。
「術」は「置四個二分五厘開平方内減八分余乗小円径」と書いているが,「八分」ではなく「五分」の誤記(山村の誤読?)である。「四個二分五厘」は 17/4 なので,√(17/4) - 1/2 = (√17 - 1)/2 である。

小円の直径が 1 寸のとき,大円の直径は (√17 - 1)/2 = 1.5615528128088303 寸である。

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

  r2 = 0.5;  r1 = 0.780776;  x1 = 1.24962;  y1 = 2.56155

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r2 = 1/2
   (r1, x1, y1) = (r2*(-1 + sqrt(17))/2, r2*sqrt(-2 + 2*sqrt(17)), r2 + sqrt(17)*r2)
   @printf("小円の直径が %g のとき,大円の直径は %g である。\n", 2r2, 2r1)
   @printf("r2 = %g;  r1 = %g;  x1 = %g;  y1 = %g\n", r2, r1, x1, y1)
   plot([-x1, 0, x1], [y1, 0, y1], color=:green, lw=0.5)
   circle(0, 2r2 + r1, r1)
   circle2(x1, r1, r1)
   circle(0, r2, r2, :blue)
   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(x1, r1, "大円:r1,(x1,r1)", :red, :center, delta=-delta/2)
       point(0, 2r2 + r1, "大円:r1,(0,2r2+r1)", :red, :center, delta=-delta/2)
       point(0, r2, "小円:r2\n(0,r2)", :blue, :center, :bottom, delta=delta/2)
       point(x1, y1, " (x1,y1)", :green, :left, :vcenter)
   end
end;

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

算額(その1105)

2024年06月30日 | Julia

算額(その1105)

百四 岩手県大船渡市田茂山 根城八幡宮 天保12年(1841)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:楕円6個,正六角形

正六角形の中に等楕円を 6 個容れる。楕円の長径・短径が与えられたとき,正六角形の一辺の長さを求めよ。

計算式を簡単にするため,図形を時計方向に 30° 回転させたもので考える。x 軸上に長径を持つ楕円について以下のように記号を定める。
正六角形の一辺の長さを R
楕円の長半径,短半径,中心座標を a, b, (x0, 0)
隣の楕円との接点,正三角形の一辺との接点の座標を (x1, y1), (x2, y2); y1 = √3(R - x1), y2 = √3x2/3
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy
@syms a::positive, b::positive, R::positive, x0::positive,
     x1::positive, y1::positive, x2::positive, y2::positive
y1 = √Sym(3)*(R - x1)
y2 = √Sym(3)*x2/3
eq1 = (x1 - x0)^2/a^2 + y1^2/b^2 - 1
eq2 = -b^2*(x1 - x0)/(a^2*y1) + √Sym(3)
eq3 = (x2 - x0)^2/a^2 + y2^2/b^2 - 1
eq4 = -b^2*(x2 - x0)/(a^2*y2) - 1/√Sym(3);
res = solve([eq1, eq2, eq3, eq4], (R, x0, x1, x2))[2]

   ((a^2 + 3*b^2 + sqrt(9*a^4 + 30*a^2*b^2 + 9*b^4)/3)/sqrt(a^2 + 3*b^2), sqrt(a^2 + 3*b^2), (a^2*sqrt(9*a^4 + 30*a^2*b^2 + 9*b^4) + (a^2 + 3*b^2)*(3*a^2 + b^2))/(sqrt(a^2 + 3*b^2)*(3*a^2 + b^2)), 3*b^2/sqrt(a^2 + 3*b^2))

各パラメータは以下のように簡約化して求めることができる。

t  = a^2 + 3b^2
u  = 3a^2 + b^2
x0 = sqrt(t)
R  = x0 + sqrt(u/3)
x1 = (a^2*sqrt(3t*u) + t*u)/(x0*u)
x2 = 3b^2/x0;

楕円の長径・短径が 10,7 のとき,正六角形の一辺の長さは sqrt((10/2)^2 + 3(7/2)^2) + sqrt((10/2)^2 + (7/2)^2/3) = 13.251013385205335 である。

sqrt((10/2)^2 + 3(7/2)^2) + sqrt((10/2)^2 + (7/2)^2/3) |> println

   13.251013385205335

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

   a = 5;  b = 3.5;  x0 = 7.85812;  R = 13.251;  x1 = 12.4938;  x2 = 4.67669

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (a, b) = (10, 7)./2
   t = a^2 + 3b^2
   u = 3a^2 + b^2
   x0 = sqrt(t)
   R = x0 + sqrt(u/3)
   R = sqrt(a^2 + 3b^2) + sqrt(a^2 + b^2/3)
   x1 = (a^2*sqrt(3t*u) + t*u)/(x0*u)
   x2 = 3b^2/x0
   y1 = √3(R - x1)
   y2 = √3x2/3
   @printf("楕円の長径・短径が %g, %g のとき,正六角形の一辺の長さは %g である。\n", 2a, 2b, R)
   @printf("a = %g;  b = %g;  x0 = %g;  R = %g;  x1 = %g;  x2 = %g\n", a, b, x0, R, x1, x2)
   θ = 0:60:420
   x = @. R*cosd(θ)
   y = @. R*sind(θ)
   plot()
   circle(0, 0, R)
   for i = 1:6
       ellipse(x0*cosd(60(i)), x0*sind(60(i)), a, b, φ=60(i), color=:green)
       segment(x[i], y[i], x[i + 1], y[i + 1], :blue)
   end
   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(x1, y1, "(x1,y1) ", :green, :right, :vcenter)
       point(x2, y2, "(x2,y2)", :green, :left, delta=-delta/2)
       point(x0, 0, "楕円:a, b,(x0, 0)", :green, :center, delta=-delta/2)
   end
end;

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

算額(その1104)

2024年06月29日 | Julia

算額(その1104)

百 岩手県大船渡市猪川町 雨宝堂 現雨宝山竜宝院 文政10年(1827)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円6個,円弧3個,正三角形

正三角形の中に円弧を 3 個描き,隙間に大円 3 個,小円 3 個を容れる。小円の直径が 1 寸のとき,大円の直径はいかほどか。

円弧を構成する円の半径と中心座標を R, (R√3/2, R/2), (-R√3/2, R/2), (0, -R)
大円の半径と中心座標を r1, (0, r1 - R/2)
小円の半径と中心座標を r2, (r2, R/2)
とおき,連立方程式を解く。
図の位置の大円,小円についての方程式を立てると,余分なパラメータを使わないですむ(図を描くときは必要になるが,それは描画関数で隠蔽する)。

include("julia-source.txt")

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

   (3*sqrt(3)*r2/8 + 3*r2/4, 2*sqrt(3)*r2 + 4*r2)

大円の半径 r1 は,小円の半径 r2 の 3(√3 + 2)/8 倍である。
小円の直径が 1 寸のとき,大円の直径は 3(√3 + 2)/8 = 1.399519052838329 寸である

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r2 = 1/2
   (r1, R) = (3√3r2/8 + 3r2/4, 2√3r2 + 4r2) 
   plot(R√3/2 .* [1, 0, -1, 1], R/2 .* [-1, 2, -1, -1], color=:red, lw=0.5)
   rotate(R√3/2, R/2, R, :blue)
   rotate(0, R/2, r2, :green)
   rotate(0, -R/2 + r1, r1)
   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(R√3/2, R/2, "円弧:R,(R√3/2,R/2)", :blue, :center, delta=-delta/2)
       point(-R√3/2, R/2, "円弧:R,(-R√3/2,R/2)", :blue, :center, delta=-delta/2)
       point(0, -R, "円弧:R,(0,-R)", :blue, :center, delta=-delta/2)
       point(0, R, " R", :red, :left, :vcenter)
       point(R√3/2, -R/2, "(R√3/2,-R/2)", :red, :right, delta=-delta/2)
       point(0, r1 - R/2, " 大円:r1,(0,r1-R/2)", :black, :center, delta=-1.5delta)
       point(0, R/2, "小円:r2,(r2,R/2)", :black, :left, :bottom, delta=delta)
       plot!(xlims=(-5, 6), ylims=(-4.5, 4))
   end
end;

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

算額(その1103)

2024年06月28日 | Julia

算額(その1103)

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

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円8個,外円,弦,斜線

全円の中に水平な弦と斜線を引き,甲円 3 個,乙円 2 個,丙円 2 個を容れる。丙円の直径が 8 寸のとき,乙円の直径はいかほどか。

全円の半径と中心座標を R, (0, 0)
甲円の半径と中心座標を r1, (0, R - r1), (0, R - 3r1), (0, r1 - R)
乙円の半径と中心座標を r2,(x2, y2); y2 = -r1
丙円の半径と中心座標を r3, (x3, R - 2r1 + r3)
斜線と全円の交点座標を (x0, -sqrt(R^2 - x0^2))
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy
@syms R::positive, r1::positive, r2::positive,
     x2::positive, y2::positive, r3::positive,
     x3::positive, x0::positive
y2 = -r1  # (R - 2r1) - (2R - 2r1)/2
eq1 = x3^2 + (r1 - r3)^2 - (r1 + r3)^2
eq2 = x2^2 + y2^2 - (R - r2)^2
eq3 = x3^2 + (R - 2r1 + r3)^2 - (R - r3)^2
eq4 = dist2(sqrt(R^2 - (R - 2r1)^2), R - 2r1, -x0, -sqrt(R^2 - x0^2), 0, R - 3r1, r1) |> numerator
eq5 = dist2(sqrt(R^2 - (R - 2r1)^2), R - 2r1, -x0, -sqrt(R^2 - x0^2), 0, r1 - R, r1) |> numerator
eq6 = dist2(sqrt(R^2 - (R - 2r1)^2), R - 2r1, -x0, -sqrt(R^2 - x0^2), x2, y2, r2) |> numerator;

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 Float64.(v), r.f_converged
end;

function H(u)
   (R, r1, r2, x2, x3, x0) = u
   s = sqrt(R^2 - x0^2)
   t = sqrt(R - r1)
   u = sqrt(r1)
   v = r1^(3/2)
   w = r1^(5/2)
   return [
       x3^2 + (r1 - r3)^2 - (r1 + r3)^2,  # eq1
       r1^2 + x2^2 - (R - r2)^2,  # eq2
       x3^2 - (R - r3)^2 + (R - 2*r1 + r3)^2,  # eq3
       8R^5*r1 - 42R^4*r1^2 + 8R^4*r1*s + 4R^3*v*x0*t + 78R^3*r1^3 - 42R^3*r1^2*s - 6R^3*r1*x0^2 - 26R^2*w*x0*t + 4R^2*v*x0*t*s - 46R^2*r1^4 + 78R^2*r1^3*s + 47R^2*r1^2*x0^2/2 - 2R^2*r1*x0^2*s + 60R*r1^(7/2)*x0*t - 26R*w*x0*t*s - 2R*v*x0^3*t - 78R*r1^4*s - 36R*r1^3*x0^2 + 5R*r1^2*x0^2*s/2 - 36*r1^(9/2)*x0*t + 20*r1^(7/2)*x0*t*s + w*x0^3*t + 36*r1^5*s + 20*r1^4*x0^2 - r1^3*x0^2*s,  # eq4
       12R^4*r1^2 + 4R^4*x0^2 + 24R^3*v*x0*t - 20R^3*r1^3 - 20R^3*r1^2*s + 8R^3*r1*x0^2 + 4R^3*x0^2*s - 52R^2*w*x0*t - 40R^2*v*x0*t*s + 16R^2*u*x0^3*t + 4R^2*r1^4 + 44R^2*r1^3*s - 73R^2*r1^2*x0^2 - 40R^2*r1*x0^2*s + 24R*r1^(7/2)*x0*t + 76R*w*x0*t*s - 60R*v*x0^3*t - 28R*r1^4*s + 88R*r1^3*x0^2 + 85R*r1^2*x0^2*s - 8*r1^(9/2)*x0*t - 24*r1^(7/2)*x0*t*s + 50*w*x0^3*t + 8*r1^5*s - 24*r1^4*x0^2 - 50*r1^3*x0^2*s,  # eq5
       4R^5*r1 - 4R^4*u*x0*t - 8R^4*u*x2*t - 12R^4*r1^2 + 4R^4*r1*s - 4R^4*r2^2 + R^4*x0^2 + 4R^4*x0*x2 + 4R^4*x2^2 + 24R^3*v*x0*t + 24R^3*v*x2*t - 4R^3*u*x0*t*s - 8R^3*u*x2*t*s + 28R^3*r1^3 - 20R^3*r1^2*s + 8R^3*r1*r2^2 - 6R^3*r1*x0^2 - 20R^3*r1*x0*x2 - 12R^3*r1*x2^2 - 4R^3*r2^2*s + R^3*x0^2*s + 4R^3*x0*x2*s + 4R^3*x2^2*s - 20R^2*w*x0*t - 32R^2*w*x2*t + 8R^2*v*x0*t*s + 24R^2*v*x2*t*s - 8R^2*u*r2^2*x0*t + 6R^2*u*x0^3*t + 12R^2*u*x0^2*x2*t + 4R^2*u*x0*x2^2*t - 20R^2*r1^4 + 20R^2*r1^3*s - 8R^2*r1^2*r2^2 + 21R^2*r1^2*x0^2 + 24R^2*r1^2*x0*x2 + 12R^2*r1^2*x2^2 + 8R^2*r1*r2^2*s - 16R^2*r1*x0^2*s - 20R^2*r1*x0*x2*s - 12R^2*r1*x2^2*s + 2R^2*r2^2*x0^2 - 2R^2*x0^3*x2 - 3R^2*x0^2*x2^2 + 8R*r1^(7/2)*x0*t - 28R*w*x0*t*s - 16R*w*x2*t*s - 24R*v*x0^3*t - 32R*v*x0^2*x2*t - 8R*v*x0*x2^2*t - 8R*u*r2^2*x0*t*s + 8R*u*x0^2*x2*t*s + 4R*u*x0*x2^2*t*s - 12R*r1^4*s - 40R*r1^3*x0^2 - 24R*r1^3*x0*x2 + 33R*r1^2*x0^2*s + 48R*r1^2*x0*x2*s + 12R*r1^2*x2^2*s - 16R*r1*r2^2*x0^2 + 14R*r1*x0^3*x2 + 8R*r1*x0^2*x2^2 - R*x0^2*x2^2*s - 8*r1^(9/2)*x0*t + 24*r1^(7/2)*x0*t*s + 16*r1^(7/2)*x2*t*s + 18*w*x0^3*t + 32*w*x0^2*x2*t + 8*w*x0*x2^2*t + 16*v*r2^2*x0*t*s - 12*v*x0^2*x2*t*s - 8*v*x0*x2^2*t*s - 2*u*x0^3*x2^2*t + 8*r1^5*s + 24*r1^4*x0^2 + 16*r1^4*x0*x2 - 18*r1^3*x0^2*s - 32*r1^3*x0*x2*s - 8*r1^3*x2^2*s + 16*r1^2*r2^2*x0^2 - 12*r1^2*x0^3*x2 - 8*r1^2*x0^2*x2^2 + 2*r1*x0^2*x2^2*s,  # eq6
   ]
end;

r3 = 8/2
iniv = BigFloat[18.8, 5.8, 6.4, 10.8, 9.6, 11.8]
res = nls(H, ini=iniv)

   ([18.77777777777778, 5.777777777777778, 6.5, 10.833333333333334, 9.614803401237305, 11.786666666666667], true)

甲円の直径は乙円の直径の 13/8 倍である。
乙円の直径が 8 寸のとき,甲円の直径は 13 寸である。

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

   R = 169/9, r1 = 52/9, r2 = 13/2, x2 = 65/6, x3 = 9.614803401237305, x0 = 884/75

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r3 = 8/2
   (R, r1, r2, x2, x3, x0) = [169/9, 52/9, 13/2, 65/6, 9.614803401237305, 884/75]
   (R, r1, r2, x2, x3, x0) = [18.77777777777778, 5.777777777777778, 6.5, 10.833333333333334, 9.614803401237305, 11.786666666666667]
   y2 = (R - 2r1) - (2R - 2r1)/2
   plot()
   circle(0, 0, R, :blue)
   circle(0, R - r1, r1, :magenta)
   circle(0, R - 3r1, r1, :magenta)
   circle(0, r1 -R, r1, :magenta)
   circle2(x2, y2, r2)
   circle2(x3, R - 2r1 + r3, r3, :orange)
   segment(-sqrt(R^2 - (R - 2r1)^2), R - 2r1, sqrt(R^2 - (R - 2r1)^2), R - 2r1)
   segment(x0, -sqrt(R^2 - x0^2), -sqrt(R^2 - (R - 2r1)^2), R - 2r1)
   segment(-x0, -sqrt(R^2 - x0^2), sqrt(R^2 - (R - 2r1)^2), R - 2r1)
   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(0, R, " R", :blue, :left, :bottom, delta=delta/2)
       point(R, 0, " R", :blue, :left, :bottom, delta=delta/2)
       point(sqrt(R^2 - (R - 2r1)^2), R - 2r1, "(√(R^2-(R-2r1)^2),R-2r1)", :black, :right, delta=-delta/2)
       point(-x0, -sqrt(R^2 - x0^2), "(-x0,-√(R^2-x0^2))", :black, :center, delta=-delta/2)
       point(0, R - r1, "甲円:r1,(0,R-r1)", :magenta, :center, delta=-delta/2)
       point(0, R - 3r1, "甲円:r1,(0,R-3r1)", :magenta, :center, delta=-delta/2)
       point(0, r1 - R, "甲円:r1,(0,r1-R)", :magenta, :center, delta=-delta/2)
       point(x2, y2, "乙円:r2,(x2,y2)", :red, :center, delta=-delta/2)
       point(x3, R - 2r1 + r3, "丙円:r3\n(x3,R-2r1+r3)", :black, :center, delta=-delta/2)
   end
end;

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

算額(その1102)

2024年06月28日 | Julia

算額(その1102)

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

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円12個,外円

全円の中に,甲円,乙円,丙円,丁円,戊円を容れる。戊円の直径が 1 寸のとき,丙円の直径はいかほどか。

全円の半径と中心座標を R, (0, 0)
甲円の半径と中心座標を r1, (0, R - r1)
乙円の半径と中心座標を r2, (R - r2, 0)
丙円の半径と中心座標を r3, (x2, y3)
丁円の半径と中心座標を r4, (r5 + r4, 0)
戊円の半径と中心座標を r5, (0, 0)
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy
@syms R::positive, r1::positive, r2::positive,
     r3::positive, x3::positive, y3::positive,
     r4::positive, r5::positive
R = 2r1 + r5
r4 = r1 - r2
eq1 = (R - r2)^2 + (R - r1)^2 - (r1 + r2)^2 |> expand
eq2 = x3^2 + (R - r1 - y3)^2 - (r1 + r3)^2 |> expand
eq3 = (r4 + r5)^2 + (R - r1)^2 - (r1 + r4)^2 |> expand
eq4 = (x3 - R + r2)^2 + y3^2 - (r2 + r3)^2 |> expand
eq5 = x3^2 + y3^2 - (R - r3)^2 |> expand;

println(eq1, ",  # eq1")
println(eq2, ",  # eq2")
println(eq3, ",  # eq3")
println(eq4, ",  # eq4")
println(eq5, ",  # eq5")

   4*r1^2 - 6*r1*r2 + 6*r1*r5 - 2*r2*r5 + 2*r5^2,  # eq1
   -2*r1*r3 + 2*r1*r5 - 2*r1*y3 - r3^2 + r5^2 - 2*r5*y3 + x3^2 + y3^2,  # eq2
   -2*r1^2 + 2*r1*r2 + 4*r1*r5 - 2*r2*r5 + 2*r5^2,  # eq3
   4*r1^2 - 4*r1*r2 + 4*r1*r5 - 4*r1*x3 - 2*r2*r3 - 2*r2*r5 + 2*r2*x3 - r3^2 + r5^2 - 2*r5*x3 + x3^2 + y3^2,  # eq4
   -4*r1^2 + 4*r1*r3 - 4*r1*r5 - r3^2 + 2*r3*r5 - r5^2 + x3^2 + y3^2,  # eq5

res = solve([eq1, eq3], (r1, r2))[1];

ans_r1 = res[1] |> simplify
ans_r1 |> println

   r5*(3 + 2*sqrt(3))

ans_r2 = res[2]|> simplify
ans_r2 |> println

   r5*(5 + 3*sqrt(3))/2

eq12 = eq2(r1 => ans_r1, r2 => ans_r2) |> simplify
eq14 = eq4(r1 => ans_r1, r2 => ans_r2) |> simplify
eq15 = eq5(r1 => ans_r1, r2 => ans_r2) |> simplify
res2 = solve([eq12, eq14, eq15], (r3, x3, y3))[1];

#= r3 =# res2[1] |> sympy.sqrtdenest |> simplify |> println

   r5*(sqrt(3) + 3)/2

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

   r5*(5*sqrt(3) + 9)/2

#= y3 =# res2[3] |> sympy.sqrtdenest |> simplify |> println

   2*sqrt(3)*r5 + 4*r5

丙円の半径 r3 は 戊円の半径 r5 の (√3 + 3)/2 倍である。
戊円の直径が 1 寸のとき,丙円の直径は 2.3660254037844384 寸である。

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

  r5 = 0.5;  r1 = 3.23205;  r2 = 2.54904;  r3 = 1.18301;  x3 = 4.41506;  y3 = 3.73205

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r5 = 1/2
   (r1, r2, r3, x3, y3) = r5 .* (3 + 2√3, (5 + 3√3)/2, (√3 + 3)/2, (5√3 + 9)/2, 2√3 + 4)
   R = 2r1 + r5
   r4 = r1 - r2
   @printf("戊円の直径が %g のとき,丙円の直径は %g である。\n", 2r5, 2r3)
   @printf("r5 = %g;  r1 = %g;  r2 = %g;  r3 = %g;  x3 = %g;  y3 = %g\n", r5, r1, r2, r3, x3, y3)
   plot()
   circle(0, 0, R, :blue)
   circle22(0, R - r1, r1)
   circle2(R - r2, 0, r2, :green)
   circle4(x3, y3, r3, :orange)
   circle2(r5 + r4, 0, r4, :magenta)
   circle(0, 0, r5, :cyan4)
   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(0, R - r1, "甲円:r1,(0,R-r1)", :red, :center, delta=-delta/2)
       point(R - r2, 0, "乙円:r2,(R-r2,0)", :green, :center, delta=-delta/2)
       point(x3, y3, "丙円:r3\n(x3,y3)", :orange, :center, delta=-delta/2)
       point(r5 + r4, 0, "丁円:r4,(r5+r4,0)", :magenta, :left, :bottom, delta=delta)
       point(0, 0, "戊円:r4\n(0,0)", :cyan4, :center, delta=-3delta)
       point(R, 0, " R", :blue, :left, :bottom, delta=delta/2)
       point(0, R, " R", :blue, :left, :bottom, delta=delta/2)
   end
end;

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

算額(その1101)

2024年06月27日 | Julia

算額(その1101)

六十六 岩手県花泉町金沢字大柳 金沢八幡宮 明治29年(1896)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円3個,四分円3個,外円

全円の中に 四分円を 3 個,等円を 3 個容れる。正三角形の一辺の長さ(四分円の半径)が与えられたとき,等円の直径を求めよ。

全円の半径と中心座標を R, (0, 0); R = sqrt((√3a/3 + 2a)^2 + a^2) = 2a*sqrt(3√3 + 12)/3
四分円の半径と中心座標を 2a, (0, 2√3a/3), (-a, -√3a/3)
等円の半径と中心座標を r, (x, y); x < 0
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy
@syms R::positive, a::positive,
     x::negative, y::positive, r::positive
R = sqrt((√Sym(3)a/3 + 2a)^2 + a^2)
eq1 = (x + a)^2 + (y + √Sym(3)a/3)^2 - (2a + r)^2
eq2 = x^2 + y^2 - (R - r)^2
eq3 = dist2(0, 2√Sym(3)a/3, √Sym(3)a, 2√Sym(3)a/3 + a, x, y, r);

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 Float64.(v), r.f_converged
end;

function H(u)
   (r, x, y) = u
   return [
       (a + x)^2 - (2*a + r)^2 + (sqrt(3)*a/3 + y)^2,  # eq1
       x^2 + y^2 - (-r + sqrt(a^2 + (sqrt(3)*a/3 + 2*a)^2))^2,  # eq2
       a^2 + a*x - sqrt(3)*a*y - r^2 + x^2/4 - sqrt(3)*x*y/2 + 3*y^2/4,  # eq3
   ]
end;
a = 1/2
iniv = BigFloat[0.38, -0.019, 1]
res = nls(H, ini=iniv)

   ([0.3786461241150318, -0.019277088702774222, 1.0034435202087308], true)

正三角形の一辺の長さが 1 のとき,等円の直径は 2*0.3786461241150318 = 0.7572922482300636 である。
算額の「術」は正しいが,山村の解説は途中で数値の参照ミスをしているため結果がだめになっている。「0.636×三角面」ではなく「(正確に)0.7572922482300636×三角面」である。

三角面 = 1
天 = √3
地 = √(天 + 4) + 天
誤 A = sqrt((3*0.732 + 1)*(2地 + 1) + 3) + (地 + 1) 0.732 ではなく 1.732(=√3)
A = sqrt((3天 + 1)*(2地 + 1) + 3) + (地 + 1)
等円径 = A/地^2*三角面

   0.7572922482300636

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

   a = 0.5;  R = 1.38227;  r = 0.378646;  x = -0.0192771;  y = 1.00344

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   a = 1/2 #10√3/2
   (r, x, y) = res[1]
   #a = 8.66025;  R = 23.9417;  r = 6.61269;  x = -0.39708;  y = 17.3766
   R = sqrt((√3a/3 + 2a)^2 + a^2)
   @printf("正三角形の一辺の長さが %g のとき,等円の直径は %.15g である。\n", 2a, 2r)
   @printf("a = %g;  R = %g;  r = %g;  x = %g;  y = %g\n", a, R, r, x, y)
   plot([a, 0, -a, a], [-√3a/3, 2√3a/3, -√3a/3, -√3a/3], color=:magenta, lw=0.5)
   circle(0, 0, R, :blue)
   rotate(x, y, r, :green)
   for i = 0:2 # 90:120:330
       ox = 2√3a/3*cosd(90 + 120i)
       oy = 2√3a/3*sind(90 + 120i)
       ba = -60 + 120i
       ea = -60 + 120i + 90
       circle(ox, oy, 2a, beginangle=ba, endangle=ea)
       x1 = ox + 2a*cosd(ea)
       y1 = oy + 2a*sind(ea)
       segment(ox, oy, x1, y1, :red)
   end
   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(x, y, "(x,y)")
       point(a, -√3a/3, "(a,-√3a/3) ", :magenta, :right, :bottom, delta=delta/2)
       point(0, 2√3a/3, " 2√3a/3", :magenta, :left, :vcenter)
       point(0, R, " R", :blue, :center, :bottom, delta=delta/2)
       point(√3a, 2√3a/3 + a)
   end
end;

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

算額(その1100)

2024年06月27日 | Julia

算額(その1100)

六十六 岩手県花泉町金沢字大柳 金沢八幡宮 明治29年(1896)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円3個,二等辺三角形4個,半円1個

半円の中に二等辺三角形を 4 個,大円 1 個,小円 2 個を容れる。小円の直径が与えられたとき,大円の直径を求めよ。

半円の半径と中心座標を R, (0, 0)
大円の半径と中心座標を r1, (0, R - r1)
小円の半径と中心座標を r2, (R/2, y2)
二等辺三角形の高さを y0
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy
@syms R::positive, r1::positive,
     r2::positive, y2::positive, y0::positive
y0 = √Sym(7)R/4  # y0 = sqrt(R^2 - (3R/4)^2)
eq1 = R^2/4 + y2^2 - (R - r2)^2 |> expand
eq2 = r2/y0 - r1 /(R - r1)
eq2 = r2/y2 - r1 /(R - r1)
eq3 = dist2(0, 0, R/4, y0, R/2, y2, r2)
eq4 = dist2(0, 0, R/4, y0, 0, R - r1, r1)
res = solve([eq1, eq2, eq4], (R, r1, y2))[1]

   (2*r2*(5*sqrt(9 - 4*sqrt(2)) + 14 + 10*sqrt(18 - 8*sqrt(2)))/21, 2*r2*(-2 + 4*sqrt(2) + 5*sqrt(9 - 4*sqrt(2)))/21, 2*sqrt(2)*r2)

それぞれの解は簡約化できるものもある。

#= R =# res[1] |> sympy.sqrtdenest |> simplify |> println

   14*r2/3

#= r1 =# res[2] |> sympy.sqrtdenest |> simplify |> println

   2*r2*(-1 + 2*sqrt(2))/3

#= y2 =# res[3] |> println

   2*sqrt(2)*r2

大円の半径 r1 は,小円の半径 r2 の (4√2 - 2)/3 倍である。
小円の直径が 1 寸のとき,大円の直径は 1.2189514164974602 寸である。

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

   r2 = 0.5;  R = 2.33333;  r1 = 0.609476;  y2 = 1.41421;  y0 = 1.54335

「術」では,小円の直径の (70 - √1372)/27 = 1.220721542410953 としているので,食い違いがある。

原因は図形の解釈にあるかもしれない。
いつもの通り,山村の図が不正確であり(算額の図も同じかもしれないが),左右の二等辺三角形の頂点が半円の円周上にあるかどうか不明瞭である。
山村の図では右の二等辺三角形の頂点は円周上にないが,左のそれは円周上にあるように見える。
ここでは,頂点は円周上にあるものとして解いた(そのほうが算額らしいと思うので)。しかし,別途,円周上にないとして解いた場合でも 1.2260924510696558 となり,やはり「術」の解とは一致しなかった。

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r2 = 1/2
   (R, r1, y2) = r2 .* (14/3, (4√2 - 2)/3, 2√2)
   y0 = √7R/4
   @printf("小円の直径が %g のとき,大円の直径は %g である。\n", 2r2, 2r1)
   @printf("r2 = %g;  R = %g;  r1 = %g;  y2 = %g;  y0 = %g\n", r2, R, r1, y2, y0)
   plot(R .* [1, 3/4, 1/2, 1/4, 0, -1/4, -1/2, -3/4, -1, 1], [0, y0, 0, y0, 0, y0, 0, y0, 0, 0], color=:magenta, lw=0.5)
   circle(0, 0, R, :blue, beginangle=0, endangle=180)
   circle(0, R - r1, r1)
   circle2(R/2, y2, r2, :green)
   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(R/4, 0, "R/4", :magenta, :center, delta=-delta)
       point(R/2, 0, "R/2", :magenta, :center, delta=-delta)
       point(3R/4, 0, "3R/4", :magenta, :center, delta=-delta)
       point(3R/4, y0, " (3R/4,y0)", :magenta, :left, :vcenter)
       point(R/2, y2, "小円:r2\n(R/2,y2)", :green, :center, delta=-delta)
       point(0, R - r1, "大円:r1\n(0,R-r1)", :red, :center, delta=-delta)
       point(0, R, "R", :blue, :center, :bottom, delta=delta)
       point(R, 0, " R", :blue, :left, :bottom, delta=delta)
       plot!(ylims=(-8delta, R + 2delta))
   end
end;

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

算額(その1099)

2024年06月27日 | Julia

算額(その1099)

六十六 岩手県花泉町金沢字大柳 金沢八幡宮 明治29年(1896)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円3個,外円,直角三角形2個

全円の中に交差する(合同な)直角三角形を 2 個と,大円,小円を 1 個ずつ容れる。大円と小円の直径が与えられたとき,全円の直径を求めよ。

内接する直角三角形なので,斜辺は全円の直径である。一つの直角三角形の斜辺が x 軸上になるように図を描く。
全円の半径と中心座標を R, (0, 0)
大円の直径と中心座標を r1, (x1, r1); x1 < 0
小円の半径と中心座標を r2, (0, R - r2)
直角三角形の直径上ではない直角の頂点の座標を (x0, y0)
とおき,以下の方程式を解く。

なお,証明はしないが x1 = r2 - r1 である(図の水色の垂直線を参照)ので,方程式の解は簡単に求まる。

include("julia-source.txt")

using SymPy
@syms R::positive, x0::positive, y0::positive,
     r1::positive, x1::negative, r2::positive
y0 = sqrt(R^2 - x0^2)
x1 = r2 - r1  # 未証明
eq1 = x1^2 + r1^2 - (R - r1)^2
eq2 = dist2(-x0, y0, x0, -y0, -x1, r1, r1)
eq3 = dist2(-R, 0, x0, y0, 0, R - r2, r2);

最初に eq1 を解くことで全円の半径 R が求まる。「術」と同じ式になる。

ans_R = solve(eq1, R)[2]
ans_R |> println

   r1 + sqrt(2*r1^2 - 2*r1*r2 + r2^2)

次いで,eq2 を解いて x0 を求める。
なお,eq3 を解いても求まるが,本質的におなじ式であるが eq3 から求める式は SymPy では簡約化できず,長く複雑なものになる。

ans_x0 = solve(eq2, x0)[3] |> factor
ans_x0 |> println

   R*r2*(2*r1 - r2)/(2*r1^2 - 2*r1*r2 + r2^2)

大円,小円の直径が 20, 10 のとき,全円の直径は 42.3607 である。

   r1 = 10;  r2 = 5;  R = 21.1803;  x0 = 12.7082;  y0 = 16.9443;  x1 = -5

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r2) = (10, 5)
   R = r1 + sqrt(2*r1^2 - 2*r1*r2 + r2^2)
   x0 = R*r2*(2*r1 - r2)/(2*r1^2 - 2*r1*r2 + r2^2)
   y0 = sqrt(R^2 - x0^2)
   x1 = r2 - r1  # 未証明
   @printf("大円,小円の直径が %g, %g のとき,全円の直径は %g である。\n", 2r1, 2r2, 2R)
   @printf("r1 = %g;  r2 = %g;  R = %g;  x0 = %g;  y0 = %g;  x1 = %g\n", r1, r2, R, x0, y0, x1)
   plot()
   circle(0, 0, R, :blue)
   circle(x1, -r1, r1)
   circle(0, R - r2, r2, :green)
   plot!([x0, -x0, R, x0], [-y0, y0, 0, -y0], color=:magenta, lw=0.5)
   plot!([R, -R, x0, R], [0, 0, y0, 0], color=:magenta, lw=0.5)
   vline!([r2], lw=0.5)
   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(x1, -r1, "大円:r1,(x1,-r1)", :red, :center, delta=-delta/2)
       point(0, R - r2, "小円:r2,(0,R-r2)", :green, :center, delta=-delta/2)
       point(r2, 0, "r2", :green, :center, delta=-delta/2)
       point(x0, y0, "(x0,y0)  ", :magenta, :right, :bottom, delta=-delta/2)
       point(x0, -y0, "(x0,-y0)  ", :magenta, :right, :bottom, delta=-delta/2)
       point(-x0, y0, "  (-x0,y0)", :magenta, :left, :bottom, delta=-delta/2)
   end
end;

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

算額(その1098)

2024年06月26日 | Julia

算額(その1098)

六十六 岩手県花泉町金沢字大柳 金沢八幡宮 明治29年(1896)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

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

キーワード:円3個,四分円2個,正三角形

正三角形と 2 個の四分円が重なっている領域に等円 3 個を容れる。等円の直径が与えられたときに正三角形の一辺の長さを求めよ。

正三角形の一辺の長さを 2a
四分円の半径と中心座標を R, (a, 0), (-a, 0)
等円の半径と中心座標を r, (a - r, y1), (0, y2)
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy
@syms a::positive, R::positive, r::positive, y1::positive, y2::positive
eq1 = r^2 + y1^2 - (R - r)^2
eq2 = a^2 + y2^2 - (R + r)^2
eq3 = 2r - (√Sym(3)a -y2)
eq4 = dist2(0, √Sym(3)a, a, 0, a - r, y1, r)
res = solve([eq1, eq2, eq3, eq4], (a, R, y1, y2))[1];

三角形の一辺の長さは等円の半径の (sqrt(3) + sqrt(4*sqrt(2) + 4*sqrt(3) + 4*sqrt(6) + 11)) 倍である。

a = res[1] |> sympy.sqrtdenest |> simplify
a |> println

   r*(sqrt(3) + sqrt(4*sqrt(2) + 4*sqrt(3) + 4*sqrt(6) + 11))/2

R = res[2] |> sympy.sqrtdenest |> simplify
R |> println

   r*(1 + sqrt(2) + sqrt(6))

y1 = res[3] |> sympy.sqrtdenest |> simplify
y1 |> println

   r*(sqrt(3) + 2)

y2 = res[4] |> sympy.sqrtdenest |> simplify
y2 |> println

   r*(-1 + sqrt(12*sqrt(2) + 12*sqrt(3) + 12*sqrt(6) + 33))/2

等円の直径が 1 寸のとき,三角形の一辺の長さは 3.7549272907866866 寸である。

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

   r = 0.5,  a = 1.87746;  R = 2.43185;  y1 = 1.86603;  y2 = 2.25186

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r = 1/2
   a = r*(√3 + sqrt(4√2 + 4√3 + 4√6 + 11))/2
   R = r*(1 + √2 + √6)
   y1 = r*(√3 + 2)
   y2 = r*(-1 + sqrt(12√2 + 12√3 + 12√6 + 33))/2
   @printf("等円の直径が %g のとき,正三角形の一辺の長さは %g である。\n", 2r, 2a)
   @printf("r = %g,  a = %g;  R = %g;  y1 = %g;  y2 = %g\n", r, a, R, y1, y2)
   plot([a, 0, -a, a], [0, √3a, 0, 0], color=:green, lw=0.5)
   circle(0, y2, r)
   circle2(a - r, y1, r)
   circle(a, 0, R, :blue, beginangle=90, endangle=180)
   circle(-a, 0, R, :blue, beginangle=0, endangle=90)
   segment(a, 0, a, R, :blue)
   segment(-a, 0, -a, R, :blue)
   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(0, y2, "等円:r,(0,y2)", :red, :center, delta=-delta/2)
       point(a - r, y1, "等円:r,(a-r,y1)", :red, :center, delta=-delta/2)
       point(0, √3a, " √3a", :green, :center, :bottom, delta=delta/2)
       point(a, 0, " a", :green, :left, :bottom, delta=delta/2)
       point(a, R, "(a,R)", :blue, :right, :bottom, delta=delta/2)
   end
end;

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

算額(その1097)

2024年06月26日 | Julia

算額(その1097)

六十六 岩手県花泉町金沢字大柳 金沢八幡宮 明治29年(1896)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

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

キーワード:円11個(円12個),外円,正五角形,五芒星

算額(その1088)にプラスαした図形である。
https://blog.goo.ne.jp/r-de-r/e/8116c7b02599138383dcfbe11d21ff27

正五角形の対角線を引き,区画された領域の中央に円 1 個,小円 5 個,大円 5 個を容れる。小円の直径与えられたとき,大円の直径を求めよ。

正五角形が内接する円の半径と中心座標を R, (0, 0)
中央の円の半径と中心座標を r1, (0, 0)
小円の半径と中心座標を r2, (0, r1 + r2)
大円の半径と中心座標を r3, (0, r3 - R)
とし,以下のように逐次決定してゆく。

計算において,必要な角度がいくつか出てくる。その三角関数の値は無理数ではあるが,きれいな形で表現される。

include("julia-source.txt")

using SymPy
@syms R
s18 = Sym(18)
s36 = Sym(36);

1. 中央の円の半径

中央の円の半径 OB は五芒星の頂点(正五角形の頂点) A の y 座標値に等しい。
∠AOR は 18° である。
中央の円の半径は R*(√5 - 1)/4 である。

r1 = y = R*sind(s18)
r1 |> println

   R*(-1/4 + sqrt(5)/4)

2. 小円の半径

小円の半径 BD は BC * tan(∠BCD) である。
BC は OB * tan(∠BOC) である。
ここで,∠BCD = ∠BOC = 36°である。
まとめると,小円の半径は R*(7√5 - 15)/4 である。

OB = R*sind(s18)
r2 = OB*tand(s36)*tand(s36)
r2 |> simplify |> println

   R*(-15 + 7*sqrt(5))/4

3. 大円の半径

大円の半径 GF は EF * tan(∠FEG) である。
EF は OE * sin(∠EOF) である。
ここで,∠FEG = 18°,∠EOF = 36°である。
まとめると,大円の半径は R\*sqrt(14 - 6\*sqrt(5))/4 である。
なお,中央の円を含む三角形と大円を含む三角形の相似比から求めるのやり方もある。

EF = R*sind(s36)
r3 = EF*tand(s18)
r3 |> simplify |> println

   R*sqrt(14 - 6*sqrt(5))/4

@syms d
apart(r3/r2, d) |> simplify |> println

   1/2 + 3*sqrt(5)/10

1/2 + 3*sqrt(5)/10

   1.170820393249937

4. 小円の直径が既知のときの大円の直径

大円の直径は小円の直径の r1/r2 = 1/2 + 3*sqrt(5)/10 = 2√5/5 + 1 = 1.170820393249937 倍である。
小円の直径が 1 寸のとき,大円の直径は 1.170820393249937 寸である。

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   R = 1
   r1 = R*(√5 - 1)/4
   r2 = R*(7√5 - 15)/4
   r3 = R*sqrt(14 - 6√5)/4
   θ = 90:-72:-342
   x = R .* cosd.(θ)
   y = R .* sind.(θ)
   plot(x[1:6], y[1:6], seriestype=:shape, fillcolor=:aliceblue, lw=0.5)
   circle(0, 0, R)
   for i in 1:5
       segment(x[i], y[i], x[i + 1], y[i + 1], :black)
       segment(x[i], y[i], x[i + 2], y[i + 2], :black)
   end
   circlef(0, 0, r1, :red)
   circle(0, 0, r1, :black)
   rotatef(0, r1 + r2, r2, :yellow, angle=72)
   rotate(0, r1 + r2, r2, :black, angle=72)
   rotatef(0, r3 - R*cosd(36), r3, :orange, angle=72)
   rotate(0, r3 - R*cosd(36), r3, :black, angle=72)
   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(R, 0, " R", :black, :left, :bottom, delta=delta/2)
       point(0, r1, "B", :black, :center, delta=-delta/2)
       point(0, r1 + r2, " D", :black, :left, :vcenter)
       point(0, r1 + r2, "小円", :black, :center, delta=4delta)
       point(0, r3 - R*cosd(36), " G", :black, :left, :vcenter)
       point(0, r3 - R*cosd(36), "大円", :black, :center, delta=4delta)
       point(0, 0, "O", :black, :center, delta=-delta/2)
       point(0, 0, "円", :black, :center, delta=-3delta)
       point(r1*tand(36), r1, "C", :black, :left, :bottom, delta=delta/2)
       point(R*cosd(18), r1, " A", :black, :left, :vcenter)
       point(R*sind(36), -R*cosd(36), "E", :black, :left, delta=-delta/2)
       point(0, -R*cosd(36), "F", :black, :center, delta=-delta/2)
   end
end;

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

算額(その1096)

2024年06月26日 | Julia

算額(その1096)

五十八 岩手県花泉町 花泉天満宮 明治3年(1870)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円5個,二等辺三角形

二等辺三角形の頂点を周上に持つ甲円と,二等辺三角形の中に乙円,丁円,丙円を容れる。乙円と丁円の直径がそれぞれ 15 寸,10 寸のとき,丙円の直径はいかほどか。

注:山村(算額も?)の図では丙円と甲円が離れているように描かれているが,それでは解は不定である。また,「答」にあるように丙円の直径が 16 寸のときには,算額のような図にはならない。算額に似るように描いた下図は甲円,丁円の直径が 10 寸,5 寸のときのものである。

二等辺三角形の底辺の長さを 2a,高さを b
甲円の半径と中心座標を r1, (0, 2r4 + r1)
乙円の半径と中心座標を r2, (0, 2r4 + r2)
丙円の半径と中心座標を r3, (x3, r3)
丁円の半径と中心座標を r4, (0, r4)
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy

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

println(eq1, ",  # eq1")
#println(eq2, ",  # eq2")
println(eq3, ",  # eq3")
println(eq4, ",  # eq4")
println(eq5, ",  # eq5")
println(eq6, ",  # eq6")

   b - 2*r1 - 2*r4,  # eq1
   b*(a^2*b - 2*a^2*r3 - 2*a*b*x3 + 2*a*r3*x3 - b*r3^2 + b*x3^2),  # eq3
   a^2*b^2 - 2*a^2*b*r2 - 4*a^2*b*r4 + 4*a^2*r2*r4 + 4*a^2*r4^2 - b^2*r2^2,  # eq4
   -4*r3*r4 + x3^2,  # eq5
   -4*r1*r3 + 4*r1*r4 - 4*r3*r4 + 4*r4^2 + x3^2,  # eq6

eq1, eq5 をそれぞれ解いて,r1, r3 を求める。

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

   b/2 - r4

ans_r3 = solve(eq5, r3)[1]
ans_r3 |> println

   x3^2/(4*r4)

eq3, eq4, eq6 に r1, r3 を代入し整理する。

eq3 = eq3(r1 => ans_r1, r3 => ans_r3) |> simplify |> (x -> x*16r4^2/b)
eq4 = eq4(r1 => ans_r1, r3 => ans_r3)
eq6 = eq6(r1 => ans_r1, r3 => ans_r3)*2r4 |> simplify;

eq6 を解いて b を求める。

ans_b = solve(eq6, b)[1] |> simplify
ans_b |> println

   2*r4*x3^2/(-4*r4^2 + x3^2)

eq3, eq4 に b を代入し整理する。

eq3 = eq3(b => ans_b) |> simplify |> (x -> x*(4r4^2 - x3^2)) |> expand |> simplify |> (x -> x/(2r4*x3^2))
eq4 = eq4(b => ans_b) |> simplify |> numerator |> (x -> x/4r4^2);

eq3, eq4 を解いて,a, x3 を求める。

res = solve([eq3, eq4], (a, x3))[4]
res[1] |> println

   4*r2*r4^(3/2)*sqrt(r2 + r4)*(3*r2^16 + 44*r2^15*r4 + 300*r2^14*r4^2 + 1260*r2^13*r4^3 + 3640*r2^12*r4^4 + 7644*r2^11*r4^5 + 12012*r2^10*r4^6 + 14300*r2^9*r4^7 + 12870*r2^8*r4^8 + 8580*r2^7*r4^9 + 4004*r2^6*r4^10 + 1092*r2^5*r4^11 - 140*r2^3*r4^13 - 60*r2^2*r4^14 - 12*r2*r4^15 - r4^16)/(3*r2^18 + 44*r2^17*r4 + 297*r2^16*r4^2 + 1216*r2^15*r4^3 + 3340*r2^14*r4^4 + 6384*r2^13*r4^5 + 8372*r2^12*r4^6 + 6656*r2^11*r4^7 + 858*r2^10*r4^8 - 5720*r2^9*r4^9 - 8866*r2^8*r4^10 - 7488*r2^7*r4^11 - 4004*r2^6*r4^12 - 1232*r2^5*r4^13 - 60*r2^4*r4^14 + 128*r2^3*r4^15 + 59*r2^2*r4^16 + 12*r2*r4^17 + r4^18)

res[2] |> println

   4*r4^(3/2)/sqrt(r2 + r4)

a はかなり複雑な分数式であるが,分子,分母を別々に簡約化して再度分数式にすることで,簡約化できる。

num = res[1] |> numerator |> factor
den = res[1] |> denominator |> factor;

ans_a = num/den
ans_a |> println

   4*r2*r4^(3/2)/((r2 - r4)*sqrt(r2 + r4))

二等辺三角形の底辺の長さの半分 a は 4*r2*r4^(3/2)/((r2 - r4)*sqrt(r2 + r4)) により計算できる。
r2 =7.5, r4 = 5 のとき,a = 37.9473319220205 である。

ans_a(r2 => 7.5, r4 => 5).evalf() |> println

   37.9473319220205

x3 は 4*r4^(3/2)/sqrt(r2 + r4) により計算できる。
r2 =7.5, r4 = 5 のとき,x3 = 12.6491106406735 である。

res[2](r2 => 7.5, r4 => 5).evalf() |> println

   12.6491106406735

a, x3 が求まった後,b, r1, r3 は逆にたどって以下のようにして求める。

r2 = 7.5
r4 = 5
a = 4*r2*r4^(3/2)/((r2 - r4)*sqrt(r2 + r4))
x3 = 4*r4^(3/2)/sqrt(r2 + r4)
b = 2*r4*x3^2/(-4*r4^2 + x3^2)
r1 = b/2 - r4
r3 = x3^2/(4*r4)
(a, b, r1, r3, x3) |> println

   (37.94733192202055, 26.666666666666657, 8.333333333333329, 8.000000000000002, 12.649110640673518)

乙円,丁円の直径が 15 寸,10 寸のとき,丙円の直径は 16 寸である。 
以下のような図になる。

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r2, r4) = (15, 10)./2
   r2 = 10
   r4 = 5
   a = 4*r2*r4^(3/2)/((r2 - r4)*sqrt(r2 + r4))
   x3 = 4*r4^(3/2)/sqrt(r2 + r4)
   b = 2*r4*x3^2/(-4*r4^2 + x3^2)
   r1 = b/2 - r4
   r3 = x3^2/(4*r4)
   @printf("乙円,丁円の直径が %g, %g のとき,丙円の直径は %g である。\n", 2r2, 2r4, 2r3)
   plot([a, 0, -a, a], [0, b, 0, 0], color=:blue, lw=0.5)
   circle(0, 2r4 + r1, r1)
   circle(0, 2r4 + r2, r2, :orange)
   circle2(x3, r3, r3, :green)
   circle(0, r4, r4, :magenta)
   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(0, 2r4 + r1, "甲円:r1,(0,2r4+r1)", :red, :center, delta=-delta)
       point(0, 2r4 + r2, "乙円:r2,(0,2r4+r2)", :orange, :center, delta=-delta)
       point(x3, r3, "丙円:r3\n(x3,r3)", :green, :center, delta=-delta)
       point(0, r4, "丁円:r4\n(0,r4)", :magenta, :center, delta=-delta)
       point(a, 0, "a", :blue, :left, :bottom, delta=delta/2)
       point(0, b, "b", :blue, :center, :bottom, delta=delta)
   end
end;

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

算額(その1095)

2024年06月26日 | Julia

算額(その1095)

五十七 岩手県花泉町 花泉天満宮 文政13年(1830)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.
http://www.wasan.jp/yamamura/yamamura.html
キーワード:円9個,外円,楕円2個,正方形

正方形の中に内接する大円,2 個の楕円,8 個の等円を容れる。正方形の一辺の長さが 1 寸のとき,楕円の短径はいかほどか。

正方形の一辺の長さを 2a
等円の半径と中心座標を r, (a - r, a - r), (a - r - √2r, a - r - √2r)
楕円の長半径と短半径,中心座標を 0, 0, (a, b)
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy

@syms a::positive, b::positive, r::positive, x0::positive, y0::positive
eq1 = x0^2/a^2 + y0^2/b^2 - 1
eq2 = -b^2*x0/(a^2*y0) + (a - r - √Sym(2)r - x0)/(a - r - √Sym(2)r - y0)
eq2 = eq2 |> simplify |> numerator
eq3 = 2(a - r)^2 - (a + r)^2 |> expand
eq4 = (a - r - √Sym(2)r - x0)^2 + (a - r - √Sym(2)r - y0)^2 - r^2 |> expand;

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 Float64.(v), r.f_converged
end;

function H(u)
   (b, r, x0, y0) = u
   return [
       -1 + y0^2/b^2 + x0^2/a^2,  # eq1
       a^2*y0*(-a + r + sqrt(2)*r + x0) - b^2*x0*(-a + r + sqrt(2)*r + y0),  # eq2
       a^2 - 6*a*r + r^2,  # eq3
       2*a^2 - 4*sqrt(2)*a*r - 4*a*r - 2*a*x0 - 2*a*y0 + 5*r^2 + 4*sqrt(2)*r^2 + 2*r*x0 + 2*sqrt(2)*r*x0 + 2*r*y0 + 2*sqrt(2)*r*y0 + x0^2 + y0^2,  # eq4
   ]
end;

a = 1/2
iniv = BigFloat[0.25, 0.086, 0.267, 0.211]
res = nls(H, ini=iniv)

   ([0.24968850668279452, 0.08578643762690495, 0.2670793193663204, 0.2110827336905282], true)

正方形の一辺の長さが 1 寸のとき,楕円の短径は 0.49937701336558904 寸である。

「答」では 二分七厘五毛になっているが?

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   a = 1/2
   (b, r, x0, y0) = res[1]
   @printf("正方形の一辺の長さが %g のとき,楕円の短径は %g である。\n", 2a, 2b)
   plot([a, a, -a, -a, a], [-a, a, a, -a, -a], color=:blue, lw=0.5)
   circle(0, 0, a, :magenta)
   circle4(a - r, a - r, r)
   circle4(a - r - √2r, a - r - √2r, r)
   ellipse(0, 0, a, b, color=:green)
   ellipse(0, 0, b, a, color=:green)
   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(x0, y0, "(x0,y0)", :green, :left, :bottom, delta=delta, deltax=-2delta)
       point(a - r, a - r, "等円:r\n(a-r,a-r)", :red, :center, :bottom, delta=delta/2)
       point(a - r - √2r, a - r - √2r, "等円:r\n(a-r-√2r,a-r2-√r)", :red, :center, :bottom, delta=delta/2)
       point(a - r - √2r, a - r - √2r)
       point(0, b, "b", :green, :center, :bottom, delta=delta/2)
       point(0, a, "a", :green, :center, :bottom, delta=delta/2)
       point(a, 0, " a", :green, :left, :bottom, delta=delta/2)
   end
end;

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

算額(その1094)

2024年06月25日 | Julia

算額(その1094)

五十三 岩手県一関市 舞草観音堂  天保14年(1843)より後(?)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円4個,正三角形,正方形

全円に内接する正三角形と水平な弦を引き,分割された領域に等円 3 個,楕円 1 個を容れる。等円の直径が 与えられたときに楕円の長径を求めよ。

全円の半径と中心座標を R, (0, 0)
等円の半径と中心座標を r, (x, 2b - R/2 - r), (0, 2b - R/2 + r)
楕円の長半径,短半径と中心座標を a, b, (0, b - R/2); b = r
最終的な図を描くのには不要であるが,楕円と正三角形の接点の座標を (x0, y0)
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy

@syms R::positive, r::positive, x::positive, y::positive,
     a::positive, b::positive, x0::positive, y0::positive
y = 2b - R/2 - r
eq1 = x0^2/a^2 + (y0 - b + R/2)^2/b^2 - 1
eq2 = -b^2*x0/(a^2*(y0 - b + R/2)) + √Sym(3)
eq3 = (y0 - b + R/2)/x0 - 1/√Sym(3) # 0.3083756345177664
eq3 = (y0 + R/2)/(√Sym(3)R/2 - x0) -√Sym(3)
eq4 = dist2(0, R, √Sym(3)R/2, -R/2, x, y, r)
eq5 = dist2(0, R, √Sym(3)R/2, -R/2, 0, r + 2b - R/2, r)
eq6 = x^2 + y^2 - (R - r)^2
eq7 = 2r - (3R/2 - 2b - r)
res = solve([eq1, eq2, eq3, eq4, eq5, eq6], (R, x, a, b, x0, y0))[1]

    (9*r/2, 2*sqrt(3)*r, 3*sqrt(3)*r/2, 15*r/8, 18*sqrt(3)*r/13, 9*r/26)

楕円の長半径 a は,等円の半径 r の 3√3/2 倍である。
等円の直径が 1 寸の解き,楕円の長径は 3√3/2 = 2.598076211353316 寸である。

山村は根拠なく「側円長径=等円径×3」と提案しているが,もちろん誤りである。

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

   r = 0.5;  R = 2.25;  x = 1.73205;  y = 0.25;  a = 1.29904;  b = 0.9375;  x0 = 1.19911;  y0 = 0.173077

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r = 1/2
   (R, x, a, b, x0, y0) = (9*r/2, 2*sqrt(3)*r, 3*sqrt(3)*r/2, 15*r/8, 18*sqrt(3)*r/13, 9*r/26)
   y = 2b - R/2 - r
   l = √3R/2
   @printf("等円の直径が %g のとき,楕円の長径は %g である。\n", 2r, 2a)
   @printf("r = %g;  R = %g;  x = %g;  y = %g;  a = %g;  b = %g;  x0 = %g;  y0 = %g\n", r, R, x, y, a, b, x0, y0)
   plot([l, 0, -l, l], [ -R/2, R, -R/2, -R/2], color=:blue, lw=0.5)
   circle(0, 0, R, :magenta)
   circle2(x, y, r)
   circle(0, 2b - R/2 + r, r)
   ellipse(0, b - R/2, a, b, color=:green)
   segment(-sqrt(R^2 - (2b - R/2)^2), 2b - R/2, sqrt(R^2 - (2b - R/2)^2), 2b - R/2)
   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(0, -R/2, "-R/2", :green, :center, delta=-delta/2)
       point(0, 2b - R/2, "2b-R/2", :green, :center, delta=-delta/2)
       point(0, 2b - R/2 + r, "等円:r\n(0,2b-R/2+r)", :red, :center, delta=-delta/2)
       point(x, 2b - R/2 - r, "等円:r\n(0,2b-R/2-r)", :red, :center, delta=-delta/2)
       point(0, b - R/2, "楕円:a,b,(0,b-R/2)", :green, :center, delta=-delta/2)
       point(R, 0, " R", :magenta, :left, :bottom, delta=delta/2)
   end
end;

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

算額(その1093)

2024年06月25日 | Julia

算額(その1093)

五十二 岩手県一関市 舞草観音堂 正慶山聖観世音堂 天保14年(1843)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.
http://www.wasan.jp/yamamura/yamamura.html

キーワード:円4個,正三角形,正方形

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

正方形の一辺の長さを a
正方形の辺上にある正三角形の頂点座標を (b, 0), (a, a - b)
大円の半径と中心座標を r1, (r1, r1), (a - r1, r1), (a - r1, a - r1)
小円の半径と中心座標を r2, (r2, a - r2)
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy

@syms a::positive, b::positive, r1::positive, r2::positive
eq1 = √Sym(2)r1 + r1 + (a - b)√Sym(6)/2 + r2 + √Sym(2)r2 - √Sym(2)a
eq2 = 2(a - b) - (a - b)√Sym(2) - 2r1
eq3 = dist2(r2*(1 + √Sym(2))/√Sym(2), a - r2*(1 + √Sym(2))/√Sym(2), b, 0, r1, r1, r1);

まず,eq1, eq2 を解き a, b を求める。

res = solve([eq1, eq2], (a, b));

eq3 の a, b に,上で求めた a, b を代入する。方程式は分数式になるので,分子のみを使用する(分子 = 0 を解く)。

eq13 = eq3(a => res[a], b => res[b]) |> simplify |> numerator;

eq13 を r1 について解く(既知として与えられる r2 が含まれる式になる)。

ans_r1 = solve(eq13, r1)[1]
ans_r1 |> println

   r2*(-6081993113*sqrt(3) - 7322183923*sqrt(2) - 2*sqrt(-30721933218127447098*sqrt(3) - 37624610574115488280*sqrt(2) + 21722579043120417140*sqrt(6) + 53211949240534761996) + 4227464859*sqrt(6) + 10534321083)/(2*(-29290843252*sqrt(3) - 35584075994*sqrt(2) + 20544475854*sqrt(6) + 50733228709))

r2 にかかる係数は長精度実数演算が必要であるが,実数値 1.62035849881469 である。
上記のように r2* の形だと簡約化できないが係数部分だけを対象にすると簡約化できる。
この係数は「術」で述べられているものと同じである。

@syms d
z = ans_r1/r2
z = apart(z, d) |> factor
z |> println

   -(-9 - 5*sqrt(3) + 5*sqrt(2) + 3*sqrt(6))/2

a, b を求めるための r2 にかかる係数は以下のように求めることができる。

res[a](r1 => r2*z, r2 => 1).evalf() |> println

   9.26430077012849

res[b](r1 => r2*z, r2 => 1).evalf() |> println

   3.73205080756888

r2 が与えられると,r1, a, b は r2 の低数倍として以下のように計算できる。

(r1, a, b) = r2 .* [1.62035849881469, 9.26430077012849, 3.73205080756888];

小円の直径が 1 のとき,大円の直径は 1.62035849881469 である。

上述のように,「術」に述べられている式は,正しいものである。しかし,山村の解説では,最終的に「大径 = 小径×6.463284」となっているが,途中の式で「方斜率」を掛け忘れている。正しくは以下のように小径にかかる係数は 1.6203584988146877 である。

小径 = 1
方斜率 = √2
天 = √3
(天*5 + 9 - (天*3 + 5)*方斜率) * 小径 / 2

   1.6203584988146877

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r2 = 1/2
   (r1, a, b) = r2 .* [1.62035849881469, 9.26430077012849, 3.73205080756888]
   @printf("小円の直径が %g のとき,大円の直径は %g である。\n", 2r2, 2r1)
   @printf("r2 = %g;  r1 = %g;  a = %g;  b = %g\n", r2, r1, a, b)
   plot([0, a, a, 0, 0], [0, 0, a, a, 0], color=:blue, lw=0.5)
   plot!([r2*(1 + √2)/√2, b, a, r2*(1 + √2)/√2], [a - r2*(1 + √2)/√2, 0, a - b, a - r2*(1 + √2)/√2], color=:green, lw=0.5)
   circle(r1, r1, r1)
   circle(a - r1, r1, r1)
   circle(a - r1, a - r1, r1)
   circle(r2, a - r2, r2)
   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(r1, r1, "大円:(r1,r1)", :red, :center, delta=-delta/2)
       point(a - r1, r1, "大円:(a-r1,r1)", :red, :center, delta=-delta/2)
       point(a - r1, a - r1, "大円:(a-r1,a-r1)", :red, :center, delta=-delta/2)
       point(r2, a - r2, "小円:(r2,a-r2)", :magenta, :center, delta=-delta/2)
       point(b, 0, "b ", :green, :right, :bottom, delta=delta/2)
       point(a, a - b, "(a,a-b)  ", :green, :right, :vcenter, delta=-delta)

   end
end;

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

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

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