裏 RjpWiki

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

算額(その1076)

2024年06月18日 | Julia

算額(その1076)

九十九 江刺市 雨宝堂 現中善観音堂 文政10年(1827)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円9個,円弧4個

交わる 4 個の円弧と甲円 4 個,乙円 5 個がある。乙円の直径が 1 寸のとき,甲円の直径はいかほどか。

円弧を構成する円の半径と中心座標を R, (r2 + R, 0)
甲円の半径と中心座標を r1, (0, r2 + r1)
乙円の半径と中心座標を r2, (0, 0), (x2, y2); y2 = x2
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy

@syms R::positive, r1::positive, r2::positive, x2::positive, y2::positive
y2 = x2
eq1 = (r2 + R - x2)^2 + y2^2 - (R - r2)^2 |> expand
eq2 = (r2 + R)^2 + (r2 + r1)^2 - (R + r1)^2 |> expand
eq3 = (r2 + R)/2 - x2 |> expand
res = solve([eq1, eq2, eq3], (r1, R, x2))[1]

   (sqrt(2)*r2, r2*(2*sqrt(2) + 3), r2*(sqrt(2) + 2))

甲円の半径 r1 は乙円の半径 r2 の √2 倍である。
乙円の直径が 1 寸のとき,甲円の直径は 1.4142135623730951 寸である。

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r2 = 1/2
   (R, r1, x2) = (r2*(2*sqrt(2) + 3), sqrt(2)*r2, r2*(sqrt(2) + 2))
   @printf("乙円の直径が %g のとき,甲円の直径は %g である。\n", 2r2, 2r1)
   plot()
   circle(0, 0, r2, :blue)
   circle4(x2, x2, r2, :blue)
   circle42(0, r2 + r1, r1)
   circle42(0, r2 + R, R, :green)
   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(r2 + R, 0, "円弧:R,(r2 + R)", :green, :center, delta=-delta)
       point(r2, 0, " r2", :blue, :left, delta=-delta/2)
       point(r2 + r1, 0, "甲円:r1,(r2+r1,0)", :red, :left, :bottom, delta=delta)
       point(x2, x2, " 乙円:r2,(x2,y2)", :blue, :left, :vcenter)
   end
end;

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

算額(その1075)

2024年06月18日 | Julia

算額(その1075)

九十九 江刺市 雨宝堂 現中善観音堂 文政10年(1827)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円9個,正方形,斜線

正方形の中に 8 本の斜線と大円,中円,小円を容れる。中円と小円の直径の和が 1 寸のとき,大円の直径はいかほどか。

正方形の一辺の長さを 2a
大円の半径と中心座標を r1, (0,0)
中円の半径と中心座標を r2, (cx2, cy2)
小円の半径と中心座標を r3, (cx3, cy3)
とおき,逐次的に解を求める。

1. 大円の半径

最も単純には,大円の中心から斜線までの距離が r1 になるように r1 を求めればよい。
半径は r1 = √5a/5 である。

include("julia-source.txt")

using SymPy

@syms a::positive, r1::positive
eq0 = dist2(0, 0, 2a, a, a, a, r1)
solve(eq0, r1)[1] |> println

   sqrt(5)*a/5

図形を丁寧に描き,計算に必要ないくつかの交点の座標を求めておくと(図参照),大円の直径は線分 AC に等しく,その長さは sqrt((8a/5 - 4a/5)^2 + (4a/5 - 2a/5)^2) = 2√5a/5 である。

sqrt((8a/5 - 4a/5)^2 + (4a/5 - 2a/5)^2) |> println

   2*sqrt(5)*a/5

2. 中円の半径と中心座標

大円と中円は,⊿OAB,⊿OCD に内包されている。⊿OAB と ⊿OCD は相似で,相似比は OA:OC = 2:1 なので,中円の半径は大円の半径の 1/2 で,r2 = r1/2 = √5a/10 である。

@syms r2::positive, cx2::positive, cy2::positive
r1 = √Sym(5)a/5
r2 = r1/2

   sqrt(5)*a/10

中円の中心座標 (cx2, cy2) は,2 本の斜線までの距離が r2 に等しいという連立方程式を解けばよい。

eq1 = dist2(0, 0, a, 2a, cx2, cy2, r2)
eq2 = dist2(0, 0, 2a, a, cx2, cy2, r2)
res1 = solve([eq1, eq2], (cx2, cy2))[1]

   (a/2, a/2)

中円の中心座標は (a/2, a/2) である。

3. 小円の半径と中心座標

中円と小円は,⊿OEF, ⊿HEG に内包されている。⊿OEF, ⊿HEG は相似で,相似比は OF:HG = a:2a/3 = 3:2 なので,小円の半径は中円の半径の 2/3 で,r3 = √5a/15 である。

小円の中心座標 (cx3, cy3) は,中心から線分 GH,GE までの距離が r3 に等しいという連立方程式を解けばよい。

@syms r3::positive, cx3::positive, cy3::positive
r3 = √Sym(5)a/15
eq3 = dist2(0, a, 2a, 2a, cx3, cy3, r3)
eq4 = dist2(0, a, 2a, 0, cx3, cy3, r3)
res2 = solve([eq3, eq4], (cx3, cy3))[1]

   (a/3, a)

小円の中心座標は (a/3, a) である。

4. 小円の半径が与えられたときの大円の半径

これまでをまとめると,小円,中円,大円の半径は √5a/15, √5a/10, √5*a/5 である。

r3, r2, r1

   (sqrt(5)*a/15, sqrt(5)*a/10, sqrt(5)*a/5)

「問」は「中円と小円の直径の和が 1 寸のとき,大円の直径はいかほどか」なので,以下の方程式を解き a を求め,r1 の式に代入すれば大円の半径が求まる。

eq = r2 + r3 - 1//2
solve(eq, a)[1] |> println

   3*sqrt(5)/5

r1(a => 3√Sym(5)/5) |> println

   3/5

大円の半径は 3/5 寸,すなわち,直径は 6/5 = 1.2 寸である。

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   a = 1
   r1 = sqrt(5)*a/5  # = sqrt((x1 - 2a + y1)^2 + (y1 - x1)^2)/2
   r2 = r1/2
   r3 = 2r2/3
   plot([0, 2a, 2a, 0, 0], [0, 0, 2a, 2a, 0], color=:green, lw=0.5)
   plot!([0, 2a, 0, a, 2a, 0, 2a, a, 0], [0, a, 2a, 0, 2a, a, 0, 2a, 0], color=:blue, lw=0.5)
   circle(a, a, r1, :red, lw=1)
   circle(a/2, a/2, r2, :orange)
   circle(a/3, a, r3, :green)
   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, "O:(0,0)", :black, :left, delta=-delta/2)
       point(8a/5, 4a/5, " A:(8a/5,4a/5)", :black, :left, delta=-delta/2)
       point(a, 2a, " B:(a,2a)", :black, :center, :bottom, delta=delta/2)
       point(4a/5, 2a/5, " C:(4a/5,2a/5)", :black, :left, delta=-delta/2)
       point(a/2, a, " D:(a/2,a)", :black, :left, :vcenter)
       point(2a/5, 4a/5, "E:(2a/5,4a/5) ", :black, :right, :vcenter)
       point(a, a/2, "  F:(a,a/2)", :black, :left, :vcenter)
       point(0, a, "G:(0,a) ", :black, :right, :vcenter)
       point(2a/3, 4a/3, "H:(2a/3,4a/3) ", :black, :right, :vcenter)
       plot!([a/2, 0, 8a/5, a, a/2, 4a/5], [a, 0, 4a/5, 2a, a, 2a/5], color=:blue, lw=1.5)
       plot!([0, 2a/3,0, a, 0], [0, 4a/3, a, a/2, 0], color=:magenta, lw=1)
       plot!(xlims=(-12delta, 2a + 3delta), ylims=(-5delta, 2a + 3delta))
   end
end;

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

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

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