裏 RjpWiki

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

算額(その1322)

2024年09月29日 | Julia

算額(その1322)

一七 大里郡岡部村岡 稲荷社 文化13年(1816)
埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.
キーワード:円5個,斜線2本
#Julia, #SymPy, #算額, #和算

直線上に,2 本の接線を共有する大円 3 個,中円 1 個,小円 1 個を描く。大円と小円の直径の差が 2 寸のとき,中円の直径はいかほどか。

上の図は,大円と小円の直径の差が 5 寸のときのものである。問題の通り大円と小円の直径の差が 2 寸のときのものは下の方に示すが,似ても似つかない図になる。

大円と小円の直径の差を K
大円の半径と中心座標を r1, (x1, r1), (0, y1)
中円の半径と中心座標を r2, (0, r2)
小円の半径と中心座標を r3, (0, y1 - r1 - r3)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms r1::positive, x1::positive, y1::positive,
     r2::positive, r3::positive, a::positive,
     K::positive;
eq1 = dist2(-a, 0, 0, r1, x1, r1, r1)
eq2 = dist2(-a, 0, 0, r1, 0, y1, r1)
eq3 = dist2(-a, 0, 0, r1, 0, r2, r2)
eq4 = dist2(-a, 0, 0, r1, 0, y1 - r1 - r3, r3)
eq5 = r2*(a + x1) - r1*a  # r2/a - r1/(a + x1)
eq6 = (2r1 - 2r3) - K;

using NLsolve

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

function H(u)
   (r1, x1, y1, r2, r3, a) = u
   return [
       r1^2*(-a^2 - r1^2 + x1^2),  # eq1
       -2*a^2*r1*y1 + a^2*y1^2 - r1^4,  # eq2
       r1*(a^2*r1 - 2*a^2*r2 - r1*r2^2),  # eq3
       4*a^2*r1^2 + 4*a^2*r1*r3 - 4*a^2*r1*y1 - 2*a^2*r3*y1 + a^2*y1^2 - r1^2*r3^2,  # eq4
       -a*r1 + r2*(a + x1),  # eq5
       -K + 2*r1 - 2*r3,  # eq6
   ]
end;
K = 2.0
iniv = BigFloat[1.5, 6.3, 3.1, 0.75, 0.023, 6.1]
#iniv = BigFloat[3, 4.3, 7.2, 1.25, 0.5, 3.1]  # K = 5 のときの初期値
res = nls(H, ini=iniv)

   ([1.0034409020547763, 8.597223980953418, 2.0137872878330065, 0.5, 0.003440902054776372, 8.538463944689585], true)

大円と小円円の直径の差が 2 寸のとき,中円の直径は 1 寸である。

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

   K = 2;  r1 = 1.00296;  x1 = 9.25092;  y1 = 2.01188;  r2 = 0.5;  r3 = 0.00296477;  a = 9.19639

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

draw(2, false)

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

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

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