裏 RjpWiki

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

算額(その1140)

2024年07月12日 | Julia

算額(その1140)

二五 武州妻沼 聖天宮 文政11年(1828)
埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.
キーワード:円3個,半円,斜線2本

半円の中に二等辺三角形になるように 2 本の斜線を引き,大円,中円,小円の 3 個を容れる。大円の直径が 5 寸のとき,中円の直径はいかほどか。

半円の半径と中心座標を R, (0, 0)
大円の半径と中心座標を r1, (x1, r1)
中円の半径と中心座標を r2, (x2, r2)
小円の半径と中心座標を r3, (x3, r3)
とおき以下の連立方程式を解く。

SymPy の性能上,一挙に連立方程式を解けないので,まず中円のパラメータを求める。

ただし,複数の条件式を使える場合,どの条件を用いれば適切な解が得られるか適切に選択する必要がある。

include("julia-source.txt")

using SymPy

@syms R::positive, r1::positive, x1::positive,
     r2::positive, x2::negative, r3::positive, x3::positive
tand45by2 = √Sym(Sym(2)) - 1  # tand(Sym(45)//2)
# tand45by2 = √2 - 1  # tand(Sym(45)//2)
eq1 = (x1 - x2)^2 + (r1 - r2)^2 - (r1 + r2)^2 |> expand
eq2 = x1^2 + r1^2 - (R - r1)^2 |> expand
# eq3 = r1/(x1 + R) - tand45by2
eq3 = dist2(-R, 0, 0, R, x1, r1, r1)
# eq4 = r2 - tand45by2*(x2 + R)
eq4 = r2 - (r1/(x1 + R))*(x2 + R)
# eq4 = dist2(-R, 0, 0, R, x2, r2, r2)
##
eq5 = (x3 - x1)^2 + (r1 - r3)^2 - (r1 + r3)^2 |> expand
eq6 = r3 - (R - x3)*tand45by2;
# eq6 = dist2(R, 0, 0, R, x3, r3, r3)

res1 = solve([eq1, eq2, eq3, eq4], (R, x1, r2, x2))[1]

   (r1*(4 + 3*sqrt(2))/4, sqrt(2)*r1/4, r1*(-4*sqrt(2) - 4*sqrt(2 - sqrt(2)) + 2*sqrt(4 - 2*sqrt(2)) + 7), r1*(-8*sqrt(4 - 2*sqrt(2)) - 8 + 9*sqrt(2))/4)

res1[1](r1 => 5/2).evalf() |> println
res1[2](r1 => 5/2).evalf() |> println
res1[3](r1 => 5/2).evalf() |> println
res1[4](r1 => 5/2).evalf() |> println

   5.15165042944955
   0.883883476483184
   1.11615673042922
   -2.45700971311331

中円の半径 r2 は,大円の半径 r1 の,(-4*sqrt(2) - 4*sqrt(2 - sqrt(2)) + 2*sqrt(4 - 2*sqrt(2)) + 7) = 0.4464626921716892 倍である。
大円の直径が 5 寸のとき,中円の直径は 5*0.4464626921716892 = 2.232313460858446 寸である。

「術」は,この倍数 0.4464626921716892 を以下のように求めている。

天 = 7 - √32
天 - sqrt(天^2 - 1)

   0.44646269217168977

この式を展開すると以下のようになる。

(7 - √32) - sqrt((7 - √32)^2 - 1)

   0.44646269217168977

求めた式と違う項は

- sqrt((7 - √Sym(32))^2 - 1) |> sympy.sqrtdenest |> simplify |> println

   -2*sqrt(20 - 14*sqrt(2))

2*sqrt(4 - 2*sqrt(Sym(2))) - 4*sqrt(2 - sqrt(Sym(2))) |> println

   -4*sqrt(2 - sqrt(2)) + 2*sqrt(4 - 2*sqrt(2))

であるが,後者を simplify すると

2*sqrt(4 - 2*sqrt(Sym(2))) - 4*sqrt(2 - sqrt(Sym(2))) |> simplify |> println

   -2*(2 - sqrt(2))^(3/2)

さらに (2 - √2)^3 を expand すると 20 - 14√2 になり,一致する。

(2 - √Sym(2))^3 |> expand |> println

   20 - 14*sqrt(2)

算額の「問」に答えるためにはここまででよいが,図を描くために,小円のパラメータを求める。

eq5 = eq5(R => res1[1], x1 => res1[2])
eq6 = eq6(R => res1[1], x1 => res1[2]);

res2 = solve([eq5, eq6], (r3, x3))[1]

   (sqrt(2)*r1/4 + r1/2 + (1 - sqrt(2))*(r1*(8 - 7*sqrt(2))/4 + sqrt(6)*r1*sqrt(2 - sqrt(2))), r1*(8 - 7*sqrt(2))/4 + sqrt(6)*r1*sqrt(2 - sqrt(2)))

res2[1](r1 => 5/2).evalf() |> println
res2[2](r1 => 5/2).evalf() |> println

   0.684255560080320
   3.49971137617445

r3 は若干簡約化できる。

res2[1] |> sympy.sqrtdenest |> simplify |> println

   r1*(-7*sqrt(2) - 4*sqrt(6 - 3*sqrt(2)) + 2*sqrt(12 - 6*sqrt(2)) + 12)/2

 全てのパラメータは以下の通りである。

   R = 5.15165; r1 = 2.5; x1 = 0.883883;  r2 = 1.11616;  x2 = -2.45701;  r3 = 0.684256;  x3 = 3.49971

function draw(r1, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (R, x1, r2, x2) = (r1*(4 + 3√2)/4, √2r1/4, r1*(-4√2 - 4*sqrt(2 - √2) + 2sqrt(4 - 2√2) + 7), r1*(-8sqrt(4 - 2√2) - 8 + 9√2)/4)
   (r3, x3) = (r1*(-7√2 - 4sqrt(6 - 3√2) + 2sqrt(12 - 6√2) + 12)/2, r1*(8 - 7√2)/4 + √6r1*sqrt(2 - √2))
   @printf("大円の直径が %g のとき,中円の直径は %g である。\n", 2r1, 2r2)
   @printf("R = %g; r1 = %g; x1 = %g;  r2 = %g;  x2 = %g;  r3 = %g;  x3 = %g\n", R, r1, x1, r2, x2, r3, x3)
   plot([-R, 0, R], [0, R, 0], color=:green, lw=0.5)
   circle(0, 0, R, beginangle=0, endangle=180)
   circle(x1, r1, r1, :blue)
   circle(x2, r2, r2, :magenta)
   circle(x3, r3, r3, :orange)
   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(x1, r1, "大円:r1,(x1,r1)", :blue, :center, delta=-delta/2)
       point(x2, r2, "中円:r2(x2,r2)", :magenta, :center, delta=-delta/2)
       point(x3, r3, "小円:r3\n(x3,r3)", :orange, :center, delta=-delta/2)
       point(0, R, "R", :red, :center, :bottom, delta=delta)
       point(R, 0, " R", :red, :left, :bottom, delta=delta/2)
   end
end;


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

コメントを投稿

Julia」カテゴリの最新記事