以下の内容はhttps://sangaku0418.hatenablog.com/entry/2025/04/06/231632より取得しました。


算額(その1675)

長野県長野市若穂 清水寺観音堂 寛政6年(1794)

中村信弥「幻の算額」(P.204)
http://www.wasan.jp/maborosi/maborosi.html
キーワード:円2個,直角三角形,斜線
#Julia #SymPy #算額 #和算 #数学


直角三角形の中に斜線(矢)を描き,区画内に大円と小円を容れる。鈎と股の和が 42 寸,弦が 30 寸,大円の直径が 9 寸のとき,小円の直径はいかほどか。

直角三角形の 3 辺を「鈎」,「股」,「弦」とし,「中鈎」,「和」もそのまま変数とする。
大円の半径と中心座標を \(r_1, (r_1, y_1)\)
小円の半径と中心座標を \(r_2, (x_2, r_2)\)
斜線と斜辺(弦)の交点座標を \( (x_0, y_0)\)
とおき,以下の連立方程式を解く。

eq1 は「隔斜 \(n\) 円径の定理」である。

include("julia-source.txt");  # julia-source.txt ソース

using SymPy

@syms 鈎, 股, 弦, r1, r2, R, 中鈎, 和
R = (鈎 + 股 - sqrt(鈎^2 - 股^2))/2
R = (和 - 弦)/2  # 鈎 + 股 = 和
中鈎 = (和^2 - 弦^2)/(2*弦)
eq1 = (1 - 2R/中鈎) - (1 - 2r1/中鈎)*(1 - 2r2/中鈎);

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

    (2*r1*和^2 - 2*r1*弦^2 - 和^3 + 和^2*弦 + 和*弦^2 - 弦^3)/(2*(4*r1*弦 - 和^2 + 弦^2))

ans_r2(和 => 42, 弦 => 30, r1 => 9/2) |> println

    4.00000000000000

小円の半径は 4 寸(直径は 8 寸)である。

算額の問への答えはここまでである。

以下では,図を描くためにパラメータを求める。

まず最初に,鈎,股を求める。

eq2 = 弦^2 - (鈎^2 + 股^2)
eq3 = 鈎 + 股 - 和;

res = solve([eq2, eq3], (鈎, 股))[2];

# 鈎
res[1] |> println

    和/2 - sqrt(-和^2 + 2*弦^2)/2

# 股
res[2]  |> println

    和/2 + sqrt(-和^2 + 2*弦^2)/2

次に,斜線と斜辺(弦)の交点座標 \( (x_0, y_0)\) と小円の中心の \(x\) 座標 \(x_2\) を求める。

@syms  x0::positive, y0::positive, y1::positive,
      x2::positive
eq4 = dist2(0, 0, x0, y0, r1, y1, r1)
eq5 = dist2(0, 0, x0, y0, x2, r2, r2)
eq6 = (鈎 - y0)/x0 - 鈎/股
eq7 = dist2(0, 鈎, 股, 0, x2, r2, r2);
res2 = solve([eq5, eq6, eq7], (x0, y0, x2))[1];

# x0
res2[1] |> println

    股*(-4*r2^3*股^2 - 4*r2^3*股*sqrt(股^2 + 鈎^2) - 4*r2^3*鈎^2 + 2*r2^2*股^2*鈎 + 2*r2^2*股*鈎*sqrt(股^2 + 鈎^2) + 4*r2^2*鈎^3 + 2*r2*股^2*鈎^2 - 股^2*鈎^3)/(鈎*(4*r2^2*股^2 + 4*r2^2*鈎^2 - 股^2*鈎^2))

# y0
res2[2] |> println

    2*r2*(2*r2^2*股^2 + 2*r2^2*股*sqrt(股^2 + 鈎^2) + 2*r2^2*鈎^2 + r2*股^2*鈎 - r2*股*鈎*sqrt(股^2 + 鈎^2) - 股^2*鈎^2)/(4*r2^2*股^2 + 4*r2^2*鈎^2 - 股^2*鈎^2)

# x2
res2[3] |> println

    (-r2*sqrt(股^2 + 鈎^2) - 股*(r2 - 鈎))/鈎

最後に 大円の中心の \(y\) 座標 \(y_1\) を求める。

eq8 = dist2(0, 鈎, 股, 0, r1, y1, r1)
ans_y1 = solve(eq8, y1)[1];

# y1
ans_y1 |> println

    (-r1*sqrt(股^2 + 鈎^2) - 鈎*(r1 - 股))/股

描画関数プログラムのソースを見る

function draw(和, 弦, r1, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    R = (和 - 弦)/2  # 鈎 + 股 = 和
    中鈎 = (和^2 - 弦^2)/(2*弦)
    r2 = (2*r1*和^2 - 2*r1*弦^2 - 和^3 + 和^2*弦 + 和*弦^2 - 弦^3)/(2*(4*r1*弦 - 和^2 + 弦^2))
    (鈎, 股) = (和/2 - sqrt(-和^2 + 2*弦^2)/2, 和/2 + sqrt(-和^2 + 2*弦^2)/2)
    (x0, y0, x2) = (股*(-4*r2^3*股^2 - 4*r2^3*股*sqrt(股^2 + 鈎^2) - 4*r2^3*鈎^2 + 2*r2^2*股^2*鈎 + 2*r2^2*股*鈎*sqrt(股^2 + 鈎^2) + 4*r2^2*鈎^3 + 2*r2*股^2*鈎^2 - 股^2*鈎^3)/(鈎*(4*r2^2*股^2 + 4*r2^2*鈎^2 - 股^2*鈎^2)), 2*r2*(2*r2^2*股^2 + 2*r2^2*股*sqrt(股^2 + 鈎^2) + 2*r2^2*鈎^2 + r2*股^2*鈎 - r2*股*鈎*sqrt(股^2 + 鈎^2) - 股^2*鈎^2)/(4*r2^2*股^2 + 4*r2^2*鈎^2 - 股^2*鈎^2), (-r2*sqrt(股^2 + 鈎^2) - 股*(r2 - 鈎))/鈎)
    (x0, y0, y1) = (2*r1*(2*r1^2*股^2 + 2*r1^2*鈎^2 + 2*r1^2*鈎*sqrt(股^2 + 鈎^2) + r1*股*鈎^2 - r1*股*鈎*sqrt(股^2 + 鈎^2) - 股^2*鈎^2)/(4*r1^2*股^2 + 4*r1^2*鈎^2 - 股^2*鈎^2), 鈎*(-4*r1^3*股^2 - 4*r1^3*鈎^2 - 4*r1^3*鈎*sqrt(股^2 + 鈎^2) + 4*r1^2*股^3 + 2*r1^2*股*鈎^2 + 2*r1^2*股*鈎*sqrt(股^2 + 鈎^2) + 2*r1*股^2*鈎^2 - 股^3*鈎^2)/(股*(4*r1^2*股^2 + 4*r1^2*鈎^2 - 股^2*鈎^2)), (-r1*sqrt(股^2 + 鈎^2) - 鈎*(r1 - 股))/股)
    y1 = (-r1*sqrt(股^2 + 鈎^2) - 鈎*(r1 - 股))/股
    @printf("和 = %g;  弦 = %g;  大円の直径 = %g;  内接円の直径 = %g;  中鈎 = %g;  小円の直径 = %g\n",  和, 弦, 2r1, 2R, 中鈎, 2r2)
    @printf("鈎 = %g;  股 = %g;  x0 = %g;  y0 = %g;  y1 = %g;  x2 = %g\n", 鈎, 股, x0, y0, y1, x2)
    plot([0, 股, 0, 0], [0, 0, 鈎, 0], color=:green, lw=0.5)
    circle(r1, y1, r1)
    circle(x2, r2, r2, :blue)
    segment(0, 0, x0, y0, :magenta) 
    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, y1, "大円:r1,(r1,y1)", :red, :center, delta=-delta/2)
        point(x2, r2, "小円:r2,(x2,r2)", :blue, :center, delta=-delta/2)
        point(x0, y0, "(x0,y0)", :magenta, :left, :bottom, delta=delta/2)
        point(0, 鈎, " 鈎", :green, :left, :bottom, delta=delta/2)
        point(股, 0, " 股", :green, :left, :bottom, delta=delta/2)
    end

end;

draw(42, 30, 9/2, true)


以下のアイコンをクリックして応援してください




以上の内容はhttps://sangaku0418.hatenablog.com/entry/2025/04/06/231632より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14