裏 RjpWiki

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

算額(その1250)

2024年08月29日 | Julia

算額(その1250)

七十四 群馬県甘楽郡妙義町菅原 菅原神社 嘉永4年(1851)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円2個,正方形3個

2 個の円が交わっており,区画された領域に正方形 3 個を容れる。円の直径が与えられたとき,正方形の一辺の長さを求めよ。

算額(その429)から小円を除いた問題である。小円の有無は円と正方形の大きさには無関係である。

正方形の一辺の長さを 2a
円の半径と中心座標を r1, (x1, 0), (-x1, 0)
として,以下の連立方程式を解く。
コメントアウトしたのは算額(その429)でのもの。

include("julia-source.txt");

using SymPy
@syms r1::positive, x1::positive, r2::positive,
     a::positive;

# eq1 = x1^2 + (a + r2)^2 - (r1 - r2)^2
eq2 = a^2 + (x1 + a)^2 - r1^2
eq3 = (r1 - 2x1 + 2a)^2 + a^2 - r1^2
# res = solve([eq1, eq2, eq3], (r2, x1, a))
res = solve([eq2, eq3], (x1, a))[1]

   ((-919*r1^3*(-4/25 + 6*sqrt(6)/25)^2 - 1700*r1^3*(-4/25 + 6*sqrt(6)/25)^3 + 180*r1^3 + 484*r1^3*(-4/25 + 6*sqrt(6)/25))/(180*r1^2), r1*(-4/25 + 6*sqrt(6)/25))

x1, a は簡約化できる。

res[1] |> simplify |> println

   r1*(2*sqrt(6) + 7)/25

res[2] |> simplify |> println

   2*r1*(-2 + 3*sqrt(6))/25

正方形の一辺の長さ 2a は 円の直径 2r1 の 2(3√6 - 2)/25 倍である。
円の直径が 6.17 のとき,正方形の一辺の長さは 2.64000441111333 である。

6.17*2(3√6 - 2)/25

   2.64000441111333

function draw(r1, more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   x1 = r1*(2√6 + 7)/25
   a  = 2r1*(3√6 - 2)/25
   @printf("円の直径が %g のとき,正方形の一辺の長さは %g である。\n", 2r1, 2a)
   @printf("x1 = %.15g;  a = %.15g\n", x1, a)
   plot()
   circle(x1, 0, r1, :red)
   circle(-x1, 0, r1, :red)
   rect(-a, -a, a, a, :blue)
   # # circle(0, a + r2, r2, :green)
   rect(r1 - x1, -a, r1 - x1 + 2a, a, :blue)
   rect(-r1 + x1, -a, -r1 + x1 - 2a, a, :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(r1 - x1, 0, " r1-x1", :red, :left, delta=-delta)
       point(x1 - r1, 0, "x1-r1", :red, :right, delta=-delta)
       point(x1, 0, "x1 ", :red, :right, :bottom, delta=delta/2)
       point(-a, a, " (-a,a)", :blue, :left, delta=-delta/2)
       point(r1 - x1 + 2a, a, "(r1-x1+2a,a) ", :blue, :right, delta=-delta/2)
       # # point(0, a + r2, " a+r2", :green)
   end
end;

draw(6.17/2, true)

 

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

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

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