裏 RjpWiki

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

算額(その2055)

2024年08月30日 | Julia

算額(その2055)

百十 群馬県高崎市山名町 八幡宮 慶応3年(1867)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円2個,弦,矢

大小 2 個の円が交差している。共通弦が 8 寸,大円,小円の直径の和が 21.6 寸,大円,小円の矢の和が 3.6 寸のとき,大円の直径はいかほどか。

共通弦を「弦」,直径の和を「径和」,矢の和を「矢和」
大円の半径と中心座標を r1, (0, 0)
小円の半径と中心座標を r2, (0, r1 + r2 - 矢和)
大円と小円の交点座標を (x, y)
とおき,以下の連立方程式を解く。
ただし,一度に解くと SymPy では簡約化できないほど複雑な式になるので,逐次解いていく。

include("julia-source.txt");

using SymPy
@syms x::positive, y::positive,
     r1::positive, r2::positive,
     弦::positive, 径和::positive, 矢和::positive;
x = 弦/2
eq1 = x^2 + y^2 - r1^2
eq2 = x^2 + (y - (r1 + r2 - 矢和))^2 - r2^2
eq3 = r1 + r2 - 径和/2;

まず,eq1 から y,eq3 から r2 を求め,eq2 に代入し eq12 を作る。

ans_y = solve(eq1, y)[1];
ans_y |> println

   sqrt(4*r1^2 - 弦^2)/2

ans_r2 = solve(eq3, r2)[1]
ans_r2 |> println

   -r1 + 径和/2

eq12 = eq2(y => ans_y, r2 => ans_r2);

eq12 を解いて r1 を求める。

弦 = 8, 径和 = 21.6, 矢和 = 3.6 のとき,r1 = 5.8 である。

ans_r1 = solve(eq12, r1)[2]
ans_r1 |> println
ans_r1(弦 => 8, 径和 => 21.6, 矢和 => 3.6) |> println

   (径和*sqrt(矢和)*(径和 - 矢和) + sqrt(-(径和 - 矢和)*(弦^2 - 径和*矢和 + 矢和^2))*(径和 - 2*矢和))/(4*sqrt(矢和)*(径和 - 矢和))
   5.80000000000000

y, r2 は既知の値を代入すれば,求まる。

ans_y |> println
ans_y(弦 => 8, r1 => ans_r1(弦 => 8, 径和 => 21.6, 矢和 => 3.6).evalf()) |> println

   sqrt(4*r1^2 - 弦^2)/2
   4.20000000000000

ans_r2 |> println
ans_r2(径和 => 21.6, r1 => ans_r1(弦 => 8, 径和 => 21.6, 矢和 => 3.6).evalf()) |> println

   -r1 + 径和/2
   5.00000000000000

function draw(弦, 径和, 矢和, more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r1 = (径和*sqrt(矢和)*(径和 - 矢和) + sqrt(-(径和 - 矢和)*(弦^2 - 径和*矢和 + 矢和^2))*(径和 - 2*矢和))/(4*sqrt(矢和)*(径和 - 矢和))
   y = sqrt(4*r1^2 - 弦^2)/2
   r2 = -r1 + 径和/2
   x = 弦/2
   plot()
   circle(0, 0, r1)
   circle(0, r1 + r2 - 矢和, r2, :blue)
   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, 0, "大円:r1,(0,0)", :red, :center, delta=-delta/2)
       point(0, r1 + r2 - 矢和, "小円:r1,(0,r1+r2-矢和)", :blue, :center, delta=-delta/2)
       point(x, y, " (x,y)", :green, :left, :vcenter)
       dimension_line(-x, y, x, y, "弦", delta=-2delta, deltax = -3delta)
       dimension_line(0, r1, 0, r1 - 矢和, "矢和", :green, delta=3delta, deltax = 3delta)
       point(0, r1, " r1", :red, :left, :bottom, delta=delta/2)
       point(0, r1 - 矢和, " r1-矢和", :blue, :left, delta=-delta/2)
   end
end;

draw(8, 21.6, 3.6, true)

 


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

コメントを投稿

Julia」カテゴリの最新記事