裏 RjpWiki

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

算額(その1301)

2024年09月20日 | Julia

算額(その1301)

百八 群馬県邑楽郡板倉町板倉 雷電神社 慶応3年(1867)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円2個,直角三角形,正方形

直角三角形の中に正方形と中鈎(直角の頂点から斜辺への垂線)を入れる。区画された領域に,甲円と乙円を 1 つずつ容れる。甲円と乙円の直径がそれぞれ 8 寸,15 寸のとき,正方形の一辺の長さはいかほどか。

正方形の一辺の長さを a とする。
直角三角形の鈎と股(直角を挟む 2 辺のうちの短い方と長い方)を,「鈎」,「股」とする。
股は問題を解く上では必要ないが,図を描くために求める。

また,図に示すように,正方形と中鈎の延長線を補助線として,交点座標を (股 - a, a + x)
甲円と乙円を含む直角三角形は相似で,相似比が a:(鈎 - a) である。
甲円の半径と中心座標を r1, (股 - r1, a + r1)
乙円の半径と中心座標を r2, (股 - a + r2, r2)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms a::positive, x::positive,
     鈎::positive, 股::positive,
     r1::positive, r2::positive;
eq1 = a/(鈎 - a) - (a + x)/a
eq2 = (鈎 - a) + a - sqrt((鈎 - a)^2 + a^2) - 2r1
eq3 = a + (a + x) - sqrt(a^2 + ( a + x)^2) - 2r2
eq4 = (鈎 - a)/a - 鈎/股;

SymPy の能力的に,一度には解けないので逐次的に解いていく。

まず,eq1, eq2 を連立させて,鈎,股を求める。

res = solve([eq1, eq4], (鈎, 股))[1]

   (a*(2*a + x)/(a + x), 2*a + x)

鈎,股を eq2 に代入し,x を求める。

eq12 = eq2(鈎 => res[1], 股 => res[2]) |> simplify |> numerator |> expand
ans_x = solve(eq12, x)[1]
ans_x |> println

   a*(a^2 - 4*a*r1 + 2*r1^2)/(2*r1*(a - r1))

鈎,股,x を eq3 に代入し,a を求める。

eq13 = eq3(鈎 => res[1], 股 => res[2], x => ans_x)
ans_a = solve(eq13, a)[3]  # 3 of 3
ans_a |> println

   r1 + r2 + sqrt(r1^2 + r2^2)

正方形の一辺の長さは,r1 + r2 + sqrt(r1^2 + r2^2) である。
甲円と乙円の直径がそれぞれ 8 寸,15 寸のとき,正方形の一辺の長さは 20 寸である。

ans_a(r1 => 8/2, r2 => 15/2).evalf() |> println

   20.0000000000000

a が求まれば x が決まり,更に鈎,股も決まる。
a = r1 + r2 + sqrt(r1^2 + r2^2)
x = a*(a^2 - 4a*r1 + 2r1^2)/(2r1*(a - r1))
鈎 = a*(2a + x)/(a + x)
股 = 2a + x

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

   r1 = 4;  r2 = 7.5;  a = 20;  x = 17.5;  鈎 = 30.6667;  股 = 57.5

function draw(r1, r2, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   a = r1 + r2 + sqrt(r1^2 + r2^2)
   x = a*(a^2 - 4a*r1 + 2r1^2)/(2r1*(a - r1))
   鈎 = a*(2a + x)/(a + x)
   股 = 2a + x
   @printf("甲円と乙円の直径がそれぞれ %g 寸,%g 寸のとき,正方形の一辺の長さは %g 寸である。\n", 2r1, 2r2,a)
   @printf("r1 = %g;  r2 = %g;  a = %g;  x = %g;  鈎 = %g;  股 = %g\n", r1, r2, a, x, 鈎, 股)
   plot([0, 股, 股, 0], [0, 0, 鈎, 0], color=:green, lw=0.5)
   rect(股 - a, 0, 股, a, :red)
   circle(股 - r1, a + r1, r1, :blue)
   circle(股 - a + r2, r2, r2, :magenta)
   segment(股 - a, a + x, 股, 0)
   segment(股 - a, a + x, 股 - a, a)
   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(股, 鈎, "(股,鈎) ", :green, :right, :bottom, delta=delta/2)
       point(股 - a, 0, "股-a ", :red, :right, :bottom, delta=delta)
       point(股 - a, a + x, "(股-a,a+x) ", :black, :right, delta=-delta/2)
       point(股 - r1, a + r1, "甲円:r1\n(股-r1,a+r1)", :black, :center, :bottom, delta=delta/2, deltax=4delta)
       point(股 - a + r2, r2, "乙円:r2\n(股-a+r2,r2)", :magenta, :center, delta=-delta/2)
       xlims!(-2delta, 股 + 5delta)
   end
end;

draw(8/2, 15/2, true)


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 算額(その1300) | トップ | 算額(その1302) »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

Julia」カテゴリの最新記事