算額あれこれ

算額問題をコンピュータで解きます

算額(その1322)

一七 埼玉県大里郡岡部村岡 稲荷社 文化13年(1816)

埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.
キーワード:円5個,斜線
#Julia #SymPy #算額 #和算 #数学


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

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

大円と小円の直径の差を \(K\)
大円の半径と中心座標を \(r_1, (x_1, r_1), (0, y_1)\)
中円の半径と中心座標を \(r_2, (0, r_2)\)
小円の半径と中心座標を \(r_3, (0, y_1 - r_1 - r_3)\)
とおき,以下の連立方程式を解く。

include("julia-source.txt");  # 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;

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)


以下のアイコンをクリックして応援してください