裏 RjpWiki

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

ホールケーキを三等分する

2023年11月15日 | Julia

ホールケーキを三等分する

ホールケーキを等分に切り分けるとき,普通は扇形に切り分ける。
今回は,ケーキを二本の平行な直線で分割して,3分割されたケーキの体積がが等しくなるようにする方法を求める。
ケーキの大きさには無関係なので,単位円を二本の平行な直線で分割して,面積を等しくするように考える。

1. 結論

結論から言えば,円の中心から上下(または左右)へ,約 0.265 離れた平行線を引く。

include("julia-source.txt")

using Plots

function draw()
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   plt = plot()
   θ = 0.26813348747179905/pi*180
   x, y = cosd(θ), sind(θ)
   @printf("(x, y) = (%g, %g)\n", x, y)
   circle(0, 0, 1, :red)
   segment(-x, y, x, y, :blue)
   segment(-x, -y, x, -y, :blue)
   point(x, y, " (x, y)")
   hline!([0], color=:gray, lw=0.5)
   vline!([0], color=:gray, lw=0.5)
end

   (x, y) = (0.964267, 0.264932)

2. 連立方程式を解く

平行線と円の交点座標を (x, y) として,以下の連立方程式を解く。

x^2 +  y^2 = 1
x*y/2 + atand(y/x)/360*pi = pi/12

SymPy で数式解を求めるには

@syms x, y
eq1 = x^2 +  y^2 - 1
eq2 = x*y/2 + atand(y/x)/360*PI - PI/12
solve([eq1, eq2], (x, y))

とすればよいが,以下のエラーが発生する。
NotImplementedError('could not solve -180*y*sqrt(-(y - 1)*(y + 1)) - pi*atan(pi*y/(180*sqrt(-(y - 1)*(y + 1)))) - 30*pi')

そこで,NLsolve により数値解を求める。

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)
   (x, y) = u
   return [
       x^2 +  y^2 - 1
       x*y/2 + atand(y/x)/360*pi - pi/12
   ]
end;

iniv = BigFloat[0.95, 0.25]
res = nls(H, ini=iniv)
println("(x, y) = ($(Float64(res[1][1])), $(Float64(res[1][2])))")

   (x, y) = (0.9642670742838972, 0.26493208460277684)

(x, y) = (0.9642670742838972, 0.26493208460277684) となる。

3. シミュレーションで検証

この解が適切かどうか,シミュレーションにより検証する。

第 1 象限の一辺の長さ 1 の正方形内に一様乱数点 (x, y) を n 組発生させ,(x, y) が四分円内にあり,かつ,y > y0 の点の割合が pi/3 になることを確認する。

(x0, y0) = (0.9642670742838972, 0.26493208460277684)
n = 100000000
x = rand(n)
y = rand(n)
res = x.^2 .+ y.^2 .< 1 .&& y .> y0
println(2*sum(res)/n, ",  ", pi/3)

   1.04723984,  1.0471975511965976

4. 定積分で検証

上部の面積を定積分により求める。

using SymPy
@syms x, y
println(integrate(sqrt(1 - x^2) - y0, (x, -x0, x0)))

   1.04719755119660

中央部の面積を定積分により求める。

println(4(x0*y0 + integrate(sqrt(1 - x^2), (x, x0, 1))).evalf())

   1.04719755119660

 

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

算額(その495)

2023年11月12日 | Julia

算額(その495)

新潟県小千谷市 小千谷二荒神社 天保4年(1833)
涌田和芳,外川一仁:小千谷二荒神社の紛失算額,長岡工業高等専門学校研究紀要,第 51 巻,p.35-40,2015
https://kinpoku.nagaoka-ct.ac.jp/lib/kiyo/vol_51/51_35wakuta.pdf

2 個の等円が交わってできる領域に,甲円,乙円,丙円,丁円が入っている。甲円,乙円,丙円の直径がそれぞれ 18.2 寸,27.3 寸,9.1 寸のとき,丁円の直径はいかほどか。

等円の半径と中心座標を r0, (0, a), (0, -a)
甲円の半径と中心座標を r1, (x1, 0)
乙円の半径と中心座標を r2, (x2, 0)
丙円の半径と中心座標を r3, (x3, 0)
丁円の半径と中心座標を r4, (x4, 0)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms r0::positive,
     r1::positive, x1::positive,
     r2::positive, x2::negative,
     r3::positive, x3::negative,
     r4::positive, x4::negative;
@syms a, r0, r1, r2, r3, r4, x1, x2, x3, x4
x2 = x1 - r1 - r2
x3 = x2 - r2 - r3
x4 = x3 - r3 - r4
eq1 = x1^2 + a^2 - (r0 - r1)^2
eq2 = x2^2 + a^2 - (r0 - r2)^2
eq3 = x3^2 + a^2 - (r0 - r3)^2
eq4 = x4^2 + a^2 - (r0 - r4)^2
res = solve([eq1, eq2, eq3, eq4], (a, r0, x1, r4))

   2-element Vector{NTuple{4, Sym}}:
    (-2*r2*sqrt(r1*r3*(r1 + r2)*(r2 + r3))/(r1*r3 - r2^2), -r2*(r1 + r2)*(r2 + r3)/(r1*r3 - r2^2), (r1^2*r3 + r1*r2*r3 - r2^3 - r2^2*r3)/(r1*r3 - r2^2), r1*r3^2/(r1*r2 - r1*r3 + r2^2))
    (2*r2*sqrt(r1*r3*(r1 + r2)*(r2 + r3))/(r1*r3 - r2^2), -r2*(r1 + r2)*(r2 + r3)/(r1*r3 - r2^2), (r1^2*r3 + r1*r2*r3 - r2^3 - r2^2*r3)/(r1*r3 - r2^2), r1*r3^2/(r1*r2 - r1*r3 + r2^2))

最初のものが適解である。
丁円の半径は r1*r3^2/(r1*r2 - r1*r3 + r2^2) であり,甲円,乙円,丙円の直径がそれぞれ 18.2 寸,27.3 寸,9.1 寸のとき,丁円の直径は 1.4 寸である。

(r1, r2, r3) = (182//20, 273//20, 91//20)
float(2*r1*r3^2//(r1*r2 - r1*r3 + r2^2))

   1.4

   丁円の直径 = 1.4;  r0 = 39;  x1 = 16.9;  r4 = 0.7

using Plots

function draw(r1, r2, r3, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (a, r0, x1, r4) = (-2*r2*sqrt(r1*r3*(r1 + r2)*(r2 + r3))/(r1*r3 - r2^2), -r2*(r1 + r2)*(r2 + r3)/(r1*r3 - r2^2), (r1^2*r3 + r1*r2*r3 - r2^3 - r2^2*r3)/(r1*r3 - r2^2), r1*r3^2/(r1*r2 - r1*r3 + r2^2))
   x2 = x1 - r1 - r2
   x3 = x2 - r2 - r3
   x4 = x3 - r3 - r4
   @printf("丁円の直径 = %g;  r0 = %g;  x1 = %g;  r4 = %g\n", 2r4, r0, x1, r4)
   x = sqrt(r0^2 - a^2)
   θ = atand(a/x)
   plot()
   circle(0, a, r0, :red, beginangle=180+θ, endangle=360-θ)
   circle(0, -a, r0, :red, beginangle=θ, endangle=180-θ)
   circle(x1, 0, r1, :green)
   circle(x2, 0, r2, :orange)
   circle(x3, 0, r3, :magenta)
   circle(x4, 0, r4, :blue)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(x1, 0, "甲円:r1\nx1", :green, :center, :bottom, delta=delta)
       point(x2, 0, "乙円:r2\nx2", :orange, :center, :bottom, delta=delta)
       point(x3, 0, "丙円:r3\nx3", :magenta, :center, :bottom, delta=delta)
       point(x4, 0, "  丁円:r4\nx4", :blue, :center, :top, delta=-5delta)
       point(0, a, " a", :red, :left, :vcenter)
       point(0, r0 - a, " r0-a", :red, :left, :bottom, delta=delta)
   else
       plot!(showaxis=false)
   end
end;

 

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

算額(その494)

2023年11月11日 | Julia

算額(その494)

北越長岡蔵王権現社(金峰神社) 寛政7年(1795)
涌田和芳,山田章,島津大,若山想思,市野梨保子,矢野敦大,山崎瑠聖: 長岡金峰神社の紛失算額,長岡工業高等専門学校研究紀要,第 55 巻,p.39-44,2019
https://kinpoku.nagaoka-ct.ac.jp/lib/kiyo/vol_55/55_39wakuta.pdf

長径,短径が a, b の楕円内に半径 r の円が 3 個入っている。左右の円は楕円と 2 点で接し中央の円と外接している。中央の円は楕円に内接している。

長径,短径が与えられたとき,円の半径を求めよ。



注: 和算では楕円の長径,短径は今でいう長径,短径の 2 倍である。同じく,円の径も直径を意味する。
ここでは他の記事と同じで,長径,短径は今の意味,円も半径で扱う。

eq2 は,山本賀前著『算法助術』の84番目の公式である。
山本賀前: 算法助術,天保12年(1841),東北大学DB.
インターネットでのダウンロード・閲覧は
中村信弥編著:和算の図形公式-『算法助術』-,2008.
http://www.wasan.jp/kosiki/kosiki3.pdf

include("julia-source.txt");

using SymPy

@syms a::positive, b::positive, r::positive, x::positive;

eq1 = x^2 + (b - r)^2 - 4r^2
eq2 = (b^2 - r^2)*(a^2 - b^2)/b^2 - x^2
res = solve([eq1, eq2], (r, x))

   1-element Vector{Tuple{Sym, Sym}}:
    ((-2*a^2*b^2 + 2*b^4 + 4*b^2*(a - b)*(a + b)*(a^2 + b^2)/(a^2 + 2*b^2))/(2*b*(a - b)*(a + b)), 2*b*sqrt(a - b)*sqrt(a + b)*sqrt(a^2 + b^2)/(a^2 + 2*b^2))

円の半径は以下のように簡約化される。これは,術で述べられている式と同じである。

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

   a^2*b/(a^2 + 2*b^2)

右側の円の中心座標(x座標)も以下のように簡約化される。

res[1][2] |> simplify |> println

   2*b*sqrt(a^4 - b^4)/(a^2 + 2*b^2)

長径と短径が 18, 4.5 のとき,円の半径は 4 である。

(a, b) = (36, 9) .// 2
a^2*b/(a^2 + 2*b^2) |> println

   4//1

   r = 4;  x = 7.98436;  a = 18;  b = 4.5

算額の図は,長径が短径の 2 倍程度なので上の図のような感じであるが,長径と短径が 18, 4.5 のときは,かなり横長なものになる。

using Plots

function draw(a, b, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r, x) = (a^2*b/(a^2 + 2b^2), 2b*sqrt(a^4 - b^4)/(a^2 + 2b^2))
   @printf("r = %g;  x = %g;  a = %g;  b = %g\n", r, x, a, b)
   plot()
   circle(0, b - r, r, :red)
   circle(x, 0, r, :red)
   circle(-x, 0, r, :red)
   ellipse(0, 0, a, b, color=:green)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(x, 0, "x", :red, :center, :bottom, delta=delta)
       point(a, 0, " a", :green, :left, :bottom, delta=delta)
       point(0, b - r, " b-r", :red, :left, :vcenter)
       point(0, b, " b", :green, :left, :bottom, delta=delta)
   else
       plot!(showaxis=false)
   end
end;

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

アルベロス

2023年11月11日 | Julia

永井信一:「アルベロスに関連した問題」
http://www2.ttcn.ne.jp/~nagai/waseda/wasan/arbe.pdf

図のように,半円内に 2  つの半円と円が入っている。
外半円,大半円,小半円の半径 r0, r1, r2 がそれぞれ 5, 3, 2 であるとき,円の半径 r を求めよ。

円の中心座標を x, y とし,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms r0::positive, r1::positive, r2::positive, r::positive,
     x::positive, y::positive;

eq1 = (x + r0 - r1)^2 + y^2 - (r1 + r)^2
eq2 = (r0 - r2 - x)^2 + y^2 - (r2 + r)^2
eq3 = x^2 + y^2 - (r0 - r)^2
res = solve([eq1, eq2, eq3], (r, x, y))

   2-element Vector{Tuple{Sym, Sym, Sym}}:
    (r0*(r0 - r1)*(r0 - r2)/(r0^2 - r1*r2), r0^2*(r1 - r2)/(r0^2 - r1*r2), -2*r0*sqrt(r1)*sqrt(r2)*sqrt((r0 - r1)*(r0 - r2))/(r0^2 - r1*r2))
    (r0*(r0 - r1)*(r0 - r2)/(r0^2 - r1*r2), r0^2*(r1 - r2)/(r0^2 - r1*r2), 2*r0*sqrt(r1)*sqrt(r2)*sqrt((r0 - r1)*(r0 - r2))/(r0^2 - r1*r2))

2番目のものが適解である。

円の半径は以下の式で求まる。

r0*(r0 - r1)*(r0 - r2)/(r0^2 - r1*r2)

外半円,大半円,小半円の半径 r0, r1, r2 がそれぞれ 5, 3, 2 であるとき,円の半径は 30/19 である。

res[2][1](r0 => 5, r1 => 3, r2 => 2) |> println

   30/19

using Plots

function draw(r1, r2, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r0 = r1 + r2
   (r, x, y) = (r0*(r0 - r1)*(r0 - r2)/(r0^2 - r1*r2), r0^2*(r1 - r2)/(r0^2 - r1*r2), 2*r0*sqrt(r1)*sqrt(r2)*sqrt((r0 - r1)*(r0 - r2))/(r0^2 - r1*r2))
   @printf("r = %g;  x = %g;  y = %g\n", r, x, y)
   plot()
   circle(0, 0, r0, :red, beginangle=0, endangle=180)
   circle(r1 - r0, 0, r1, :blue, beginangle=0, endangle=180)
   circle(r0 - r2, 0, r2, :magenta, beginangle=0, endangle=180)
   circle(x, y, r, :orange)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(r0, 0, "r0", :red, :left, :bottom, delta=delta)
       point(r1 - r0, 0, "r1-r0", :blue, :center, :bottom, delta=delta)
       point(r0 - r2, 0, "r0-r2", :magenta, :center, :bottom, delta=delta)
       point(x, y, " r,(x,y)", :orange, :left, :vcenter)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その98)

2023年11月10日 | Julia

算額(その98)

元の「算額その(98)」の改訂版である

東京都渋谷区渋谷 金王八幡神社 安政6年(1859)4月
https://gunmawasan.web.fc2.com/files/konnou-HP.pdf

金王八幡宮③「宝物館」(渋谷散歩③)
https://wheatbaku.exblog.jp/30049403/

一部が欠けている円内に円弧を置き,甲円 1 個,乙円 3 個を入れる。甲円,乙円の直径がそれぞれ 5 寸,4 寸のとき,円弧の弦の長さはいくらか。

外円の半径と中心座標を r0, (0, 0)
甲円の半径と中心座標を r1, (0, r0 - r1)
乙円の半径と中心座標を r2, (x2, y2)
円弧の一部になる円の半径と中心座標を r3, (0, r0 - 2r1 - r3)
外円と円弧の交点座標を (x, y)

とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms r0::positive, r1::positive, r2::positive, x2::positive,
      y2::positive, r3::positive;

y = r0 - 2r1 - 2r2
x = sqrt(r0^2 - y^2)
eq1 = x2^2 + y2^2 - (r0 - r2)^2
eq2 = x2^2 + (r0 - r1 - y2)^2 - (r1 + r2)^2
eq3 = x2^2 + (y2 -(r0 - 2r1 - r3))^2 - (r2 + r3)^2
eq4 = (r0^2 - y^2) + (r3 - 2r2)^2 - r3^2
res = solve([eq1, eq2, eq3, eq4], (r0, x2, y2, r3))

   1-element Vector{NTuple{4, Sym}}:
    (r1*(r1^2 + r1*r2 - r2^2)/((r1 - r2)*(r1 + r2)), r2*sqrt(4*r1^2 + 4*r1*r2 - 4*r2^2)/r1, -(r1^4 - 3*r1^2*r2^2 - r1*r2^3 + 2*r2^4)/(r1*(r1 - r2)*(r1 + r2)), r1*r2/(r1 - r2))

x の根号の中身 r0^2 - (r0 - 2*r1 - 2*r2)^2 の x0 に
r0 = r1*(r1^2 + r1*r2 - r2^2)/((r1 - r2)*(r1 + r2))
を代入する。

r0 = r1*(r1^2 + r1*r2 - r2^2)/((r1 - r2)*(r1 + r2))
r0^2 - (r0 - 2*r1 - 2*r2)^2 |> simplify |> println

   4*r2^3/(r1 - r2)

甲円と乙円の半径がそれぞれ r1 = 5/2, r2 = 4/2 のとき,弦の長さは 2sqrt(4*r2^3/(r1 - r2)) = 16 である。

draw(5/2, 4/2, true)

   r1 = 2.5;  r2 = 2;  r0 = 8.05556;  x2 = 4.30813;  y2 = 4.25556;  r3 = 10
   x = 8;  y = -0.944444;  弦の長さ = 2x = 16

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

   4*r2^(3/2)*sqrt(1/(r1 - r2))

術で言う「弦は 2乙 / sqrt(甲/乙 - 1)」と同じである(甲=2r1, 乙=2r2)。

4r2/sqrt(2r1/2r2 - 1) |> simplify |> println

   4*r2^(3/2)/sqrt(r1 - r2)

function draw(r1, r2, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="")#, fontfamily="IPAMincho")
   (r0, x2, y2, r3) = (r1*(r1^2 + r1*r2 - r2^2)/((r1 - r2)*(r1 + r2)), r2*sqrt(4*r1^2 + 4*r1*r2 - 4*r2^2)/r1, -(r1^4 - 3*r1^2*r2^2 - r1*r2^3 + 2*r2^4)/(r1*(r1 - r2)*(r1 + r2)), r1*r2/(r1 - r2))
   @printf("r1 = %g;  r2 = %g;  r0 = %g;  x2 = %g;  y2 = %g;  r3 = %g\n", r1, r2, r0, x2, y2, r3)
   y = r0 - 2r1 - 2r2
   x = sqrt(r0^2 - y^2)
   θ = round(atand(y/x))
   yy = y - (r0 - 2r1 - r3)
   θ2 = round(atand(yy/x))
   @printf("x = %g;  y = %g;  弦の長さ = 2x = %g\n", x, y, 2x)
    plot()
    circle(0, 0, r0, :red, beginangle=θ, endangle=180 - θ)
    circle(0, r0 - r1, r1, :blue)
    circle(0, r0 - 2r1 - r2, r2, :magenta)
    circle(x2, y2, r2, :magenta)
    circle(-x2, y2, r2, :magenta)
   circle(0, r0 - 2r1 - r3, r3, :brown, beginangle=θ2, endangle=180 - θ2)
   segment(-x, y, x, y, :green)
    if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(x, y, "(x,y) ", :green, :right, :bottom, delta=delta)
       point(0, r0 - r1, " 甲円:r1\n (0,r0-r1)", :blue, :left, :bottom)
       point(x2, y2, "乙円:r2,(x2,y2)", :magenta, :center, :top, delta=-delta/2)
       point(0, r0 - 2r1 - r2, " 乙円:r2\n (0,r0-2r1-r2)", :black, :left, :vcenter)
       point(0, r0, " r0", :red, :left, :bottom, delta=delta/2)
       point(x/2, -1.3y, "円弧:r3\n(0,r0-2r1-r3)", :brown, mark=false)
    end
end;

draw(6/2, 4/2, true)

   r1 = 3;  r2 = 2;  r0 = 6.6;  x2 = 4.42217;  y2 = 1.26667;  r3 = 6
   x = 5.65685;  y = -3.4;  弦の長さ = 2x = 11.3137

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

算額(その493)

2023年11月10日 | Julia

算額(その493)

東京都渋谷区 金王神社(金王八幡宮) 元治元年(1864)
https://gunmawasan.web.fc2.com/files/konnou-HP.pdf

金王八幡宮③「宝物館」(渋谷散歩③)
https://wheatbaku.exblog.jp/30049403/

正方形の中に小さな正方形が 4 個,等円が 2 個,楕円が 1 個入っている。楕円は小さな正方形の頂点を通る。
等円の直径が 7392 寸のとき,小さな正方形の一辺の長さを求めよ。

小さな正方形の一辺の長さを x とする。
楕円の長径と短径を a, b とする。外側の正方形の一辺の長さは 2a である。
等円の半径を r とする。第一象限において,小さな正方形の頂点は (r, r) である。

include("julia-source.txt");

using SymPy

@syms a::positive, b::positive, r::positive, x::positive;

eq1 = x + r - a
eq2 = a - 2r - b
eq3 = r^2/a^2 + r^2/b^2 - 1
res = solve([eq1, eq2, eq3], (x, a, b))

   1-element Vector{Tuple{Sym, Sym, Sym}}:
    (r*sqrt(2 + sqrt(5)), r*(1 + sqrt(2 + sqrt(5))), r*(-1 + sqrt(2 + sqrt(5))))

   x = 7607;  a = 11303;  b = 3911;  r = 3696

等円の半径が 7392/2 のとき,小さな正方形の一辺の長さは 7607.000116795436 であり,答,術 とともに一致する。

(7392/2)*sqrt(2 + sqrt(5))

   7607.000116795436

using Plots

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r = 7392/2
   (x, a, b) = (r*sqrt(2 + sqrt(5)), r*(1 + sqrt(2 + sqrt(5))), r*(-1 + sqrt(2 + sqrt(5))))
   @printf("x = %g;  a = %g;  b = %g;  r = %g\n", x, a, b, r)
   plot([a, a, -a, -a,  a], [-a, a, a, -a, -a], color=:blue, lw=0.5)
   circle(0, a - r, r, :red)
   circle(0, r - a, r, :red)
   rect(r, r, a, a, :blue)
   rect(-r, r, -a, a, :blue)
   rect(r, -r, a, -a, :blue)
   rect(-r, -r, -a, -a, :blue)
   ellipse(0, 0, a, b, color=:green)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(0, a - r, " a-r", :red, :left, :vcenter)
       point(r, r, " (r,r)", :blue, :left, :bottom, delta=delta)
       point(a, 0, " a=x+r ", :green, :right, :bottom, delta=delta)
       point(0, b, " b=a-2r", :green, :left, :top, delta=-delta)
       point(a - x, 0, " r=a-x", :black, :center, :bottom, delta=delta)
   else
       plot!(showaxis=false)
   end
end;

 

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

算額(その492)

2023年11月09日 | Julia

算額(その492)

新潟県長岡市与板町本与板 与板八幡宮 文化5年(1808)
http://www.wasan.jp/niigata/yoitahatiman3.html
涌田和芳,外川一仁: 与板八幡宮の紛失算額(3),長岡工業高等専門学校研究紀要,第49巻,2013.
https://kinpoku.nagaoka-ct.ac.jp/lib/kiyo/vol_46-50/vol_49/49_01wakuta.pdf

鈎股弦の中に,大弧,小弧,円が入っている。大弧は股と弦の隅で股に接し,鈎と弦の隅で大弧に接している。円は 2 つの弧と股に接している。鈎と股が 28.83 寸,38.44 寸のとき円の直径はいかほどか。

鈎,股の長さを 鈎,股
大弧の半径と中心座標を r1, (0, r1)
小弧の半径と中心座標を r2, (x2, 鈎/2)
円の半径と中心座標を r3, (x3, r3)
とおき,以下の連立方程式を解く。
鈎,股は後に具体的な数値を与えるので,連立方程式の解の式には鈎,股は変数名として残っている。

include("julia-source.txt");

using SymPy

@syms r1::positive, r2::positive, x2::positive, r3::positive, x3::positive,
     鈎::positive, 股::positive;
x2 = 股 + sqrt(r2^2 - (鈎//2)^2)
eq1 = x3^2 + (r1 - r3)^2 - (r1 + r3)^2
eq2 = (x2 - x3)^2 + (鈎//2 - r3)^2 - (r2 + r3)^2
eq3 = x2^2 + (r1 - 鈎//2)^2 - (r1 + r2)^2
eq4 = 股^2 + (r1 - 鈎)^2 - r1^2
res = solve([eq1, eq2, eq3, eq4], (r1, r2, r3, x3))

   2-element Vector{NTuple{4, Sym}}:
    ((股^2 + 鈎^2)/(2*鈎), 鈎*(股^2 + 鈎^2)/(2*(股 - 鈎)*(股 + 鈎)), 股^2*鈎*(鈎*sqrt((股^8*鈎^2 + 股^6*(2*鈎^2*sqrt(1/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + 1)*(股^4 - 2*股^2*鈎^2 + 鈎^4) - 2*股^4*鈎^6 - 股^2*鈎^4*(2*鈎^2*sqrt(1/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + 1)*(股^4 - 2*股^2*鈎^2 + 鈎^4) + 鈎^10)/(股^4 - 2*股^2*鈎^2 + 鈎^4)) - (股 - 鈎)*(股 + 鈎)*(股^2 + 鈎^2)*(鈎^2*sqrt(1/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + 1))^2/(2*(股^2 + 鈎^2)*(-股^4 + 股^2*鈎^2 + 鈎^4)^2), 股*(鈎*sqrt((股^8*鈎^2 + 股^6*(2*鈎^2*sqrt(1/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + 1)*(股^4 - 2*股^2*鈎^2 + 鈎^4) - 2*股^4*鈎^6 - 股^2*鈎^4*(2*鈎^2*sqrt(1/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + 1)*(股^4 - 2*股^2*鈎^2 + 鈎^4) + 鈎^10)/(股^4 - 2*股^2*鈎^2 + 鈎^4)) - (股 - 鈎)*(股 + 鈎)*(股^2 + 鈎^2)*(鈎^2*sqrt(1/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + 1))/(-股^4 + 股^2*鈎^2 + 鈎^4))
    ((股^2 + 鈎^2)/(2*鈎), 鈎*(股^2 + 鈎^2)/(2*(股 - 鈎)*(股 + 鈎)), 股^2*鈎*(鈎*sqrt((股^8*鈎^2 + 股^6*(2*鈎^2*sqrt(1/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + 1)*(股^4 - 2*股^2*鈎^2 + 鈎^4) - 2*股^4*鈎^6 - 股^2*鈎^4*(2*鈎^2*sqrt(1/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + 1)*(股^4 - 2*股^2*鈎^2 + 鈎^4) + 鈎^10)/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + (股 - 鈎)*(股 + 鈎)*(股^2 + 鈎^2)*(鈎^2*sqrt(1/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + 1))^2/(2*(股^2 + 鈎^2)*(-股^4 + 股^2*鈎^2 + 鈎^4)^2), -股*(鈎*sqrt((股^8*鈎^2 + 股^6*(2*鈎^2*sqrt(1/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + 1)*(股^4 - 2*股^2*鈎^2 + 鈎^4) - 2*股^4*鈎^6 - 股^2*鈎^4*(2*鈎^2*sqrt(1/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + 1)*(股^4 - 2*股^2*鈎^2 + 鈎^4) + 鈎^10)/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + (股 - 鈎)*(股 + 鈎)*(股^2 + 鈎^2)*(鈎^2*sqrt(1/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + 1))/(-股^4 + 股^2*鈎^2 + 鈎^4))

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

術では円の直径は「股/(鈎/sqrt(鈎^2 + 股^2) + 股/鈎)^2」と簡約化されているが,SymPy ではとても長い式のままである。

半径 = 股^2*鈎*(鈎*sqrt((股^8*鈎^2 + 股^6*(2*鈎^2*sqrt(1/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + 1)*(股^4 - 2*股^2*鈎^2 + 鈎^4) - 2*股^4*鈎^6 - 股^2*鈎^4*(2*鈎^2*sqrt(1/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + 1)*(股^4 - 2*股^2*鈎^2 + 鈎^4) + 鈎^10)/(股^4 - 2*股^2*鈎^2 + 鈎^4)) - (股 - 鈎)*(股 + 鈎)*(股^2 + 鈎^2)*(鈎^2*sqrt(1/(股^4 - 2*股^2*鈎^2 + 鈎^4)) + 1))^2/(2*(股^2 + 鈎^2)*(-股^4 + 股^2*鈎^2 + 鈎^4)^2)

鈎, 股 が 28.83, 38.44のときには,数値としては以下のようになる。

names = ("r1", "r2", "r3", "x3")
for (i, name) in enumerate(names)
   println(name, " = ", res[1][i](鈎 => 28.83, 股 => 38.44).evalf())
end

   r1 = 40.0416666666667
   r2 = 51.4821428571429
   r3 = 6.00000000000000
   x3 = 31.0000000000000

鈎, 股 が 28.83, 38.44のときには,円の直径は 12 である。

using Plots

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (鈎, 股) = (28.83, 38.44)
   (r1, r2, r3, x3) = (40.0416666666667, 51.4821428571429, 6.000000000000, 31.0000000000000)
   x2 = 股 + sqrt(r2^2 - (鈎/2)^2)
   @printf("r1 = %g;  r2 = %g;  x2 = %g;  r3 = %g;  x3 = %g\n", r1, r2, x2, r3, x3)
   @printf("円の直径は %g\n", 2r3)
   plot([0, 股, 股, 0], [0, 0, 鈎, 0], color=:blue, lw=0.5)
   circle(0, r1, r1, :red)
   circle(x2, 鈎/2, r2, :magenta)
   circle(x3, r3, r3, :green)
   plot!(xlims=(0, x2), ylims=(0, r1))
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(0, r1, " r1", :red)
       point(x2, 鈎/2, "(x2,鈎/2)", :magenta)
       point(x3, r3, "(x3,r3)", :green, :right)
       point(股, 鈎, " (股,鈎)", :blue, :left, :vcenter)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その491)

2023年11月08日 | Julia

算額(その491)

新潟県長岡市七日市 諏訪神社 嘉永2年(18499)
http://www.wasan.jp/niigata/niigatasuwa.html
みしま観光協会:和算の里みしま,2020/3
https://e-mishima.info/wp-content/uploads/2020/02/74a075f30cb806eef4a9a25c4a71608e.pdf

鈎股弦内に正方形が入っている。正方形の3つの頂点は三辺の上にある。鈎,股の長さが与えられたとき,正方形の面積が最小になるのはどのようなときか。

鈎股弦の辺の長さを鈎,股とする。
正方形の頂点の座標を下,右,上,左の順に (x1, 0), (0, y2), (x3, y3), (x1 + x3, y3 - y2) として以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms x1::positive, y2::positive, x3::positive, y3::positive,
     a, 鈎::positive, 股::positive, 弦::positive;
eq1 = x1^2 + y2^2 - a^2
eq2 = x3^2 + (y3 - y2)^2 - a^2
eq3 = -y2/x1 * (y3 - y2)/x3 + 1
eq4 = (鈎 - y3)/x3 - 鈎//股
eq5 = y3/(股 - x3) - 鈎//股
res = solve([eq1, eq2, eq3, eq5], (a, y2, x3, y3))

   4-element Vector{NTuple{4, Sym}}:
    (-sqrt(2*x1^2*股^2 - 2*x1^2*股*鈎 + x1^2*鈎^2 + 2*x1*股^2*鈎 + 股^2*鈎^2)/(股 - 鈎), 股*(x1 + 鈎)/(股 - 鈎), -股*(x1 + 鈎)/(股 - 鈎), 鈎*(x1 + 股)/(股 - 鈎))
    (sqrt(2*x1^2*股^2 - 2*x1^2*股*鈎 + x1^2*鈎^2 + 2*x1*股^2*鈎 + 股^2*鈎^2)/(股 - 鈎), 股*(x1 + 鈎)/(股 - 鈎), -股*(x1 + 鈎)/(股 - 鈎), 鈎*(x1 + 股)/(股 - 鈎))
    (-sqrt(2*x1^2*股^2 + 2*x1^2*股*鈎 + x1^2*鈎^2 - 2*x1*股^2*鈎 + 股^2*鈎^2)/(股 + 鈎), 股*(-x1 + 鈎)/(股 + 鈎), 股*(-x1 + 鈎)/(股 + 鈎), 鈎*(x1 + 股)/(股 + 鈎))
    (sqrt(2*x1^2*股^2 + 2*x1^2*股*鈎 + x1^2*鈎^2 - 2*x1*股^2*鈎 + 股^2*鈎^2)/(股 + 鈎), 股*(-x1 + 鈎)/(股 + 鈎), 股*(-x1 + 鈎)/(股 + 鈎), 鈎*(x1 + 股)/(股 + 鈎))

解は 4 組得られるが,最後のものが適解である。
a, y2, x3, y3 は x1, 鈎, 股 を含む式で表される。鈎,股は対象とする鈎股弦により決まるので,本質的に未知数なのは x1 である。
a = sqrt(2*x1^2*股^2 + 2*x1^2*股*鈎 + x1^2*鈎^2 - 2*x1*股^2*鈎 + 股^2*鈎^2)/(股 + 鈎) である。
(鈎, 股) = (3, 4) のとき,x1 を横軸,a = f(x1) を縦軸にしてグラフを描くと,x1 が 0.75 前後のときに a が最小になるのがわかる。

(鈎, 股) = (3, 4)
f = sqrt(2*x1^2*股^2 + 2*x1^2*股*鈎 + x1^2*鈎^2 - 2*x1*股^2*鈎 + 股^2*鈎^2)/(股 + 鈎)
plot(f, xlims=(0, 2), xlabel="x1", ylabel="f")

res2 = solve(diff(f, x1))[1]
res2 |> N |>  println
res2.evalf() |> println

   48//65
   0.738461538461539

x1 = 48//65 のときの a を求める。

f(x1 => 48//65) |> println
f(x1 => 48//65).evalf() |> println

   12*sqrt(65)/65
   1.48841681507050

鈎 = 3,股 = 4 のときには,x1 = 0.738462;  y2 = 1.29231;  x3 = 1.29231;  y3 = 2.03077 のとき,正方形の一辺の長さが最小値 12*sqrt(65)/65 = 1.48841681507050 になる。

using Plots

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (鈎, 股) = (3, 4)
   x1 = res2
   (a, y2, x3, y3) = (sqrt(2*x1^2*股^2 + 2*x1^2*股*鈎 + x1^2*鈎^2 - 2*x1*股^2*鈎 + 股^2*鈎^2)/(股 + 鈎), 股*(-x1 + 鈎)/(股 + 鈎), 股*(-x1 + 鈎)/(股 + 鈎), 鈎*(x1 + 股)/(股 + 鈎))
   @printf("a = %g;  x1 = %g;  y2 = %g;  x3 = %g;  y3 = %g\n", a, x1, y2, x3, y3)
   plot([0, 股, 0, 0], [0, 0, 鈎, 0], color=:red, lw=0.5)
   plot!([0, x1, x1 + x3, x3, 0], [y2, 0, y3 - y2, y3, y2], color=:blue, lw=0.5)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(x1, 0, "x1  ", :blue, :right, :bottom, delta=delta)
       point(x1 + x3, y3 - y2, " (x1+x3,y3-y2)", :blue, :left, :vcenter)
       point(x3, y3, " (x3,y3)", :blue, :left, :vcenter)
       point(0, y2, "  y2", :blue, :left, :vcenter)
       point(0, 鈎, "  鈎", :red, :left, :vcenter)
       point(股, 0, "股", :red, :center, :bottom, delta=2delta)
   else
       plot!(showaxis=false)
   end
end;

 

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

算額(その490)

2023年11月08日 | Julia

算額(その490

新潟県長岡市上岩井 根立寺 嘉永2年(1849)
http://www.wasan.jp/niigata/konryuji.html
涌田和芳,外川一仁: 三島根立寺の算額,長岡工業高等専門学校研究紀要,第53巻(2017)
https://kinpoku.nagaoka-ct.ac.jp/lib/kiyo/vol_53/53_17wakuta.pdf

正方形内に 2 本の斜線で分割された領域に大円 1 個,小円 3 個が入っている。
大円の直径が 10 寸のとき,小円の直径はいかほどか。

正方形の左下隅を原点とし,正方形の一辺の長さを a とする
大円の半径と中心座標を r1, (x1, r1)
小円の半径と中心座標を r2, (r2, a - r2), (r2, a - 3r2), (a - r2, a - r2)
とおき,以下の連立方程式の数値解を求める。

include("julia-source.txt");

using SymPy

@syms a::positive, b::positive, r1::positive,
     x1::positive, r2::positive;

eq1 = distance(0, 0, b, a, r2, a - 3r2) - r2^2
eq2 = distance(0, 0, b, a, x1, r1) - r1^2
eq3 = distance(a, 0, b, a, a - r2, a - r2) - r2^2
eq4 = distance(a, 0, b, a, x1, r1) - r1^2;
# res = solve([eq1, eq2, eq3, eq4], (b, r1, x1, r2))

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)
   (b, r1, x1, r2) = u
   return [
       -r2^2 + (-b*(a^2 - 3*a*r2 + b*r2)/(a^2 + b^2) + r2)^2 + (a - a*(a^2 - 3*a*r2 + b*r2)/(a^2 + b^2) - 3*r2)^2,  # eq1
       -r1^2 + (-a*(a*r1 + b*x1)/(a^2 + b^2) + r1)^2 + (-b*(a*r1 + b*x1)/(a^2 + b^2) + x1)^2,  # eq2
       -r2^2 + (a - r2 - (a^3 - a^2*b + a*b^2 + a*b*r2 - b^2*r2)/(2*a^2 - 2*a*b + b^2))^2 + (-a*(a^2 - b*r2)/(2*a^2 - 2*a*b + b^2) + a - r2)^2,  # eq3
       -r1^2 + (x1 - (a*(a^2 - a*r1 - a*x1 + b*r1) + x1*(2*a^2 - 2*a*b + b^2))/(2*a^2 - 2*a*b + b^2))^2 + (-a*(a^2 - a*b + a*r1 - a*x1 + b*x1)/(2*a^2 - 2*a*b + b^2) + r1)^2,  # eq4
   ]
end;
a = 1
iniv = BigFloat[0.61, 0.3, 0.57, 0.14]
res = nls(H, ini=iniv)

   (BigFloat[0.6234898018587335305250048840042398106322575229856815465655969032398117579169351, 0.3079785283699041303721851029979308598027401532891747156054051562155987534336586, 0.5549581320873711914221948710064104810672818660788279185605428752567220611398606, 0.1539892641849520651860925514989654299013683741434972076685407572160588959569412], true)

   a = 1;  b = 0.62349;  r1 = 0.307979;  x1 = 0.554958;  r2 = 0.153989

小円の直径は大円の直径の 1/2 である。
大円の直径が 10 寸のとき,小円の直径は 5 寸である。

res[1][4]/res[1][2]  # r2/r1

   0.4999999999999999999999999999999999999999944720136849757617152696086889978777665

using Plots

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   a = 1
   (b, r1, x1, r2) = res[1]
   @printf("a = %g;  b = %g;  r1 = %g;  x1 = %g;  r2 = %g\n", a, b, r1, x1, r2)
   @printf("大円の直径が 10 寸のとき,小円の直径は %g 寸である\n", 10r2/r1)
   plot([0, a, a, 0, 0], [0, 0, a, a, 0], color=:black, lw=0.5)
   circle(x1, r1, r1, :red)
   circle(r2, a - 3r2, r2, :green)
   circle(r2, a - r2, r2, :green)
   circle(a - r2, a - r2, r2, :green)
   plot!([0, b, a], [0, a, 0], color=:blue, lw=0.5)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(x1, r1, "大円:r1,(x1,r1)", :red, :center, delta=-delta)
       point(r2, a - r2, "小円:r2,(r2,a-r2)", :green, :center, delta=-delta)
       point(r2, a - 3r2, "小円:r2,(r2,a-3r2)", :green, :center, delta=-delta)
       point(a - r2, a - r2, "小円:r2,(a-r2,a-r2)", :green, :center, delta=-delta)
       point(b, a, "(b,a)", :black, :center, :bottom, delta=delta/2)
       point(a, 0, " a", :black, :left, :bottom, delta=delta/2)
       point(0, a, " a", :black, :left, :bottom, delta=delta/2)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その489)

2023年11月06日 | Julia

算額(その489)

宮城県丸森町小斎日向 鹿島神社 大正年間

徳竹亜紀子,谷垣美保: 2021年度の算額調査,仙台高等専門学校名取キャンパス 研究紀要,第 58 号, p.7-28, 2022.
https://www.sendai-nct.ac.jp/natori-library/wp/wp-content/uploads/2022/03/kiyo2022-2.pdf

算額の破損のため,図以外の情報は殆どない。
外円を 3 本の弦で 5 個の領域に区切り,各領域に 甲円 2 個,乙円 3 個が入っている。

外円の半径と中心座標を r0, (0, 0); 一般性を失わずに r0 = 1 と設定できる。
甲円の半径と中心座標を r1, (x1, y1)
中円の半径と中心座標を r2, (0, r0 - r2), (0, 3r2 - r0), (0, r2 - r0)
右上がりの斜線と外円の交点座標を (sqrt(r0^2 - b^2), b)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms b::positive, r0::positive, r1::positive, 
     x1::positive, y1::positive, r2::positive;

r0 = 1
eq1 = x1^2 + y1^2 - (r0 - r1)^2
eq2 = distance(sqrt(r0^2 -(2r2 - r0)^2), 2r2 - r0, -sqrt(r0^2 - b^2), b, x1, y1) - r1^2
eq3 = distance(-sqrt(r0^2 -(2r2 - r0)^2), 2r2 - r0, sqrt(r0^2 - b^2), b, x1, y1) - r1^2
eq4 = distance(sqrt(r0^2 -(2r2 - r0)^2), 2r2 - r0, -sqrt(r0^2 - b^2), b, 0, 3r2 - r0) - r2^2
eq5 = distance(sqrt(r0^2 -(2r2 - r0)^2), 2r2 - r0, -sqrt(r0^2 - b^2), b, 0, r0 - r2) - r2^2;

# res = solve([eq1, eq2, eq3, eq4, eq5], (b, r1, x1, y1, r2))

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)
   (b, r1, x1, y1, r2) = u
   x = sqrt(1 - b^2)
   y = sqrt(1 - r2)
   z = sqrt(r2)
   return [
       x1^2 + y1^2 - (1 - r1)^2,  # eq1
       -r1^2 + (x1 - (x1*(-2*b^2*r2 + b^2 + 2*b*z*x*y + 4*b*r2^2 - 4*b*r2 + 2*b - 4*r2^(3/2)*x*y + 2*z*x*y - 2*r2 + 1) - (b - 2*r2 + 1)*(-2*b^2*z*y + b^2*x1 + 4*b*r2^(3/2)*y + 2*b*z*y1*y - 2*b*z*y - 4*b*r2*x1 - 2*b*r2*x + 2*b*x1 + b*y1*x + b*x - 4*r2^(3/2)*y1*y + 2*z*y1*y + 4*r2^2*x1 + 4*r2^2*x - 4*r2*x1 - 2*r2*y1*x - 4*r2*x + x1 + y1*x + x)/2)/(-2*b^2*r2 + b^2 + 2*b*z*x*y + 4*b*r2^2 - 4*b*r2 + 2*b - 4*r2^(3/2)*x*y + 2*z*x*y - 2*r2 + 1))^2 + (y1 - (y1*(-2*b^2*r2 + b^2 + 2*b*z*x*y + 4*b*r2^2 - 4*b*r2 + 2*b - 4*r2^(3/2)*x*y + 2*z*x*y - 2*r2 + 1) - (x + sqrt(1 - (2*r2 - 1)^2))*(-2*b^2*z*y + b^2*x1 + 4*b*r2^(3/2)*y + 2*b*z*y1*y - 2*b*z*y - 4*b*r2*x1 - 2*b*r2*x + 2*b*x1 + b*y1*x + b*x - 4*r2^(3/2)*y1*y + 2*z*y1*y + 4*r2^2*x1 + 4*r2^2*x - 4*r2*x1 - 2*r2*y1*x - 4*r2*x + x1 + y1*x + x)/2)/(-2*b^2*r2 + b^2 + 2*b*z*x*y + 4*b*r2^2 - 4*b*r2 + 2*b - 4*r2^(3/2)*x*y + 2*z*x*y - 2*r2 + 1))^2,  # eq2
       -r1^2 + (x1 - (x1*(-2*b^2*r2 + b^2 + 2*b*z*x*y + 4*b*r2^2 - 4*b*r2 + 2*b - 4*r2^(3/2)*x*y + 2*z*x*y - 2*r2 + 1) - (b - 2*r2 + 1)*(2*b^2*z*y + b^2*x1 - 4*b*r2^(3/2)*y - 2*b*z*y1*y + 2*b*z*y - 4*b*r2*x1 + 2*b*r2*x + 2*b*x1 - b*y1*x - b*x + 4*r2^(3/2)*y1*y - 2*z*y1*y + 4*r2^2*x1 - 4*r2^2*x - 4*r2*x1 + 2*r2*y1*x + 4*r2*x + x1 - y1*x - x)/2)/(-2*b^2*r2 + b^2 + 2*b*z*x*y + 4*b*r2^2 - 4*b*r2 + 2*b - 4*r2^(3/2)*x*y + 2*z*x*y - 2*r2 + 1))^2 + (y1 - (y1*(-2*b^2*r2 + b^2 + 2*b*z*x*y + 4*b*r2^2 - 4*b*r2 + 2*b - 4*r2^(3/2)*x*y + 2*z*x*y - 2*r2 + 1) + (x + sqrt(1 - (2*r2 - 1)^2))*(2*b^2*z*y + b^2*x1 - 4*b*r2^(3/2)*y - 2*b*z*y1*y + 2*b*z*y - 4*b*r2*x1 + 2*b*r2*x + 2*b*x1 - b*y1*x - b*x + 4*r2^(3/2)*y1*y - 2*z*y1*y + 4*r2^2*x1 - 4*r2^2*x - 4*r2*x1 + 2*r2*y1*x + 4*r2*x + x1 - y1*x - x)/2)/(-2*b^2*r2 + b^2 + 2*b*z*x*y + 4*b*r2^2 - 4*b*r2 + 2*b - 4*r2^(3/2)*x*y + 2*z*x*y - 2*r2 + 1))^2,  # eq3
       -r2^2 + (b - 2*r2 + 1)^2*(2*b^2*z*y - 10*b*r2^(3/2)*y + 4*b*z*y - b*r2*x + 12*r2^(5/2)*y - 10*r2^(3/2)*y + 2*z*y + 2*r2^2*x - r2*x)^2/(4*(-2*b^2*r2 + b^2 + 2*b*z*x*y + 4*b*r2^2 - 4*b*r2 + 2*b - 4*r2^(3/2)*x*y + 2*z*x*y - 2*r2 + 1)^2) + (3*r2 - 1 - (b^3*r2 + 2*b^2*z*x*y - 18*b^2*r2^2 + 15*b^2*r2 - 2*b^2 + 44*b*r2^3 - 60*b*r2^2 + 27*b*r2 - 4*b - 8*r2^(5/2)*x*y + 8*r2^(3/2)*x*y - 2*z*x*y - 24*r2^4 + 44*r2^3 - 34*r2^2 + 13*r2 - 2)/(2*(-2*b^2*r2 + b^2 + 2*b*z*x*y + 4*b*r2^2 - 4*b*r2 + 2*b - 4*r2^(3/2)*x*y + 2*z*x*y - 2*r2 + 1)))^2,  # eq4
       -r2^2 + (-r2 + 1 - (b^3*z*y + 5*b^2*r2^(3/2)*y - 3*b^2*z*y + 3*b^2*r2*x/2 - b^2*x + 2*b*r2^(3/2)*y - 3*b*z*y + 2*b*r2^2*x - b*r2*x - b*x + 4*r2^(7/2)*y - 8*r2^(5/2)*y + r2^(3/2)*y + z*y + 6*r2^3*x - 10*r2^2*x + 7*r2*x/2)/(2*b^2*z*y + 4*b*r2^(3/2)*y - 2*b*z*y + 2*b*r2*x - b*x - 4*z*y + 4*r2^2*x - 4*r2*x - x))^2 + (3*b^3*r2/2 - b^3 - b^2*z*x*y - b^2*r2^2 + 3*b^2*r2/2 - b^2 - 2*b*r2^(3/2)*x*y + 2*b*z*x*y - 2*b*r2^3 + 2*b*r2^2 - 3*b*r2/2 + b + 8*r2^(5/2)*x*y - 10*r2^(3/2)*x*y + 3*z*x*y - 4*r2^4 + 10*r2^3 - 5*r2^2 - 3*r2/2 + 1)^2/(2*b^2*z*y + 4*b*r2^(3/2)*y - 2*b*z*y + 2*b*r2*x - b*x - 4*z*y + 4*r2^2*x - 4*r2*x - x)^2,  # eq5
   ]
end;
r0 = 1
iniv = BigFloat[0.77, 0.32, 0.55, 0.3, 0.31]
res = nls(H, ini=iniv)

   (BigFloat[0.7784615384615384615384615384615384615384615384615384615384616011678188086041049, 0.3461538461538461538461538461538461538461538461538461538461544534842427177340537, 0.576923076923076923076923076923076923076923076923076923076925033822024574673162, 0.3076923076923076923076923076923076923076923076923076923076934100784216705502225, 0.3076923076923076923076923076923076923076923076923076923076922943346533297705356], true)

   b = 0.778462;  r1 = 0.346154;  x1 = 0.576923;  y1 = 0.307692;  r2 = 0.307692

using Plots

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r0 = 1
   (b, r1, x1, y1, r2) = res[1] #[17.0, 29, 16, 16.4]
   @printf("b = %g;  r1 = %g;  x1 = %g;  y1 = %g;  r2 = %g\n",
       b, r1, x1, y1, r2)
   plot()
   circle(0, 0, r0, :blue)
   circle(x1, y1, r1, :green)
   circle(-x1, y1, r1, :green)
   circle(0, r0 - r2, r2, :red)
   circle(0, 3r2 - r0, r2, :red)
   circle(0, r2 - r0, r2, :red)
   segment(-sqrt(r0^2 - (2r2 - r0)^2), 2r2 - r0, sqrt(r0^2 - (2r2 - r0)^2), 2r2 - r0, :gray)
   segment(-sqrt(r0^2 - (2r2 - r0)^2), 2r2 - r0,  sqrt(r0^2 - b^2), b, :gray)
   segment( sqrt(r0^2 - (2r2 - r0)^2), 2r2 - r0, -sqrt(r0^2 - b^2), b, :gray)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(x1, y1, "甲円:r1,(x1,y1)", :green, :center, delta=-delta)
       point(0, r0 - r2, " 乙円:r2,(0,r0-r2)", :red, :left, :vcenter)
       point(0, 3r2 - r0, " 乙円:r2,(0,3r2-r0)", :red, :left, :vcenter)
       point(0, r2 - r0, " 乙円:r2,(0,r2-r0)", :red, :left, :vcenter)
       point(0, r0, " r0", :blue, :left, :bottom, delta=delta/2)
       point(√(r0^2 - b^2), b, "(√(r0^2-b^2),b)", :black, :center, :bottom, delta=delta)
       point(√(r0^2 - (2r2 - r0)^2), 2r2 - r0, "(√(r0^2-(2r2-r0)^2),2r2-r0) ", :black, :right, :top, delta=-delta)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その488)

2023年11月06日 | Julia

算額(その488)

宮城県丸森町小斎日向 鹿島神社 大正年間

徳竹亜紀子,谷垣美保: 2021年度の算額調査,仙台高等専門学校名取キャンパス 研究紀要,第 58 号, p.7-28, 2022.
https://www.sendai-nct.ac.jp/natori-library/wp/wp-content/uploads/2022/03/kiyo2022-2.pdf

算額の破損のため,図以外の情報は殆どない。
扇の中に正三角形と大円,中円,小円が入っている。

外円の半径と中心座標を r0, (0, 0)
大円の半径と中心座標を r1, (0, 0); r1 = r0*sin(pi/6)
中円の半径と中心座標を r2, (0, r0 - r2); r2 = r0(1 - sin(pi/6))/2
小円の半径と中心座標を r3, (x3, y3)
下部の円弧の半径と中心座標を r4, (0, -r0); r4 = r0 - r1
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms r0::positive, r1::positive, r2::positive, 
     r3::positive, x3::positive, y3::negative, r4::positive;

x = r0*cos(PI/6)
y = r0*sin(PI/6)
r1 = y
r2 = (r0 - y)/2
r4 = r0 - r1
eq1 = distance(0, -r0, x, y, x3, y3) - r3^2
eq2 = x3^2 + (y3 + r0)^2 - (r3 + r4)^2
eq3 = x3^2 + y3^2 - (r0 - r3)^2
res = solve([eq1, eq2, eq3], (r3, x3, y3))

   1-element Vector{Tuple{Sym, Sym, Sym}}:
    (r0*(1 + 3*sqrt(5))/32, r0*(5*sqrt(3) + 7*sqrt(15))/64, r0*(-53/64 + 9*sqrt(5)/64))

外円と円弧の交点座標 (x0, y0) を求める。

@syms x0::positive, y0::negative
eq1 = x0^2 + y0^2 - r0^2
eq2 = x0^2 + (r0 + y0)^2 - (r0 - y)^2
res2 = solve([eq1, eq2], (x0, y0))

   1-element Vector{Tuple{Sym, Sym}}:
    (sqrt(15)*r0/8, -7*r0/8)

using Plots

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r0 = 1
   x = r0*cos(pi/6)
   y = r0*sin(pi/6)  
   r1 = y
   r2 = (r0 - y)/2
   r4 = r0 - r1
   (r3, x3, y3) = (r0*(1 + 3*sqrt(5))/32, r0*(5*sqrt(3) + 7*sqrt(15))/64, r0*(-53/64 + 9*sqrt(5)/64))
   (x0, y0) = (sqrt(15)*r0/8, -7*r0/8)
   θ = atand((r0 + y0)/x0)
   @printf("r0 = %g;  r1 = %g;  r2 = %g;  r3 = %g;  x3 = %g;  y3 = %g;  r4 = %g\n",
       r0, r1, r2, r3, x3, y3, r4)
   plot([0, x, -x, 0], [-r0, y, y, -r0], color=:black, lw=0.5)
   circle(0, 0, r0, :blue)
   circle(0, 0, r1, :green)
   circle(0, r0 - r2, r2, :orange)
   circle(x3, y3, r3, :magenta)
   circle(-x3, y3, r3, :magenta)
   circle(0, -r0, r4, beginangle=θ, endangle=181-θ)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(x, y, "(x,y)  ", :blue, :right, :bottom, delta=delta/2)
       point(x0, y0, "(x0,y0)")
       point(r0, 0, "r0 ", :blue, :right, :bottom, delta=delta/2)
       point(0, r1, " r1", :green, :left, delta=-delta/2)
       point(0, -r1, " -r1", :green, :left, :bottom, delta=delta)
       point(0, r0 - r2, " 中円:r2,(0,r0-r2)", :black, :left, :vcenter)
       point(r1/2, r1/2, "大円:r1,(0,0)", :green, :center, delta=-2delta, mark=false)
       point(x3, y3, "小円:r3,(x3,y3)", :magenta, :center, delta=-delta/2)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その487)

2023年11月05日 | Julia

算額(その487)

宮城県丸森町小斎日向 鹿島神社 大正年間

徳竹亜紀子,谷垣美保: 2021年度の算額調査,仙台高等専門学校名取キャンパス 研究紀要,第 58 号, p.7-28, 2022.
https://www.sendai-nct.ac.jp/natori-library/wp/wp-content/uploads/2022/03/kiyo2022-2.pdf

算額の破損のため,図以外の情報は殆どない。
外円の中に弦と斜線があり,区切られた領域に甲円が 4 個,乙円が 2 個入っている。

外円の半径と中心座標を r0, (0, 0)
甲円の半径と中心座標を r1, (0, r0 - r1), (x1, a - r1), (0, r1 - r0)
乙円の半径と中心座標を r2, (x2, a + r2)
弦と y 軸の交点の y 座標を a
斜線と円の交点の y 座標を -b
とおき,以下の連立方程式を解く。

条件式が5個で,変数が b, r0, r1, x1, r2, x2 の 6 個なので,どれか一つを既知とすれば解を求めて図形を書くことができる。r0 = 1 としても一般性を損なわない(r0 が異なる図形はすべて相似)。

include("julia-source.txt");

using SymPy

@syms a::positive, b::positive, r0::positive, 
     r1::positive, x1::positive, r2::positive, x2::positive;
r0 = 1
a = r0 - 2r1
eq1 = distance(0, a, sqrt(r0^2 - b^2), -b, 0, r1 - r0) - r1^2
eq2 = distance(0, a, sqrt(r0^2 - b^2), -b, x1, a - r1) - r1^2
eq3 = x1^2 + (a - r1)^2 - (r0 - r1)^2
eq4 = x2^2 + (a + r2)^2 - (r0 - r2)^2
eq5 = x2^2 + (r0 - r1 - a - r2)^2 - (r1 + r2)^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)
   (b, r1, x1, r2, x2) = u
   return [
       -r1^2 + (1 - b^2)*(3*r1 - 2)^2*(b - 2*r1 + 1)^2/(-4*b*r1 + 2*b + 4*r1^2 - 4*r1 + 2)^2 + (r1 - ((b^2 - 1)*(3*r1 - 2)/2 + (r1 - 1)*(-2*b*r1 + b + 2*r1^2 - 2*r1 + 1))/(-2*b*r1 + b + 2*r1^2 - 2*r1 + 1) - 1)^2,  # eq1
       -r1^2 + (x1 - (-b^2*x1 + b*r1*sqrt(1 - b^2) - 2*r1^2*sqrt(1 - b^2) + r1*sqrt(1 - b^2) + x1)/(2*(-2*b*r1 + b + 2*r1^2 - 2*r1 + 1)))^2 + (-3*r1 - (sqrt(1 - b^2)*(-b*x1 + 2*r1*x1 + r1*sqrt(1 - b^2) - x1)/2 + (1 - 3*r1)*(-2*b*r1 + b + 2*r1^2 - 2*r1 + 1))/(-2*b*r1 + b + 2*r1^2 - 2*r1 + 1) + 1)^2,  # eq2
       x1^2 + (1 - 3*r1)^2 - (1 - r1)^2,  # eq3
       x2^2 - (1 - r2)^2 + (-2*r1 + r2 + 1)^2,  # eq4
       x2^2 + (r1 - r2)^2 - (r1 + r2)^2,  # eq5
   ]
end;

iniv = BigFloat[0.85, 0.38, 0.61, 0.24, 0.60]
res = nls(H, ini=iniv)

   (BigFloat[0.847036874527671344254215992490411686652141768831937314871633149986214879073071, 0.3787321874818335132405467689419389110250823757243052813412166596148529968650207, 0.6061552534203894328837729024835844965150345459568913206939271172607303312643575, 0.2352941176470588235294117647058823529411764705882352941176470588235292092020814, 0.5970375394498355116094971924511155185714872080275178420141772660186381316118884], true)

外円の半径を 1 としたときの,図を描くためのパラーメータは以下の通り。

a = 0.242536;  b = 0.847037;  r0 = 1;  r1 = 0.378732;  x1 = 0.606155;  r2 = 0.235294;  x2 = 0.597038

using Plots

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (b, r1, x1, r2, x2) = res[1] # [55.0, 20, 35, 12, 35]
   r0 = 1
   a = r0 - 2r1
   @printf("a = %g;  b = %g;  r0 = %g;  r1 = %g;  x1 = %g;  r2 = %g;  x2 = %g\n",
       a, b, r0, r1, x1, r2, x2)
   plot()
   circle(0, 0, r0, :black)
   circle(0, r0 - r1, r1, :blue)
   circle(0, r1 - r0, r1, :blue)
   circle(x1, a - r1, r1, :blue)
   circle(-x1, a - r1, r1, :blue)
   circle(x2, a + r2, r2)
   circle(-x2, a + r2, r2)
   segment(-sqrt(r0^2 - a^2), a, sqrt(r0^2 - a^2), a, :green)
   segment(0, a, sqrt(r0^2 - b^2), -b, :red)
   segment(0, a, -sqrt(r0^2 - b^2), -b, :red)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(0, a, " a")
       point(0, -b, " -b", :black, :left, :vcenter)
       point(sqrt(r0^2 - b^2), -b, "(√(r0^2-b^2),b)", :black, :left, :top)
       point(0, r1 - r0, " r1-r0", :blue, :left, :vcenter)
       point(x1, a - r1, " 甲円:r1,(x1,a-r1)", :blue, :center, :top, delta=-delta/2)
       point(x2, a + r2, "乙円:r2\n(x2,a+r2)", :red, :center, :vcenter)
       point(0, r0 - r1, " r0-r1", :blue, :left, :vcenter)
       point(0, r0, " r0", :black, :left, :bottom, delta=delta)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その486)

2023年11月05日 | Julia

算額(その486)

宮城県丸森町小斎日向 鹿島神社 大正年間

徳竹亜紀子,谷垣美保: 2021年度の算額調査,仙台高等専門学校名取キャンパス 研究紀要,第 58 号, p.7-28, 2022.
https://www.sendai-nct.ac.jp/natori-library/wp/wp-content/uploads/2022/03/kiyo2022-2.pdf

算額の破損のため,図以外の情報は殆どない。
等円 2 個,甲円 1 個,乙円と丙円がそれぞれ 4 個が図のように配置されている。

等円の半径と中心座標を r1, (r1, r1)
甲円の半径と中心座標を r2, (0, y2)
乙円の半径と中心座標を r3, (x3, r1 + r3), (x3, r1 - r3)
丙円の半径と中心座標を r4, (r4, r4), (3r4, r4)
とおき,以下の連立方程式を解く。
未知数が r1, r2, y2, r3, x3, r4 の 6 個で,条件式が 3 個しかないので,未知数のうち 3 個を既知としなければ解は求まらない。
推測であるが,等円,甲円,乙円の直径が与えられていたのであろう。図を描くために y2, x3 を求めるが,丙円の直径を求めるだけであれば,甲円,乙円の情報は不要である。
条件式はそれぞれが独立なので,eq1, eq2, eq3 を連立方程式ではなく単一の方程式として解くことができる。

include("julia-source.txt");

using SymPy

@syms r1::positive, r2::positive, y2::positive, 
     r3::positive, x3::positive, r4::positive;

eq1 = r1^2 + (y2 - r1)^2 - (r1 + r2)^2
eq2 = (r1 - x3)^2 + r3^2 - (r1 - r3)^2
eq3 = (r1 - 3r4)^2 + (r1 - r4)^2 - (r1 + r4)^2;

eq1 は等円と甲円についての方程式で,甲円の大きさは任意であり,その大きさに応じて中心座標 y2 が変わる。中心座標 y2 は以下のように求まる。2番目のものが適解である。

res1 = solve(eq1, y2)
res1 |> println

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

eq2 は等円と乙円についての方程式で,乙円の直径は等円の直径の半分以下であれば任意であり,その大きさに応じて中心座標 x3 が変わる。中心座標 x3 は以下のように求まる。最初のものが適解である。

res2 = solve(eq2, x3)
res2 |> println

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

eq3 は等円と丙円が外接するときの方程式で,等円の大きさに応じて丙円の大きさが決まる。丙円の大きさは等円の大きさの 1/9 である。

res3 = solve(eq3, r4)
res3 |> println

   Sym[r1/9, r1]

以上をまとめると,甲円と乙円は制限はあるものの任意に決めることができる。等円の大きさが決まれば丙円の大きさも決まる。

例えば,等円,甲円,乙円の半径を 90,70,30 とすれば,
y2 = 222.28756555322954
x3 = 38.03847577293368
r3 = 10.0
である。

res1[2] |> println
res2[1] |> println
res3[1] |> println

   r1 + sqrt(r2)*sqrt(2*r1 + r2)
   -sqrt(r1)*sqrt(r1 - 2*r3) + r1
   r1/9

(r1, r2, r3) = (90, 70, 30)
# y2
r1 + sqrt(r2)*sqrt(2*r1 + r2) |> println
# x3
-sqrt(r1)*sqrt(r1 - 2*r3) + r1 |> println
# r4
r1/9 |> println

   222.28756555322954
   38.03847577293368
   10.0

using Plots

function draw(r1, r2, r3, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r4, y2, x3) = (r1/9, r1 + sqrt(r2)*sqrt(2*r1 + r2), -sqrt(r1)*sqrt(r1 - 2*r3) + r1)
   @printf("r1 = %g;  r2 = %g;  r3 = %g;  r4 = %g;  y2 = %g;  x3 = %g\n", r1, r2, r3, r4, y2, x3)
   plot()
   circle(r1, r1, r1, :blue)
   circle(-r1, r1, r1, :blue)
   circle(0, y2, r2)
   circle(x3, r1 + r3, r3, :green)
   circle(-x3, r1 + r3, r3, :green)
   circle(x3, r1 - r3, r3, :green)
   circle(-x3, r1 - r3, r3, :green)
   circle(r4, r4, r4, :orange)
   circle(-r4, r4, r4, :orange)
   circle(3r4, r4, r4, :orange)
   circle(-3r4, r4, r4, :orange)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(r1, r1, " 等円:r1,(r1,r1)", :blue, :left, :vcenter)
       point(0, y2, " 甲円:r2,(0,y2)", :red, :left, :vcenter)
       point(x3, r1+r3, " 乙円:r3,(x3,r1+r3)", :green, :left, :vcenter)
       point(x3, r1-r3, " 乙円:r3,(x3,r1-r3)", :green, :left, :vcenter)
       point(3r4, r4, " 丙円:r4,(3r4,r4)", :black, :left, :vcenter)
   else
       plot!(showaxis=false)
   end
end;

 

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

算額(その485)

2023年11月04日 | Julia

算額(その485)

宮城県丸森町小斎日向 鹿島神社 明治13年

徳竹亜紀子,谷垣美保: 2021年度の算額調査,仙台高等専門学校名取キャンパス 研究紀要,第 58 号, p.7-28, 2022.
https://www.sendai-nct.ac.jp/natori-library/wp/wp-content/uploads/2022/03/kiyo2022-2.pdf

楕円の中に大円,中円,小円が入っている。楕円の短径(短軸の半分;図参照)が与えられたとき,小円の直径を求めよ。

大円の半径と中心座標を r1, (x1, 0), (-x1, 0)
中円の半径と中心座標を r2, (0, r2), (x2, r2)
小円の半径と中心座標を r3, (x3, y3)
楕円の長径と短径を a, b
楕円と右上の中円の接点を (x, y)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms a::positive, b::positive, 
     x::positive, y::positive,
     r1::positive, x1::positive,
     r2::positive, x2::positive,
     r3::positive, x3::positive, y3::positive;

b = 55
x3 = x1
x2 = 2x1
eq1 = (x3 - x1)^2 + y3^2 - (r1 - r3)^2
eq2 = x1^2 + r2^2 - (r1 - r2)^2
eq3 = (x3 + x1)^2 + y3^2 - (r1 + r3)^2
eq4 = (x1 + x2)^2 + r2^2 - (r1 + r2)^2
eq5 = (x2 - x3)^2 + (y3 - r2)^2 - (r2 + r3)^2
eq6 = (x - x1)^2 + y^2 - r1^2
eq7 = (x - x2)^2 + (y - r2)^2 - r2^2
eq8 = x^2/a^2 + y^2/b^2 - 1;
#res = solve([eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8], (a, r1, x1, r2, r3, y3, x, y))

   y3^2 - (r1 - r3)^2,  # eq1
   r2^2 + x1^2 - (r1 - r2)^2,  # eq2
   4*x1^2 + y3^2 - (r1 + r3)^2,  # eq3
   r2^2 + 9*x1^2 - (r1 + r2)^2,  # eq4
   x1^2 + (-r2 + y3)^2 - (r2 + r3)^2,  # eq5
   -r1^2 + y^2 + (x - x1)^2,  # eq6
   -r2^2 + (-r2 + y)^2 + (x - 2*x1)^2,  # eq7
   y^2/3025 - 1 + x^2/a^2,  # eq8

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, r1, x1, r2, r3, y3, x, y) = u
   return [
       y3^2 - (r1 - r3)^2,  # eq1
       r2^2 + x1^2 - (r1 - r2)^2,  # eq2
       4*x1^2 + y3^2 - (r1 + r3)^2,  # eq3
       r2^2 + 9*x1^2 - (r1 + r2)^2,  # eq4
       x1^2 + (-r2 + y3)^2 - (r2 + r3)^2,  # eq5
       -r1^2 + y^2 + (x - x1)^2,  # eq6
       -r2^2 + (-r2 + y)^2 + (x - 2*x1)^2,  # eq7
       y^2/3025 - 1 + x^2/a^2,  # eq8
   ]
end;

b = 55
iniv = [big"73.0", 49, 22, 19.5, 10, 39, 56, 35]
res = nls(H, ini=iniv)

   (BigFloat[70.61439286442122986759326634852342606346806573057936088754412457172871369525662, 48.1044778079481411118448683589097310128322176790819406320263186975907510564275, 21.51297648015799054903759651066595576338165507866319055547355868260632047583453, 19.24179112325079279837972287417723421441707964112536578143846733491061211029649, 9.62089556158975492218928774413918955995629190756242766925925034366901321701604, 38.48358224635801843450000033108172430091547897712345222108392054779560714508957, 57.36779066297351601295569753085714297026688222855118678814873700650448108748758, 32.06981579433871183683575416702468448547226311180548288477472348488073672944933], false)

短径が 55 のとき,
a = 70.6144;  r1 = 48.1045;  x1 = 21.513;  r2 = 19.2418;  r3 = 9.6209;  y3 = 38.4836;  x = 57.3678;  y = 32.0698
小円の直径 = 19.2418
となる。
しかし,この結果は初期値によって微妙に変化する。条件式のどれかが悪いか,決定的な条件式が書けているのだと思われる。

術では 短径sqrt(3)/5 となっており,短径 = 55 のときには小円の直径は 19.05255888325765 になる。

55sqrt(3)/5

   19.05255888325765

using Plots

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   b = 55
   (a, r1, x1, r2, r3, y3, x, y) = res[1]
   x3 = x1
   x2 = 2x1
   @printf("a = %g;  r1 = %g;  x1 = %g;  r2 = %g;  r3 = %g;  y3 = %g;  x = %g;  y = %g\n",
       a, r1, x1, r2, r3, y3, x, y)
   @printf("小円の直径 = %g\n", 2r3)
   plot()
   circle(x1, 0, r1, :black)
   circle(-x1, 0, r1, :black)
   circle4(x2, r2, r2)
   circle(0, r2, r2)
   circle(0, -r2, r2)
   circle4(x3, y3, r3, :blue)
   ellipse(0, 0, a, b, color=:green)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(x, y, "(x,y)", :green, :left, :bottom, delta=delta)
       point(x1, 0, "x1", :black, :center, delta=-delta)
       point(-x1, 0, "-x1", :black, :center, delta=-delta)
       point(x2, 0, "x2", :red, :center, delta=-delta)
       point(0, r2, " r2", :red, :left, :vcenter)
       point(x3, y3, " 小円:r3\n (x3,y3)", :blue, :left, :vcenter)
       point(x2, r2, "中円:r2(x2,r2)", :red, :center, delta=-delta)
       point(a, 0, " a", :green, :left, :bottom, delta=delta/2)
       point(x1 + r1, 0, "x1+r1 ", :black, :right, :top, delta=-delta/2)
       point(0, b, " b", :green, :left, :bottom, delta=delta/2)
   else
       plot!(showaxis=false)
   end
end;

 

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

算額(その484)

2023年11月02日 | Julia

算額(その484)

宮城県丸森町小斎日向 鹿島神社 明治13年

徳竹亜紀子,谷垣美保: 2021年度の算額調査,仙台高等専門学校名取キャンパス 研究紀要,第 58 号, p.7-28, 2022.
https://www.sendai-nct.ac.jp/natori-library/wp/wp-content/uploads/2022/03/kiyo2022-2.pdf

外円内に甲円,乙円,丙円が入っている。3 個の円の中心は鈎股弦(直角三角形)を作る。鈎が 3 寸,股が 4 寸のとき,外円の直径はいかほどか。

外円の半径と中心座標を r0, (0, 0); r0 = 6r2
甲円の半径と中心座標を r1, (0, r1 - r0)
乙円の半径と中心座標を r2, (r1 + r3, r1 - r0 + r2 + r3)
丙円の半径と中心座標を r3, (r1 + r3, r1 - r0)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms r0::positive, r1::positive, r2::positive,
     r3::positive, 鈎::positive, 股::positive;

eq1 = r2 + r3 - 鈎
eq2 = r1 + r3 - 股
eq3 = (r1 + r2)^2 -(鈎^2 + 股^2)
eq4 = (r1 + r3)^2 + (r1 - r0)^2 - (r0 - r3)^2
solve([eq1, eq2, eq3, eq4], (r0, r1, r2, r3))

   2-element Vector{NTuple{4, Sym}}:
    (股/2 + 鈎/2 - sqrt(股^2 + 鈎^2)/2, 股/2 - 鈎/2 - sqrt(股^2 + 鈎^2)/2, -股/2 + 鈎/2 - sqrt(股^2 + 鈎^2)/2, 股/2 + 鈎/2 + sqrt(股^2 + 鈎^2)/2)
    (股/2 + 鈎/2 + sqrt(股^2 + 鈎^2)/2, 股/2 - 鈎/2 + sqrt(股^2 + 鈎^2)/2, -股/2 + 鈎/2 + sqrt(股^2 + 鈎^2)/2, 股/2 + 鈎/2 - sqrt(股^2 + 鈎^2)/2)

2 組の解が求まるが,2 番目のものが適解である。

外円の半径は 股/2 + 鈎/2 + sqrt(股^2 + 鈎^2)/2 なので,直径は 鈎 + 股 + sqrt(鈎^2 + 股^2) である。さらに,sqrt(鈎^2 + 股^2) = 弦 なので,外円の直径は鈎,股,弦の和になる
鈎 = 3, 股 = 4 のとき,弦 = 5 なので,外円の直径は 12 である。

その他,(r1, r2, r3) = ((股 - 鈎 + 弦)/2, (-股 + 鈎 + 弦)/2, (股 + 鈎 - 弦)/2)

   r0 = 6;  r1 = 3;  r2 = 2;  r3 = 1
   鈎 = 3;  股 = 4;  弦 = 5;  外円の直径 = 12

外円の直径(鈎, 股) = 鈎 + 股 + sqrt(鈎^2 + 股^2)  # 鈎,股を与えて外円の直径を求める関数
外円の直径(3, 4) |> println
外円の直径(3, 7) |> println

   12.0
   17.61577310586391

using Plots

function draw(鈎, 股, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   弦 = sqrt(鈎^2 + 股^2)
   (r0, r1, r2, r3) = ((股 + 鈎 + 弦)/2, (股 - 鈎 + 弦)/2, (-股 + 鈎 + 弦)/2, (股 + 鈎 - 弦)/2)
   @printf("r0 = %g;  r1 = %g;  r2 = %g;  r3 = %g\n",  r0, r1, r2, r3)
   @printf("鈎 = %g;  股 = %g;  弦 = %g;  外円の直径 = %g\n", 鈎, 股, 弦, 2r0)
   plot()
   circle(0, 0, r0, :black)
   circle(0, r1 - r0, r1, :blue)
   circle(r1 + r3, r1 - r0 + r2 + r3, r2, :green)
   circle(r1 + r3, r1 - r0, r3) 
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(0, r1 - r0, "甲円:r1 \n(0,r1-r0) ", :blue, :right, :vcenter)
       point(r1 + r3, r1 - r0 + r2 + r3, "乙円:r2 \n(r1+r3,r1-r0+r2+r3) ", :green, :center, :vcenter)
       point(r1 + r3, r1 - r0, "丙円:r2 \n(r1+r3,r1-r0) ", :black, :right, :vcenter)
       point(r0, 0, " r0", :black, :left, :bottom, delta=delta/3)
   else
       plot!(showaxis=false)
   end
end;

draw(3, 4, true)

   r0 = 6;  r1 = 3;  r2 = 2;  r3 = 1
   鈎 = 3;  股 = 4;  弦 = 5;  外円の直径 = 12

draw(3, 7, true)

   r0 = 8.80789;  r1 = 5.80789;  r2 = 1.80789;  r3 = 1.19211
   鈎 = 3;  股 = 7;  弦 = 7.61577;  外円の直径 = 17.6158

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

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

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