裏 RjpWiki

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

算額(その1160)

2024年07月21日 | Julia

算額(その1160)

九八 鴻巣市三ツ木山王 三木神社 明治28年(1895)
埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.
キーワード:円4個,半円1個,斜線2本

半円の中に 2 本の斜線を引き,甲円,乙円,丙円を容れる。丙円の直径が 1 寸のとき,乙円の直径はいかほどか。

半円の半径と中心座標を R, (0, 0); R = 2r1
甲円の半径と中心座標を r1, (0, r1)
乙円の半径と中心座標を r2, (x2, r2); r2 = r1/2
丙円の半径と中心座標を r3, (0, R - r3)
半円の端点から乙円への接線と半円の交点座標を (x0, sqrt(R^2 - x0^2))
とおき,以下の連立方程式を解くが,いくつかのパラメータは簡単な関係式を満たす。
「問」は丙円の直径が既知で,乙円の直径を求めよとなっているが,図を描く手順は以下のようにするのがよい。
まず甲円は外円の 1/2 倍,乙円の 2 倍である。半円の端点から乙円への接線を引き,この接線に接するように r3 を決める。
R = 2r1,r2 = r1/2,x2 = √2r1 なので(eq1, eq3 を解けば求まる),実質求めなければならないのは x0, r1 の 2 つである。

include("julia-source.txt")

using SymPy

@syms R::positive, r1::positive, r2::positive, x2::positive,
     r3::positive, y3::positive, x0::positive
R = 2r1
r2 = r1/2
x2 = √Sym(2)r1
eq1 = x2^2 + (r1 - r2)^2 - (r1 + r2)^2 |> expand
eq3 = 4R^2 - 16R*r2

eq4 = dist2(x0, sqrt(R^2 - x0^2), -R, 0, x2, r2, r2)
eq5 = dist2(x0, sqrt(R^2 - x0^2), -R, 0, 0, R - r3, r3);

二元連立方程式ではあるが,SymPy では解けないので,まず x0 に付いて解き,それをもう一方の式に代入して r1 を求める。

ans_x0 = solve(eq4, x0)[2]
ans_x0 = ans_x0 |> sympy.sqrtdenest |> simplify |> factor
ans_x0 |> println

   42*r1*(-35 + 384*sqrt(2))/12769

eq5 = eq5(x0 => ans_x0) |> simplify;
@syms d
ans_r1 = solve(eq5, r1)[1] |> apart |> factor
ans_r1 |> println

   8*r3*(1 + 2*sqrt(2))/21

ans_x0 = ans_x0(r1 => ans_r1) |> simplify
ans_x0 |> println

   16*r3*(314*sqrt(2) + 1501)/12769

乙円の半径は,甲円の半径の 1/2 である。

ans_r2 = ans_r1/2
ans_r2 |> println

   4*r3*(1 + 2*sqrt(2))/21

乙円の半径 r2 は,丙円の半径 r3 の (4 + 8√2)/21 倍である。
丙円の直径が 1 寸の解き,乙円の直径は 0.7292242142373696 寸である。

「術」,「答」では (√56 + 7)/21 = 0.6896816558832325 寸としているが,誤りであろう。それでは図を描けない(不適切な図になる)。

その他のパラメータは以下の通りである。

   R = 1.45845;  r1 = 0.729224;  r2 = 0.364612;  x0 = 1.21862;  x2 = 1.03128

function draw(r3, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   #(r1, r2, x0, x2) = res[1]
   r1 = 8*r3*(1 + 2*sqrt(2))/21
   x0 = 16*r3*(314*sqrt(2) + 1501)/12769
   R = 2r1
   r2 = r1/2
   x2 = √2r1
   R = 2r1
   @printf("R = %g;  r1 = %g;  r2 = %g;  x0 = %g;  x2 = %g\n", R, r1, r2, x0, x2)
   plot()
   circle(0, 0, R, beginangle=0, endangle=180)
   circle(0, r1, r1, :magenta)
   circle(0, R - r3, r3, :orange)
   circle2(x2, r2, r2, :blue)
   segment(-R, 0, x0, sqrt(R^2 - x0^2), :green)
   segment(R, 0, -x0, sqrt(R^2 - x0^2), :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, r1, "甲円:r1,(0,r1)", :magenta, :center, delta=-delta/2)
       point(x2, r2, "乙円:r2,(x2,r2)", :blue, :center, delta=-delta/2)
       point(0, R - r3, "丙円:r3,(0,R-r3)", :orange, :center, delta=-delta/2)
       point(x0, sqrt(R^2 - x0^2), "(x0,√(R^2-x0^2))", :green, :right, :bottom, delta=delta/2)
       point(R, 0, " R", :red, :left, :bottom, delta=delta/2)
       point(0, R, " R", :red, :left, :bottom, delta=delta/2)
   end
end;

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

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

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