裏 RjpWiki

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

算額(その282)

2023年06月15日 | Julia

算額(その282)

中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額(246)
長野県諏訪市中洲 諏訪大社上社 明治12年(1897)

外円の中に菱形,その中に正方形がある。それらに等円が図のように接している。等円の径が 8453 寸のとき,外円の径を求めよ。

正方形の一辺の長さを 2a,等円の半径を r,外円の半径,中心座標を R, (0, 0) とする。
上の等円の半径,中心座標は r, (0, R - r)
右の等円の半径,中心座標は r, (a + r, 0) である。

図のように記号を定め,連立方程式を解く。
等円の半径 r を未知数のまま解く。

include("julia-source.txt");

using SymPy
@syms R, r, a

r = 8453 // 2

eq1 = (R-2r) / R - a / (R - a)
eq2 = a/sqrt(a^2 + (R - a)^2) - r / (R - a - r)
res = solve([eq1, eq2], (R, a))

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

外円の半径は r + √3r + 2*sqrt(r^2) = (3 + √3) * r である。
直径が 8453 寸のとき,外円の直径は 40000.02547637972 寸である。約 40000 寸。

R = 8453 / 2; (3 + √3) * r * 2

   40000.02547637971

   R = 20000.012738;  a = 7320.512738

using Plots

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r = 8453/2
   (R, a) = (r + sqrt(3)*r + 2*sqrt(r^2), sqrt(3)*r)
   @printf("R = %.6f;  a = %.6f\n", R, a)
   # @printf("2r = %.6f\n", 2r)
   plot([R, 0, -R, 0, R], [0, R - 2r, 0, - R + 2r, 0], color=:blue, lw=0.5)
   plot!([a, a, -a, -a, a], [-a, a, a, -a, -a], color=:green, lw=0.5)
   circle(0, 0, R, :black)
   circle(0, R - r, r)
   circle(0, -R + r, r)
   circle(a + r, 0, r, :red)
   circle(-a - r, 0, r, :red)
   if more
       point(0, R - r, " R-r")
       point(0, a, " a", :green, :left, :bottom)
       point(a, 0, "a ", :green, :right, :bottom)
       point(a + r, 0, " a+r", :green, :left, :bottom)
       point(0, R, " R", :green, :left, :bottom)
       point(0, R - 2r, "   R-2r")
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

 

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

算額(その279)

2023年06月15日 | Julia

算額(その279)

中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額(239)
長野県松本市筑摩 筑摩神社 明治6年(1873)

甲円 4 個,乙円 2 個が互いに外接し,3 個の円は直線に接している。
乙円の径が 1 寸のとき,甲円の径を求めよ。

甲円の半径を r1 とする。右の甲円の中心は (√3r1, 2r1) である。
乙円の半径を r2 とする。右の乙円の中心を (x2, r2) である。
以下の連立方程式を r2 を変数のままで解く。

include("julia-source.txt");

using SymPy
@syms r1::positive, x1::positive, y1::positive, r2::positive, x2::positive;

r2 = 1//2
y1 = 2r1
x1 = sqrt(Sym(3))r1
eq1 = x2^2 + (r1 - r2)^2 - (r1 + r2)^2
eq2 = (x1 - x2)^2 + (y1 - r2)^2 - (r1 + r2)^2
res = solve([eq1, eq2], (r1, x2))

   2-element Vector{Tuple{Sym, Sym}}:
    ((2*sqrt(3)*r2/3 + 2*sqrt(6)*r2/3)^2/(4*r2), 2*sqrt(3)*r2/3 + 2*sqrt(6)*r2/3)
    ((-2*sqrt(6)*r2/3 + 2*sqrt(3)*r2/3)^2/(4*r2), -2*sqrt(6)*r2/3 + 2*sqrt(3)*r2/3)

   r1 = 0.971405;  x1 = 1.682522;  y1 = 1.942809;  x2 = 1.393847
   2r1 = 1.942809

最初の解が適解である。

甲円の半径は (2*sqrt(Sym(3))*r2/3 + 2*sqrt(Sym(6))*r2/3)^2/(4*r2) を簡約化して r2*(2*sqrt(Sym(2)) + 3)/3 である。
すなわち,「甲円の半径 = (√8/3 + 1) × 乙円の半径」である。
よって,乙円の直径が 1 寸の場合,甲円の直径は √8/3 + 1 = 1.9428090415820636 寸である

using Plots

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r2 = 1//2
   (r1, x2) = ((2*sqrt(3)*r2/3 + 2*sqrt(6)*r2/3)^2/(4*r2), 2*sqrt(3)*r2/3 + 2*sqrt(6)*r2/3)
   y1 = 2r1
   x1 = sqrt(Sym(3))r1
   @printf("r1 = %.6f;  x1 = %.6f;  y1 = %.6f;  x2 = %.6f\n", r1, x1, y1, x2)
   @printf("2r1 = %.6f\n", 2r1)
   plot()
   circle(0, r1, r1, :blue)
   circle(0, 3r1, r1, :blue)
   circle(x1, y1, r1, :blue)
   circle(-x1, y1, r1, :blue)
   circle(x2, r2, r2)
   circle(-x2, r2, r2)
   if more
       point(0, r1, " r1")
       point(0, 2r1, " 2r1")
       point(0, 3r1, " 3r1")
       point(0, 4r1, " 4r1")
       point(x1, y1, " 甲円:r1\n (x1,y1)", :blue, :center, :top)
       point(x2, r2, " 乙円:r2\n (x2,r1)", :red, :center, :top)
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その281)

2023年06月15日 | Julia

算額(その281)

中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額(240)
長野県松本市筑摩 筑摩神社 明治6年(1873)

等脚台形に対角線を引き,時計回りに 90° 回転させ上半分だけを考える。対角線で区切られた2つの区域に対角線及び辺に接する等円を入れる。元の台形の高さ a を 12 寸,等円の径 r を 4 寸とするとき,元の台形の底辺の半分 b はいかほどか。

図のように記号を定め,連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms r::positive, a::positive, b::positive, c::positive, d::positive, y1::positive, dummy;
(r, a) = (2, 12)
eq1 = distance(0, 0, a, c, r, y1) - r^2
eq2 = distance(0, 0, a, c, a - r, r) - r^2
eq3 = distance(0, b, d, 0, r, y1) - r^2
eq4 = distance(0, b, d, 0, a - r, r) - r^2;

res = solve([eq1, eq2, eq3, eq4], (b, c, d, y1))

   3-element Vector{NTuple{4, Sym}}:
    (7, 5, 28/3, 3)
    (13/4 - sqrt(65)/4, 5, 26 - 2*sqrt(65), 3)
    (sqrt(65)/4 + 13/4, 5, 2*sqrt(65) + 26, 3)

最初の組が適解である。したがって,元の台形の底辺の半分は 7 寸である。

using Plots

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (b, c, d, y1) = res[1]
   @printf("b = %.6f;  c = %.6f;  d = %.6f;  y1 = %.6f\n", b, c, d, y1)
   # @printf("2r = %.6f\n", 2r)
   plot([0, a, a, 0, 0], [0, 0, c, b, 0], color=:black, lw=0.5)
   segment(0, 0, a, c)
   segment(0, b, d, 0)
   circle(r, y1, r, :blue)
   circle(a - r, r, r, :blue)
   if more
       point(r, y1, " (r,y1)")
       point(a - r, r, " (a-r,r)")
       point(a, 0, " a", :green, :left, :bottom)
       point(0, b, " b", :green, :left, :bottom)
       point(a, c, " (a,c)")
       point(d, 0, "  d", :green, :left, :bottom)
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その280)

2023年06月15日 | Julia

算額(その280)

中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額(240)
長野県松本市筑摩 筑摩神社 明治6年(1873)

鉤股弦(直角三角形)に 2 本の斜線を入れ,区切られた領域に 2 個の等円を入れる。鉤が 5 寸のとき,等円の直径を求めよ。

図のように記号を定め,連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms a::positive, b::positive, r::positive, x1::positive, y1::positive,
   x::positive, y::positive;

eq1 = distance(0, 5, a, 0, r, y1) - r^2
eq2 = distance(0, 5, a, 0, x1, r) - r^2
eq3 = distance(0, 0, x, y, r, y1) - r^2
eq4 = distance(0, 0, x, y, x1, r) - r^2
eq5 = distance(0, 5, a + b, 0, x1, r) - r^2
eq6 = (5 - y)*(a + b) - 5x
eq7 = x*y + x*(5-y)/2 + (a + b - x)*y/2 - 5(a + b)/2;
# solve([eq1, eq2, eq3, eq4, eq5, eq6, eq7])

nlsove() で解く。

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

   -r^2 + (y1 - 5*(a^2 - a*r + 5*y1)/(a^2 + 25))^2 + (-a*(a*r - 5*y1 + 25)/(a^2 + 25) + r)^2,  # eq1
   -r^2 + (r - 5*(a^2 - a*x1 + 5*r)/(a^2 + 25))^2 + (-a*(a*x1 - 5*r + 25)/(a^2 + 25) + x1)^2,  # eq2
   -r^2 + (r - x*(r*x + y*y1)/(x^2 + y^2))^2 + (-y*(r*x + y*y1)/(x^2 + y^2) + y1)^2,  # eq3
   -r^2 + (r - y*(r*y + x*x1)/(x^2 + y^2))^2 + (-x*(r*y + x*x1)/(x^2 + y^2) + x1)^2,  # eq4
   -r^2 + (r - 5*(a^2 + 2*a*b - a*x1 + b^2 - b*x1 + 5*r)/(a^2 + 2*a*b + b^2 + 25))^2 + (x1 - (a + b)*(a*x1 + b*x1 - 5*r + 25)/(a^2 + 2*a*b + b^2 + 25))^2,  # eq5
   -5*x + (5 - y)*(a + b),  # eq6
   -5*a/2 - 5*b/2 + x*y + x*(5 - y)/2 + y*(a + b - x)/2,  # eq7

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=1e-14)
       v = r.zero[1]
   else
       r = nlsolve((vout, vin)->vout .= func(vin, params...), ini, ftol=1e-14)
       v = r.zero
   end
   return v, r.f_converged
end;

function H(u)
   (a, b, r, x1, y1, x, y) = u
   return [
       -r^2 + (y1 - 5*(a^2 - a*r + 5*y1)/(a^2 + 25))^2 + (-a*(a*r - 5*y1 + 25)/(a^2 + 25) + r)^2,  # eq1
       -r^2 + (r - 5*(a^2 - a*x1 + 5*r)/(a^2 + 25))^2 + (-a*(a*x1 - 5*r + 25)/(a^2 + 25) + x1)^2,  # eq2
       -r^2 + (r - x*(r*x + y*y1)/(x^2 + y^2))^2 + (-y*(r*x + y*y1)/(x^2 + y^2) + y1)^2,  # eq3
       -r^2 + (r - y*(r*y + x*x1)/(x^2 + y^2))^2 + (-x*(r*y + x*x1)/(x^2 + y^2) + x1)^2,  # eq4
       -r^2 + (r - 5*(a^2 + 2*a*b - a*x1 + b^2 - b*x1 + 5*r)/(a^2 + 2*a*b + b^2 + 25))^2 + (x1 - (a + b)*(a*x1 + b*x1 - 5*r + 25)/(a^2 + 2*a*b + b^2 + 25))^2,  # eq5
       -5*x + (5 - y)*(a + b),  # eq6
       -5*a/2 - 5*b/2 + x*y + x*(5 - y)/2 + y*(a + b - x)/2,  # eq7
      ]
end;

iniv = [big"2.8", 2.9, 0.9, 3.3, 1.6, 3.4, 2.1]
res = nls(H, ini=iniv);
println(res);

   (BigFloat[2.800221924622118970432095313760788507835397409564486177867680366139659180899345, 2.91487027133284102199601750983229645815568299593371469024204485373220221457499, 0.8974814920915777221723012652934296052881492161222889500985443442946459740211824, 3.326236908516905783403296227571694673430896734617166839237861420836889759024065, 1.560761971632353997076535469661088458153271795581832971123527071275699538470573, 3.431977890341429946507935106849530222260823283947106463592744755845496558390283, 1.997443109692506364316550909933324776725666683744229847556829344314537003376505], true)

   a = 2.800222;  b = 2.914870;  r = 0.897481;  x1 = 3.326237;  y1 = 1.560762;  x = 3.431978;  y = 1.997443
   2r = 1.794963

等円の直径は 1.794963 寸である。

算額の術では 1.830127 寸としているが,図に描く限り上の方が正しそう。

using Plots

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (a, b, r, x1, y1, x, y) = res[1]
   @printf("a = %.6f;  b = %.6f;  r = %.6f;  x1 = %.6f;  y1 = %.6f;  x = %.6f;  y = %.6f\n", a, b, r, x1, y1, x, y)
   @printf("2r = %.6f\n", 2r)
   plot([0, a + b, 0, 0, x], [0, 0, 5, 0, y], color=:black, lw=0.5)
   segment(0, 5, a, 0)
   circle(r, y1, r, :blue)
   circle(x1, r, r, :blue)
   if more
       point(x, y, " (x,y)", :green, :left, :bottom)
       point(x1, r, " (x1,r)")
       point(r, y1, " (r,y1)")
       point(a, 0, "a ", :green, :right, :bottom)
       point(a + b, 0, " a+b", :green, :left, :bottom)
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

 

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

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

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