裏 RjpWiki

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

算額(その129)

2023年02月12日 | Julia

算額(その129)

千葉県市原市 薬王寺 寛政元年(1789)
https://fururen.net/siryoukan/bunkazai/bunkazaisitu.htm

鉤股弦をそれぞれ,588, 2016, 2100 とし,また以下のように記号を定め,方程式を立てて,解く。
小円の中心座標,半径 r1, y1, r1
中円の中心座標,半径 r2, r2, r2
大円の中心座標,半径 x3, 0, r3

using SymPy

function distance(x1, y1, x2, y2, x0, y0)
p1, p2 = sympy.Point(x1, y1), sympy.Point(x2, y2)
l = sympy.Line(p1, p2)
l.distance(sympy.Point(x0, y0))^2  # 二乗距離を返す!!
end;

@syms r1::positive, y1::positive, r2::positive, x3::positive, r3::positive;

eq1 = (r1-r2)^2 + (y1 - r2)^2 - (r1 + r2)^2 # 小中
eq2 = (r2 - x3)^2 + r2^2 - (r2 + r3)^2 # 中大
eq3 = distance(2016, 0, 0, 588, r1, y1) - r1^2 # 小円の中心から斜辺への距離
eq4 = distance(2016, 0, 0, 588, r2, r2) - r2^2 # 中円の中心から斜辺への距離
eq5 = distance(2016, 0, 0, 588, x3, 0) - r3^2; # 大円の中心から斜辺への距離

res = solve([eq1, eq2, eq3, eq4, eq5], (r1, y1, r2, x3, r3))

   8-element Vector{NTuple{5, Sym}}:
    (63, 504, 252, 791, 343)
    (784/3, 784, 2352, 1666, 98)
    (784/3, 784, 2352, 6223/3, 49/3)
    (784/3, 784, 2352, 4116, 588)
    (448, 924, 252, 791, 343)
    (21168, 16464, 2352, 1666, 98)
    (21168, 16464, 2352, 6223/3, 49/3)
    (21168, 16464, 2352, 4116, 588)

y1 < 588 でなければならないので,1 番目以外の解は不適切である。

for i = 1:8
   if res[i][2] < 588
       println("\ni = $i")
       for j = 1:5
           println("$j $(res[i][j].evalf())")
       end
   end
end

   i = 1
   1 63.0000000000000
   2 504.000000000000
   3 252.000000000000
   4 791.000000000000
   5 343.000000000000

r1 = 63.000;  y1 = 504.000;  r2 = 252.000;  x3 = 791.000;  r3 = 343.000 となる。
求められている小円の径は 63*2 = 126寸,中円の径は 252*2 = 504寸,大円の半径はそのまま 343寸である。

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, y1, r2, x3, r3) = res[1]
   @printf("r1 = %.3f;  y1 = %.3f;  r2 = %.3f;  x3 = %.3f;  r3 = %.3f\n",
       r1.evalf(), y1.evalf(), r2.evalf(), x3.evalf(), r3.evalf())
   plot([0, 2016, 0, 0], [0, 0, 588, 0], color=:black, lw=0.5)
   circle(r1, y1, r1)
   circle(r2, r2, r2, :blue)
   circle(x3, 0, r3, :green, beginangle=0, endangle=180)
   if more == true
       point(r1, y1, "小円:(r1,y1,r1)", :red)
       point(r2, r2, "中円:(r2,r2,r2)", :blue)
       point(x3, 0, "大円:(x3,0,r3)", :green, :left, :bottom)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

   r1 = 63.000;  y1 = 504.000;  r2 = 252.000;  x3 = 791.000;  r3 = 343.000

 

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

算額(その128)

2023年02月11日 | Julia

算額(その128)

新潟県長岡市 蒼柴神社 亨和元年(1801)3月
http://www.wasan.jp/niigata/aoshi.html

正方形内に甲円,乙円,丙円,丁円が入っている。甲円の径が 2993寸であるとき,丁円の径を求めよ。

以下のように記号を定め,方程式を立てて,解く。
甲円の中心座標,半径 a, a, a
乙円の中心座標,半径 x1, r1, r1
丙円の中心座標,半径 r2, y2, r2
丁円1の中心座標,半径 r3, y3, r3
丁円2の中心座標,半径 r3, r3, r3

using SymPy

@syms x1, r1, y2, r2, y3, r3;
@syms x1::positive, r1::positive, y2::positive, r2::positive, y3::positive, r3::positive;
a = 2993
eq1 = (a - x1)^2 + (a - r1)^2 - (a + r1)^2 # 甲乙
eq2 = (a - r2)^2 + (a - y2)^2 - (a + r2)^2 # 甲丙
eq3 = (a - r3)^2 + (a - y3)^2 - (a + r3)^2 # 甲丁
eq4 = (x1 - r2)^2 + (r1 - y2)^2 - (r1 + r2)^2 # 乙丙
eq5 = (x1 - r3)^2 + (r1 - r3)^2 - (r1 + r3)^2 # 乙丁
eq6 = (r2 - r3)^2 + (y2 - y3)^2 - (r2 + r3)^2; # 丙丁

res = solve([eq1, eq2, eq3, eq4, eq5, eq6], (x1, r1, y2, r2, y3, r3))

   3-element Vector{NTuple{6, Sym}}:
    (2993*(-2705*sqrt(2)*sqrt(88*sqrt(2) + 145) - 3708*sqrt(88*sqrt(2) + 145) + 61516 + 43911*sqrt(2))/(14*(-97*sqrt(88*sqrt(2) + 145) - 64*sqrt(2)*sqrt(88*sqrt(2) + 145) + 1076*sqrt(2) + 1543)), 2993*(-53*sqrt(88*sqrt(2) + 145) + 6*sqrt(2)*sqrt(88*sqrt(2) + 145) + 154*sqrt(2) + 483)/(56*(-sqrt(88*sqrt(2) + 145) + 4*sqrt(2) + 7)), (-50881*sqrt(88*sqrt(2) + 145)/7 - 17958*sqrt(176*sqrt(2) + 290)/7 + 53874*sqrt(2) + 98769)/(-sqrt(88*sqrt(2) + 145) + 4*sqrt(2) + 7), -2993*sqrt(176*sqrt(2) + 290)/28 - 2993*sqrt(88*sqrt(2) + 145)/56 + 2993*sqrt(2)/4 + 20951/8, (-86797*sqrt(2) - 86797 + 14965*sqrt(88*sqrt(2) + 145)/7 + 50881*sqrt(176*sqrt(2) + 290)/7)/(-sqrt(88*sqrt(2) + 145) + 4*sqrt(2) + 7), -2993*sqrt(22*sqrt(2) + 145/4)/2 + 2993*sqrt(2) + 32923/4)
    (2993*(178476*sqrt(648*sqrt(2) + 1009) + 7918716 + 5633873*sqrt(2) + 129799*sqrt(2)*sqrt(648*sqrt(2) + 1009))/(46*(576*sqrt(2)*sqrt(648*sqrt(2) + 1009) + 25884*sqrt(2) + 37079 + 865*sqrt(648*sqrt(2) + 1009))), 2993*(70*sqrt(2)*sqrt(648*sqrt(2) + 1009) + 7958*sqrt(2) + 14835 + 501*sqrt(648*sqrt(2) + 1009))/(184*(12*sqrt(2) + 23 + sqrt(648*sqrt(2) + 1009))), (-29930*sqrt(1296*sqrt(2) + 2018)/23 + 77818*sqrt(2) + 218489 + 218489*sqrt(648*sqrt(2) + 1009)/23)/(12*sqrt(2) + 23 + sqrt(648*sqrt(2) + 1009)), -14965*sqrt(1296*sqrt(2) + 2018)/92 - 2993*sqrt(2)/2 + 50881/16 + 92783*sqrt(648*sqrt(2) + 1009)/368, (248419*sqrt(648*sqrt(2) + 1009)/23 + 607579 + 487859*sqrt(2) + 308279*sqrt(1296*sqrt(2) + 2018)/23)/(12*sqrt(2) + 23 + sqrt(648*sqrt(2) + 1009)), 8979*sqrt(2) + 80811/4 + 2993*sqrt(162*sqrt(2) + 1009/4)/2)
    (20951 + 17958*sqrt(2), 53874*sqrt(2) + 80811, 5986, 2993/4, 8979, 2993)

for i = 1:3
   println("\ni = $i")
   for j = 1:6
       println("$j $(res[i][j].evalf())")
   end
end

   i = 1
   1 736.025275189970
   2 425.487379588315
   3 1040.89692642305
   4 318.301571155078
   5 1520.94944962006
   6 181.000068733201

   i = 2
   1 14026.4495979657
   2 10168.4772828975
   3 7926.31625151136
   4 2032.87748391464
   5 31045.8991959313
   6 65733.8083275212

   i = 3
   1 46347.4471530960
   2 157000.341459288
   3 5986.00000000000
   4 748.250000000000
   5 8979.00000000000
   6 2993.00000000000

1 番目の解が妥当なものである。すなわち,元の単位では丁円の径は 181 寸である。

a*(11/4 + sqrt(2) - sqrt(22*sqrt(2) + 145/4)/2)

   181.00006873320254

丁円の半径は
-2993*sqrt(22*sqrt(2) + 145/4)/2 + 2993*sqrt(2) + 32923/4
である。甲円の半径を a = 2993 とすると
a*(sqrt(2) + 11/4 - sqrt(22*sqrt(2) + 145/4)/2)

答えとして,
「術に曰く,置く 11 箇,4 で歸し,これに斜率を加え,極と命名する」この部分が「11/4 + √2」である。整数は「箇」で数え,割り算は「歸」,√2 を「斜率」と呼ぶのか...
続いて,「自乗しこれから五分を引き,平方に開き,これを以て極より減ずる」この部分が「極 - sqrt(極^2 - 0.5)」
更に,「甲円の径を乗ずれば丁円の径が得られる」ということで「a * (極 - sqrt(極^2 - 0.5))」となる。
確かに,極^2 - 1/2 = 22*sqrt(2)/4 + 145/16 である

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end;

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
 θ = beginangle:0.1:endangle
 x = r.*cosd.(θ)
 y = r.*sind.(θ)
  if fill
      plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
  else
      plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
  end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (x1, r1, y2, r2, y3, r3) = res[1]
   a = 2993
   @printf("乙円の径 = %.3f,  丙円の径 = %.3f,  丁円の径 %.3f\n", r1, r2, r3)
   plot([0, a, a, 0, 0], [0, 0, a, a, 0], color=:black, lw=0.5)
   circle(a, a, a, beginangle=180, endangle=270)
   circle(x1, r1, r1, :green)
   circle(r2, y2, r2, :brown)
   circle(r3, y3, r3, :blue)
   circle(r3, r3, r3, :blue)
   if more == true
       point(a, a, "甲:(a,a,a) ", :green, :right)
       point(x1, r1, "乙:(x1,r1,r1)", :brown)
       point(r2, y2, "丙:(r2,y2,r2)", :blue)
       point(r3, y3, "丁(r3,y3,r3)", :magenta)
       point(r3, r3, "丁(r3,r3,r3)", :magenta)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

   乙円の径 = 425.487,  丙円の径 = 318.302,  丁円の径 181.000

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

算額(その127)

2023年02月10日 | Julia

算額(その127)

百二十四 群馬県桐生市天神町 天満宮 明治11年(1878)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.

群馬県桐生市天神町 桐生天満宮 明治11年(1878)4月
http://www.wasan.jp/gunma/kiryutenmangu1.html

キーワード:円6個,外円
#Julia, #SymPy, #算額, #和算

外円の中に 甲,乙,丙,丁,戊の円が入っている。乙円,丙円,戊円の径が 15寸,6寸,4寸であるとき,甲円,丁円,外円の径を求めよ。

復元奉納された算額は,もともとなのかもしれないが,正確な比率に基づくものではない。正解を書いているので,図の比率がおかしいのはすぐに分かるのではあるが。
http://www.wasan.jp/gunma/tenmangukaisetu.png

それにしても,方程式が 12 本というのは,今の所最多記録である。変数は 13 個であるが,どれか一つの円(丁円にした)の中心座標が 0 になるように回転するとすれば変数は 12 個になり無事方程式を解くことができる。

算額(その723)で解き直した。
https://blog.goo.ne.jp/r-de-r/e/4a0d1938c82c456123641ba6c54462d1

甲円の中心座標,半径 x1, y1, r1
丁円の中心座標,半径 0, y2, r2
乙円の中心座標    x3, y3
丙円の中心座標    x4, y4
戊円の中心座標    x5, y5
外円の半径          r0

using SymPy

@syms x1, y1, r1, x2, y2, r2, x3, y3, x4, y4, x5, y5, r0;
x2 = 0
eq1 = (x1 - x3)^2 + (y1 - y3)^2 - (r1 + 15)^2 # 甲乙
eq2 = (x1 - x4)^2 + (y1 - y4)^2 - (r1 +6)^2 # 甲丙
eq3 = (x1 - x5)^2 + (y1 - y5)^2 - (r1 + 4)^2 # 甲戊
eq4 = x1^2 + y1^2 - (r0 - r1)^2 # 甲外
eq5 = (x2 - x3)^2 + (y2 - y3)^2 - (r2 + 15)^2 # 乙丁
eq6 = (x3 - x5)^2 + (y3 - y5)^2 - (4 + 15)^2 # 乙戊
eq7 = x3^2 + y3^2 - (r0 - 15)^2 # 乙外
eq8 = (x4 - x5)^2 + (y4 - y5)^2 - (4 + 6)^2 # 丙戊
eq9 = x4^2 + y4^2 - (r0 - 6)^2 # 丙外
eq10 = (x2 - x4)^2 + (y2 - y4)^2 - (r2 + 6)^2 # 丁丙
eq11 = (x2 - x5)^2 + (y2 - y5)^2 - (r2 + 4)^2 # 丁戊
eq12 = x2^2 + y2^2 - (r0 - r2)^2; # 丁外

しかし例のごとく,nlsolve() でなくては解けない。また,初期値の設定に敏感なので手こずる。

# res = solve([eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8, eq9, eq10, eq11, eq12])

println(eq1, ",")
println(eq2, ",")
println(eq3, ",")
println(eq4, ",")
println(eq5, ",")
println(eq6, ",")
println(eq7, ",")
println(eq8, ",")
println(eq9, ",")
println(eq10, ",")
println(eq11, ",")
println(eq12, ",")


   -(r1 + 15)^2 + (x1 - x3)^2 + (y1 - y3)^2,
   -(r1 + 6)^2 + (x1 - x4)^2 + (y1 - y4)^2,
   -(r1 + 4)^2 + (x1 - x5)^2 + (y1 - y5)^2,
   x1^2 + y1^2 - (r0 - r1)^2,
   x3^2 - (r2 + 15)^2 + (y2 - y3)^2,
   (x3 - x5)^2 + (y3 - y5)^2 - 361,
   x3^2 + y3^2 - (r0 - 15)^2,
   (x4 - x5)^2 + (y4 - y5)^2 - 100,
   x4^2 + y4^2 - (r0 - 6)^2,
   x4^2 - (r2 + 6)^2 + (y2 - y4)^2,
   x5^2 - (r2 + 4)^2 + (y2 - y5)^2,
   y2^2 - (r0 - 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=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)
 (x1, y1, r1, y2, r2, x3, y3, x4, y4, x5, y5, r0) = u
 return [
-(r1 + 15)^2 + (x1 - x3)^2 + (y1 - y3)^2,
-(r1 + 6)^2 + (x1 - x4)^2 + (y1 - y4)^2,
-(r1 + 4)^2 + (x1 - x5)^2 + (y1 - y5)^2,
x1^2 + y1^2 - (r0 - r1)^2,
x3^2 - (r2 + 15)^2 + (y2 - y3)^2,
(x3 - x5)^2 + (y3 - y5)^2 - 361,
x3^2 + y3^2 - (r0 - 15)^2,
(x4 - x5)^2 + (y4 - y5)^2 - 100,
x4^2 + y4^2 - (r0 - 6)^2,
x4^2 - (r2 + 6)^2 + (y2 - y4)^2,
x5^2 - (r2 + 4)^2 + (y2 - y5)^2,
y2^2 - (r0 - r2)^2,
   ]
end;

iniv = [-28.0, 26, 36, # x1, y1, r1 甲
   67, 5, # y2, r2 丁
   19, 51, # x3, y3 乙
   -12, 64, # x4, y4 丙
   -3, 57, # x5, y5 戊
   63] .* (60/66)

res = nls(H, ini=iniv)
println(res)

   ([-23.141676475196107, 19.090909090909108, 30.00000000000001, 55.00000000000003, 5.000000000000002, 15.4277843167974, 42.2727272727273, -10.799449021758182, 52.909090909090935, -3.085556863359481, 46.54545454545457, 60.00000000000003], true)

外円の径 = 60.000,  甲円の径 = 30.000,  丁円の径 5.000 である。

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end;

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
 θ = beginangle:0.1:endangle
 x = r.*cosd.(θ)
 y = r.*sind.(θ)
  if fill
      plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
  else
      plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
  end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (x1, y1, r1, y2, r2, x3, y3, x4, y4, x5, y5, r0) = res[1]
   @printf("外円の径 = %.3f,  甲円の径 = %.3f,  丁円の径 %.3f\n", r0, r1, r2)
   x2 = 0
   plot()
   circle(0, 0, r0)
   circle(x1, y1, r1, :green)
   circle(x2, y2, r2, :brown)
   circle(x3, y3, 15, :blue)
   circle(x4, y4, 6, :magenta)
   circle(x5, y5, 4)
   if more == true
       point(x1, y1, "甲", :green)
       point(x2, y2, "丁", :brown)
       point(x3, y3, "乙", :blue)
       point(x4, y4, "丙", :magenta)
       point(x5, y5, "戊", :red)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

 

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

算額(その126)

2023年02月10日 | Julia

算額(その126)

群馬県吾妻郡東吾妻町 一宮神社 明治5年(1872)3月
http://www.wasan.jp/gunma/itinomiya.html

正方形の中に 5 個の円が入っている。円の半径を求めよ。

算額(その29)https://blog.goo.ne.jp/r-de-r/e/a9e1b842cd8d371848fd4f8e8233c438 に似ているが違う。

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

using SymPy

@syms r::positive, x, y::positive;
eq1 = (1 - r)^2 + (1 - r - y)^2 - 4r^2
eq2 = (1 - 2r)^2 + (y - r + 1)^2 - 4r^2;

res = solve([eq1, eq2], (r, y))

   4-element Vector{Tuple{Sym, Sym}}:
    (6/13 - (14 - sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) + 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/2 + sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/2)^3/364 - sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) + 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/364 + 16*(14 - sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) + 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/2 + sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/2)^2/91 + sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/364, 14 - sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) + 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/2 + sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/2)
    (6/13 - (14 + sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) + 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/2 + sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/2)^3/364 + sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) + 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/364 + 16*(14 + sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) + 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/2 + sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/2)^2/91 + sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/364, 14 + sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) + 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/2 + sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/2)
    (6/13 - sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/364 + 16*(14 - sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/2 - sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) - 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/2)^2/91 - (14 - sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/2 - sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) - 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/2)^3/364 - sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) - 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/364, 14 - sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/2 - sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) - 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/2)
    (6/13 - sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/364 + 16*(14 - sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/2 + sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) - 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/2)^2/91 + sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) - 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/364 - (14 - sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/2 + sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) - 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/2)^3/364, 14 - sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3))/2 + sqrt(4576/3 - 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3) - 41696/sqrt(2288/3 + 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) + 2*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)) - 17816/(9*(142624/27 + 728*sqrt(143931)*I/9)^(1/3)))/2)

for i = 1:4
   println(res[i][1].evalf(), " ", res[i][2].evalf())
end

   1.23852234934513 + 2.40071286340101e-30*I 2.22701157420417 + 4.36922704976021e-28*I
   73.4676488890155 + 2.40037272088137e-30*I 55.3541864820079 + 4.36922704975308e-28*I
   0.905402947574918 - 2.40064155422471e-30*I -1.71373626518588 - 4.3692270498592e-28*I
   0.388425814064434 - 2.40067662309469e-30*I 0.13253820897379 - 4.36922704965409e-28*I

いずれも複素数表示になっているが,虚部はほとんど 0 なので,実数としてよい。この内の 4 番目の解が妥当である。

すなわち,円の半径は 0.388425814064434, y = 0.13253820897379 である。

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end;

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
 θ = beginangle:0.1:endangle
 x = r.*cosd.(θ)
 y = r.*sind.(θ)
  if fill
      plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
  else
      plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
  end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r, y) = 0.388425814064434, 0.132538208973790
   @printf("r = %.3f, y = %.3ff\n", r, y)
   plot([1, 1, -1, -1, 1], [-1, 1, 1, -1, -1], color=:black, lw=0.5)
   circle(0, 1 - r, r, :black)
   circle(1 - r, y, r)
   circle(r - 1, y, r)
   circle(r, r - 1, r)
   circle(-r, r - 1, r)
   if more == true
       point(0, 1 - r, "1-r ", :red, :right)
       point(1 - r, y, "(1-r,y)", :red, :center)
       point(r, r - 1, "(r,r-1)", :red, :center)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その125)

2023年02月10日 | Julia

算額(その125)

群馬県前橋市 総社神社 安政5年(1858)
http://www.wasan.jp/gunma/sojabig.html

外円の中に 4 種類の円が入っている。それぞれの半径を求めよ。

外円の半径を 1,甲円,乙円,丙円,丁円,の半径をそれぞれ r1, r2, r3, r4,丙円,丁円の中心の x 座標を x3, x4 として,方程式を解く。

using SymPy

@syms r1::positive, r2::positive, r3::positive, r4::positive, x3::positive, x4::positive;
eq1 = 2r1 + r2 - 1  # 外円の半径が 1
eq2 = x3^2 + (1 - r1 - r3)^2 - (r1 + r3)^2  # 甲円,丙円が外接する
eq3 = x4^2 + (1 - r1 - r4)^2 - (r1 + r4)^2  # 甲円,丁円が外接する
eq4 = x4^2 + r4^2 - (r2 + r4)^2  # 乙円,丁円が外接する
eq5 = (x3 - x4)^2 + (r3 - r4)^2 - (r3 + r4)^2  # 丙円,丁円が外接する
eq6 = x3^2 + r3^2 - (1 -r3)^2;  # 丙円が外円に内接する

res = solve([eq1, eq2, eq3, eq4, eq5, eq6], (r1, r2, r3, r4, x3, x4))

   1-element Vector{NTuple{6, Sym}}:
    (-1 + sqrt(2), 3 - 2*sqrt(2), 1 - sqrt(2)/2, -2 + 3*sqrt(2)/2, sqrt(-7 + 5*sqrt(2))*(1 + sqrt(2)), sqrt(-7 + 5*sqrt(2)))

r1 = 0.414, r2 = 0.172, r3 = 0.293, r4 = 0.121, x3 = 0.644, x4 = 0.267

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end;

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
 θ = beginangle:0.1:endangle
 x = r.*cosd.(θ)
 y = r.*sind.(θ)
  if fill
      plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
  else
      plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
  end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function draw(more)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r2, r3, r4, x3, x4) = res[1]
   @printf("r1 = %.3f, r2 = %.3f, r3 = %.3f, r4 = %.3f, x3 = %.3f, x4 = %.3f\n", r1, r2, r3, r4, x3, x4)
   plot()
   circle(0, 0, 1, :black)
   circle(0, 1 - r1, r1)
   circle(0, -1 + r1, r1)
   circle(0, 0, r2, :blue)
   circle(x3, r3, r3, :magenta)
   circle(x3, -r3, r3, :magenta)
   circle(-x3, r3, r3, :magenta)
   circle(-x3, -r3, r3, :magenta)
   circle(x4, r4, r4, :green)
   circle(x4, -r4, r4, :green)
   circle(-x4, r4, r4, :green)
   circle(-x4, -r4, r4, :green)
   if more == true
       point(0, 1-r1, "甲: 1-r1 ", :red, :right)
       point(0, r2, "乙:r2", :blue, :center)
       point(x3, r3, "丙:(x3,r3)", :magenta, :center)
       point(x4, r4, " 丁:(x4,r4)", :green)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その124)

2023年02月09日 | Julia

算額(その124)

群馬県安中市後閑 庚申塚の庚申塔
http://www.wasan.jp/gunma/kosinsol.html

長方形の中に 6 個の円が入っている。等円の直径が 1 寸のとき,長方形の長辺と短辺の長さを求めよ。

等円の半径を 1,長方形の長辺,短辺を w, h として図のように記号を定め,方程式を解く。

using SymPy

@syms h::positive, w::positive, x2::positive, x3::positive, y3::positive;
eq1 = (x2 - 1)^2 + (h - 2)^2 - 4  # A,B が外接
eq2 = (x3 - 1)^2 + (y3 - 1)^2 - 4  # A,C が外接
eq3 = (x3 - x2)^2 + (h - 1 - y3)^2 - 4  # B,C が外接
eq4 = (w - 2x3)^2 + (h - 2y3)^2 - 4  # C,D が外接
eq5 = (w - 2)^2 + (h - 2)^2 - 6^2;  # 緑の直角三角形 AEF でピタゴラスの定理

res = solve([eq1, eq2, eq3, eq4, eq5], (w, h, x2, x3, y3))

   2-element Vector{NTuple{5, Sym}}:
    (2 + 15*sqrt(7)/7, 2 - 3*sqrt(21)/7, sqrt(7)/7 + 1, 1 + 5*sqrt(7)/7, 1 - sqrt(21)/7)
    (2 + 15*sqrt(7)/7, 3*sqrt(21)/7 + 2, sqrt(7)/7 + 1, 1 + 5*sqrt(7)/7, sqrt(21)/7 + 1)

2 番目の解が適切。

for i = 1:2
   if res[i][2].evalf() > res[i][3].evalf()
       println("i = $i")
       println("w = $(res[i][1].evalf())")
       println("h = $(res[i][2].evalf())")
       println("x2 = $(res[i][3].evalf())")
       println("x3 = $(res[i][4].evalf())")
       println("y3 = $(res[i][5].evalf())\n")
   end
end


   i = 2
   w = 7.66946709513841
   h = 3.96396101212393
   x2 = 1.37796447300923
   x3 = 2.88982236504614
   y3 = 1.65465367070798

もとの単位に戻すにはそれぞれの数値を半分にする。長辺は 3寸8分3厘5毛,短編は 1寸9分8厘2毛である。

(w, h) = (2 + 15*sqrt(7)/7, 3*sqrt(21)/7 + 2) ./ 2

   (3.834733547569204, 1.9819805060619657)

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end;

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
 θ = beginangle:0.1:endangle
 x = r.*cosd.(θ)
 y = r.*sind.(θ)
  if fill
      plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
  else
      plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
  end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (w, h, x2, x3, y3) = [z.evalf() for z in res[2]]
   @printf("w = %.3f, h = %.3f, x2 = %.3f, x3 = %.3f, y3 = %.3f\n", w, h, x2, x3, y3)
   @printf("w = %.3f 寸, h = %.3f 寸", w/2, h/2)
   plot([0, w, w, 0, 0], [0, 0, h, h, 0], color=:blue, lw=0.5)
   circle(1, 1, 1)
   circle(x2, h-1, 1)
   circle(x3, y3, 1)
   circle(w-x3, h-y3, 1)
   circle(w-1, h - 1, 1)
   circle(w-x2, 1, 1)
   if more == true
       point(0, h, "h ", :blue, :right)
       point(w, 0, " w", :blue)
       point(1, 1, "A(1,1)", :blue, :center)
       point(x2, h-1, "B(x2,h-1)", :blue, :center)
       point(x3, y3, "C(x3,y3)", :blue, :center)
       point(w-x3, h-y3, "D(w-x3,h-y3)", :blue, :center)
       point(w-1, h-1, "E(w-1,h-1)", :blue, :center)
       point(w-1, 1, "F(w-1,1)", :blue, :center)
       plot!([1, w - 1, w - 1, 1,], [1, 1, h - 1, 1], color=:green, lw=0.5)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       plot!(xlims=(-0.5, 8.5), ylims=(-0.5, 4.5))
   else
       plot!(showaxis=false)
   end
end;

   w = 7.669, h = 3.964, x2 = 1.378, x3 = 2.890, y3 = 1.655
   w = 3.835 寸, h = 1.982 寸

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

算額(その123)

2023年02月08日 | Julia

算額(その123)

長野県佐久市香坂 明泉寺千手観音堂 文化元年(1804)3月
http://www.wasan.jp/nagano/senju.html

五角形の中に大円と小円 2 個がある。上辺 18 寸,斜辺 25 寸のとき,大円の径はいかほどか。

算額(その117)に似ているが,台形ではなく五角形であるところがちょっと違う。

図が不鮮明であるが,[電子復刻 中村信弥著「改訂増補長野県の算額」] http://www.wasan.jp/zoho/nagano3.pdf に詳しいページ(74ページ)があった。

方程式を立てる都合上左右反転させる。

算額(その117)では,円の直径は AB * CD / (AB + CD) * 2 という公式があるが,本問では CD は 18 寸であるが,もう一つの長さが AB ではなく「AD の一部」が 25 寸とされている。「AD の一部」は,下図では DE である。DX は三角形の比例関係で求められるので,そのあとピタゴラスの定理で OX も求まり,件の公式が使える。

しかし,手で計算するのは面倒なので,以下のように方程式を立て,それを解く。

using SymPy

function distance(x1, y1, x2, y2, x0, y0)
p1, p2 = sympy.Point(x1, y1), sympy.Point(x2, y2)
l = sympy.Line(p1, p2)
l.distance(sympy.Point(x0, y0))^2  # 二乗距離を返す!!
end;

@syms x0::positive, x::positive, y::positive, L::positive, r::positive, R::positive;
#@syms x0, x, y, L, r, R;
eq1 = (x + 3r - 18)^2 + (2R - y)^2 - 25^2 |> expand # ED の長さ
eq2 = (x - R)^2 + (R - r)^2 - (R + r)^2 |> expand  # 大円と左の小円が外接する
eq3 = R*(x0-x-2r) - r*(x0-R) |> expand  # R/r = (x0-R)/(x0-x-2r);  R と r の比
eq4 = (x0 - 18)^2 + 4R^2 - L^2 |> expand  # ⊿AXE EX を L とする
eq5 = 2R*(x0 - x - 3r) - y*(x0 - 18) |> expand  # 2R/y = (x0-18)/(x0-x-3r);  AE と BD の比
eq6 = distance(18, 2R, x0, 0, x+2r, r) - r^2;  # 右の小円が EX に接する

例によって,複雑な方程式群は nlsolve() でなくては解けないようなので,以下のようにする。

# res = solve([eq1, eq2, eq3, eq4, eq5, eq6], (x0, x, y, L, r, R))

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

   4*R^2 - 4*R*y + 9*r^2 + 6*r*x - 108*r + x^2 - 36*x + y^2 - 301,
   R^2 - 4*R*r - 2*R*x + x^2,
   -R*r - R*x + R*x0 - r*x0,
   -L^2 + 4*R^2 + x0^2 - 36*x0 + 324,
   -6*R*r - 2*R*x + 2*R*x0 - x0*y + 18*y,
   -r^2 + (-2*R*(2*R*r - 2*r*x0 + 36*r - x*x0 + 18*x + x0^2 - 18*x0)/(4*R^2 + x0^2 - 36*x0 + 324) + r)^2 + (2*r + x - (4*R^2*x0 - 2*R*r*x0 + 36*R*r + 2*r*x0^2 - 72*r*x0 + 648*r + x*x0^2 - 36*x*x0 + 324*x)/(4*R^2 + x0^2 - 36*x0 + 324))^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=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)
  (x0, x, y, L, r, R) = u
  return [
4*R^2 - 4*R*y + 9*r^2 + 6*r*x - 108*r + x^2 - 36*x + y^2 - 301,
R^2 - 4*R*r - 2*R*x + x^2,
-R*r - R*x + R*x0 - r*x0,
-L^2 + 4*R^2 + x0^2 - 36*x0 + 324,
-6*R*r - 2*R*x + 2*R*x0 - x0*y + 18*y,
-r^2 + (-2*R*(2*R*r - 2*r*x0 + 36*r - x*x0 + 18*x + x0^2 - 18*x0)/(4*R^2 + x0^2 - 36*x0 + 324) + r)^2 + (2*r + x - (-2*R*(4*R*r + 2*R*x - 2*R*x0 + r*x0 - 18*r) + (2*r + x)*(4*R^2 + x0^2 - 36*x0 + 324))/(4*R^2 + x0^2 - 36*x0 + 324))^2,
   ]
end;

iniv = [35.0, 22, 5, 31, 4, 13]
res = nls(H, ini=iniv)
println(res)

   ([36.000000000000014, 24.0, 4.000000000000003, 30.000000000000007, 3.000000000000002, 11.999999999999998], false)

大円の半径は 12 なので,もとの単位では直径が 24 寸 ということになる。

using Plots

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end;

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
 θ = beginangle:0.1:endangle
 x = r.*cosd.(θ)
 y = r.*sind.(θ)
  if fill
      plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
  else
      plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
  end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (x0, x, y, L, r, R) = res[1]
   plot([0, x+3r, x+3r, 18, 0, 0], [0, 0, y, 2R, 2R, 0], color=:blue, lw=0.5)
   circle(R, R, R)
   circle(x, r, r)
   circle(x+2r, r, r)
   if more == true
       point(0, 0, " O")
       point(18, 0, " A")
       point(x+3r, 0, " B")
       point(x+3r, r, "C ", :green, :right)
       point(x+3r, y, " D:(x+3r,y)", :green, :left, :bottom)
       point(18, 2R, " E", :green, :left, :bottom)
       point(0, 2R, " F", :green, :left, :bottom)
       point(x0, 0, " X:(x0,0)", :green, :left, :bottom)
       point(x, r, "(x,r)", :green, :bottom)
       plot!([x+3r, x0, x+3r], [y, 0, 0], color=:green, lw=0.5, linestyle=:dot)
       hline!([0, r], color=:black, lw=0.5, linestyle=:dot, xlims=(-3, 38), ylims=(-2, 26))
       vline!([0, 18, 30, 33], color=:black, lw=0.5, linestyle=:dot)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その122)

2023年02月06日 | Julia

算額(その122)

一関市博物館 > 和算に挑戦 > 令和元年度出題問題(2) [中級問題](中学・高校生向き)
岩手県一関市舞川の菅原神社に嘉永3年(1850)に奉納された算額
https://www.city.ichinoseki.iwate.jp/museum/wasan/r1/normal.html

正方形の内部に四分円を配置し等円が 2 個入っている。等円の直径が一寸のとき,黒く塗った部分の面積はいかほどか。

正方形の一辺の長さを a,右の等円の中心座標を (a - 1/2, y) とする。四分円と等円が接することから 2 本の方程式を立て,解く。

using SymPy

@syms a, y;

eq1 = (a - 1//2)^2 + y^2 - (a +1//2)^2
eq2 = (1//2)^2 + y^2 - (a - 1//2)^2
res = solve([eq1, eq2], (a, y))

   3-element Vector{Tuple{Sym, Sym}}:
    (0, 0)
    (3, -sqrt(6))
    (3, sqrt(6))

res |> println


   Tuple{Sym, Sym}[(0, 0), (3, -sqrt(6)), (3, sqrt(6))]

a = 3, y = sqrt(6) が適切な解である。すなわち,正方形の一辺の長さは元の単位で 3 寸である。

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end;

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
 θ = beginangle:0.1:endangle
 x = r.*cosd.(θ)
 y = r.*sind.(θ)
  if fill
      plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
  else
      plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
  end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function blackarea(ox, oy, a, color=:black; beginangle=0, endangle=360)
   θ = beginangle:0.1:endangle
   x = a * cosd.(θ); append!(x, x[1]); append!(x, x[1])
   y = a * sind.(θ); append!(y, y[end]); append!(y, y[1])
   plot!(ox .+ x, oy .+ y, color=color, seriestype=:shape, fillcolor=color, lw=0.5)
   x = a .- x[end:-1:1]
   y = y[end:-1:1]
   plot!(ox .+ x, oy .+ y, color=color, seriestype=:shape, fillcolor=color, lw=0.5)
end

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (a, y) = (3, sqrt(6))
   println("(a, y) = $((a, y))")
   plot([0, a, a, 0, 0], [0, 0, a, a, 0], color=:black, lw=0.5)
   blackarea(0, 0, a, :black, beginangle=60, endangle=90)
   circle(0, 0, a, :black, beginangle=0, endangle=90)
   circle(a, 0, a, :black, beginangle=90, endangle=180)
   circle(a - 1/2, y, 1/2, :red)
   circle(1/2, y, 1/2, :red)
   if more == true
       point(a/2, a√3/2, "   B")
       point(0, 0, " O")
       point(a/2, 0, " C")
       point(a, 0, " A")
       point(a/2, a, " D", :green, :left, :bottom)
       point(a, a, " E", :green, :left, :bottom)
       segment(a/2, a√3/2, a/2, a, :white, linewidth=1)
       segment(a/2, a√3/2, a, 0, :black)
       segment(a/2, a√3/2, a/2, 0)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

   (a, y) = (3, 2.449489742783178)

長方形 ACDE の面積 = X = a^2 / 2,扇形 ABE の面積 = Y = a^2 * pi / 12,三角形 ABC の面積 = Z = (a/2)^2 * sqrt(3) / 2
黒く塗った部分の半分 BDE の面積 = X - Y - Z

黒く塗った部分の面積は 2(X - Y - Z) = 0.39049670258533675

2(a^2 / 2 - a^2 * pi / 12 - (a/2)^2 * sqrt(3) / 2)

@syms a
eq = 2(a^2 // 2 - a^2 * PI / 12 - (a/2)^2 * sqrt(Sym(3)) / 2);
simplify(eq) |> println

   a^2*(-pi/6 - sqrt(3)/4 + 1)

SymPy の integrate() で解いてみよう。

using SymPy
@syms x
2integrate(3-sqrt(9 - x^2), (x, 0, 1.5))

    0.390496702585335

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

算額(その121)

2023年02月02日 | Julia

算額(その121)

一関市博物館 > 和算に挑戦 > 令和2年度出題問題(2) [中級問題](中学・高校生向き)
岩手県一関市の伊吹神社に明治17年(1884)に奉納された算額より
https://www.city.ichinoseki.iwate.jp/museum/wasan/r2/normal.html

図のように大円,中円,小円が配置されている。大円の中心と右側(左側)の中円,小円の中心は一直線上にある。小円の直径が 2 寸のとき,大円の直径はいかほどか。

出題は円の直径であるが,小数点がつかないように2倍して半径を用いる。また,昨図のために必要な座標をすべて求める。

大円の,中円の半径を r3, r2 とする。右の小円の中心座標を (x, y) とする。図のように記号を定め,方程式を解く。

using SymPy

@syms x, y, r1, r2, r3;

eq1 = r2^2 + (r2 - 2)^2 - (2 + r2)^2
eq2 = (x - r2)^2 +(r2 - y)^2 - (r2 - 2)^2
eq3 = x^2 + (r3 - y)^2 - (r3 + 2)^2
eq4 = (r3 - r2)^2 + r2^2 - r3^2
eq5 = (r3 - r2) * (x - r2) - (r2 - y) * r2
res = solve([eq1, eq2, eq3, eq5], (x, y, r2, r3))

   2-element Vector{NTuple{4, Sym}}:
    (16/5, 22/5, 8, 2)
    (64/5, 22/5, 8, 14)

2 組目が適切な解である。
大円の半径が 14 で,元の単位では直径が 14 寸である

中円の直径が 8 寸,右の小円の中心座標が (64/5, 22/5) である。

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (x, y, r2, r3) = res[2]
   println("(x, y, r2, r3) = $((x, y, r2, r3))")
   plot()
   circle(0, r3, r3, :green)
   circle(r2, r2, r2, :red)
   circle(-r2, r2, r2, :red)
   circle(x, y, 2, :magenta)
   circle(-x, y, 2, :magenta)
   circle(0, 2, 2, :blue)
   if more == true
       segment(0, r3, x, y, :black)
       point(0, 2, " 2", :blue)
       point(0, r3, "r3 ", :green, :right)
       point(r2, r2, "(r2,r2) ", :red, :right)
       point(x, y, "(x,y)", :red, :top)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

   (x, y, r2, r3) = (64/5, 22/5, 8, 14)

 

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

算額(その120)

2023年02月02日 | Julia

算額(その120)

一関市博物館 > 和算に挑戦 > 令和3年度出題問題(2) [中級問題](中学・高校生向き
岩手県平泉町の中尊寺阿弥陀堂に弘化2年(1845)年に奉納された算額より
https://www.city.ichinoseki.iwate.jp/museum/wasan/r3/normal.html

図のように正方形の中に大円と半円が 1 個ずつ,小円が 3 個入っている。小円の直径が 3 寸のとき,大円の直径はいかほどか。

出題は円の直径であるが,小数点がつかないように2倍して半径を用いる。また,昨図のために必要な座標をすべて求める。

正方形の一辺の長さを 2a,小円の半径を r = 3,大円の半径を R とし,図のように記号を定め,方程式を解く。

include("julia-source.txt");

using SymPy

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

eq1 = x^2 + r^2 - (a - r)^2
eq2 = x^2 + (2a - R - r)^2 - (R + r)^2
eq3 = 2R - 2r - a;
res = solve([eq1, eq2, eq3], (a, x, R))

  1-element Vector{Tuple{Sym, Sym, Sym}}:
 (10*r/3, 2*sqrt(10)*r/3, 8*r/3)

小円の半径 r が 3 のとき,大円の半径は 8 である。もとの単位では,大円の径(直径)は 8 寸である。また,正方形の一辺の長さは 10 寸である。右にある小円の中心の x 座標は 2√10 である。

using Plots

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    r = 3
    (a, x, R) = (10*r/3, 2*sqrt(10)*r/3, 8*r/3)

    println((a, x, r, R))
    plot([a, a, -a, -a, a], [0, 2a, 2a, 0, 0], color=:black, lw=0.5)
    circle(0, 2a - R, R, :green)
    circle(0, 0, a, :red, beginangle=0, endangle=180)
    circle(0, a-r, r, :magenta)
    circle(x, r, r, :blue)
    circle(-x, r, r, :blue)
    if more == true
        point(0, 2a - R, "2a-R")
        point(0, a, "a")
        point(0, a-2r, "a-2r")
        point(0, a-r, "a-r", :magenta)
        point(x, r, "(x,r)", :blue)
        hline!([0], color=:black, lw=0.5)
        vline!([0], color=:black, lw=0.5)
    else
        plot!(showaxis=false)
    end
end;

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

算額(その119)

2023年02月02日 | Julia

算額(その119)

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

一関市博物館 > 和算に挑戦 > 令和4年度出題問題(2) [中級問題](中学・高校生向き)
岩手県花巻市の清水寺に嘉永3年(1850)に奉納された算額より
https://www.city.ichinoseki.iwate.jp/museum/wasan/r4/normal.html

図のように外円の中に直角三角形,大円,中円,小円が入っている。中円,小円の直径をそれぞれ 2 寸,1 寸としたとき,大円の直径を求めよ。

出題は円の直径であるが,小数点がつかないように2倍して半径を用いる。また,昨図のため外円の半径 R も求める。

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

eq1 だけで R=10 がわかる(R=2 は不適切解)。

using SymPy

@syms r, R

eq1 = (R-4)^2 + (R - 2)^2 - R^2
solve(eq1) |> println

   Sym[2, 10]

次に eq2 を解いて大円の半径 4 を得る。もとの単位では直径 4 寸である

eq2 = 2(R-4)*(R-2) - r*(3R - 6)
solve(eq2(R => 10)) |> println

   Sym[4]

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
 plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r, R) = (4, 10)
   println((R, r))
   x = R - 2
   y = R - 4
   plot()
   circle(0, 0, R, :black)
   circle(-x-1, 0, 1)
   circle(0, -y-2, 2, :magenta)
   circle(-x + r, -y + r, r, :blue)
   plot!([-x, x, -x, -x], [y, -y, -y, y], color=:black, lw=0.5)
   if more == true
       point(-x, y, "A  ", :black, :right)
       point(x, -y, " B", :black)
       point(-x, -y, "C  ", :black, :right)
       point(1 - R, 0, "1-R", :red, :top)
       point(0, 2 - R, "2-R", :magenta)
       point(-x + r, -y + r, "(r-x,r-y)", :blue, :top)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

 

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

算額(その118)

2023年02月01日 | Julia

算額(その118)

一関市博物館 > 和算に挑戦 > 平成18年度出題問題(3) [上級問題]&解答例
文政13年(1830)刊『算法新書』より
https://www.city.ichinoseki.iwate.jp/museum/wasan/h18/hard.html

岩手県奥州市 玉崎神社 弘化5年(1848)
https://w.atwiki.jp/sangaku/pages/191.html

直角三角形の中に大中小の3つの円がある。大円,中円,小円の径をそれぞれ 18cm,16cm,9cm としたとき,勾(鉤)の長さを求めよ。

出題では円の直径であるが,小数点がつかないように2倍して半径を用いる。

図のように記号を定め,方程式を解く。
eq1 だけで y1=40 がわかるので,⊿ACD, ⊿AEF が相似(相似比 1:2)なので,答え 40+22=62 はすぐに導ける(一応 eq2 がそれに対応している)。もとの単位では 31cm である。eq2, eq3 は図を描くためにつけたし。

using SymPy

@syms x, y, y1::positive
eq1 = (9 - 16)^2 + (y1 - 16)^2 - (9 + 16)^2
eq2 = 18(y - y1) - 9(y - 18)
eq3 = x*y - 18(x + y + sqrt(x^2 + y^2))

res = solve([eq1, eq2, eq3], (x, y, y1))

   1-element Vector{Tuple{Sym, Sym, Sym}}:
    (792/13, 62, 40)

y = 62,もとの単位では 31cm

using Plots

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
 plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (x, y, y1) = res[1]
   plot([0, x, 0, 0], [0, 0, y, 0], color=:blue, lw=0.5)
   circle(9, y1, 9)
   circle(16, 16, 16, :blue)
   circle(18, 18, 18, :green)
   if more == true
       point(9, y1, " D:(9,y1)", :red, :left, :bottom)
       point(16, 16, "(16,16)", :blue)
       point(0, 18, "E ", :green, :right)
       point(18, 18, " F:(18,18)", :green)
       point(0, 0, "O ", :black, :right)
       point(0, y, "A ", :black, :right)
       point(0, y1, "C ", :black, :right)
       point(x, 0, " B", :black)
       #segment(0, y, x, 0)
       segment(0, y, 18, 18)
       segment(0, 18, 18, 18)
       segment(0, 40, 9, 40)
       hline!([0], color=:black, lw=0.5, ylims=(-5, 65))
       vline!([0], color=:black, lw=0.5, xlims=(-5, 65))
   else
       plot!(showaxis=false)
   end
end;

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

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

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