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


算額(その2119)

続神壁算法 〇一二 東都愛宕山 文化2年(1805)

南筑□藩 藤田貞資門人 筑州□府
筑州□府 新藤用助均和
キーワード:円5個,直線上,斜線
#Julia #SymPy #算額 #和算 #数学


上下二線に挟まれて甲円,乙円,丙円,丁円,戊円がある。丁円の直径が 7.29 寸,戊円の直径が 7.84 寸のとき,乙円の直径はいかほどか。

甲円の半径と中心座標を \(r_1,\ (x_1,\ r_1)\)
乙円の半径と中心座標を \(r_2,\ (x_2,\ y_2)\)
丙円の半径と中心座標を \(r_3,\ (x_3,\ r_3)\)
丁円の半径と中心座標を \(r_4,\ (x_4,\ r_4)\)
戊円の半径と中心座標を \(r_5,\ (x_5,\ r_5)\)
とおき,以下の連立方程式の数値解を求める。

include("julia-source.txt");  # julia-source.txt ソース
function driver(r4, r5)
    function H(u)
        function parameters()
            eq1 = (x1 - x2)^2 + (r1 - y2)^2 - (r1 + r2)^2
            eq2 = (x1 - x5)^2 + (r1 - r5)^2 - (r1 + r5)^2
            eq3 = (x2 - x3)^2 + (y2 - r3)^2 - (r2 + r3)^2
            eq4 = (x2 - x4)^2 + (y2 - r4)^2 - (r2 + r4)^2
            eq5 = (x2 - x5)^2 + (y2 - r5)^2 - (r2 + r5)^2
            eq6 = (x3 - x4)^2 + (r3 - r4)^2 - (r3 + r4)^2
            eq7 = (x4 - x5)^2 + (r4 - r5)^2 - (r4 + r5)^2
            eq8 = r3/x3 - r1/x1
            eq9 = (2√(r3*r4) + 2√(r4*r5) + 2√(r5*r1)) - (2√(r2*r3) + 2√(r1*r2))
            return [eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8, eq9]
        end;
        (r1, x1, r2, x2, y2, r3, x3, x4, x5) = u
        return parameters()
    end;
    iniv = BigFloat[12, 121, 6, 103, 13, 9, 89, 100, 107]
    res = nls(H, ini=iniv)
    res[2] || println("収束していない")
    return res[1]
end;
(r4, r5) = (7.29/2, 7.84/2)
res = driver(r4, r5)
@printf("丁円の直径が %g, 戊円の直径が %g のとき,乙円の直径は %g である。\n", 2r4, 2r5, 2res[3])

    丁円の直径が 7.29, 戊円の直径が 7.84 のとき,乙円の直径は 12.96 である。

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

function draw(r4, r5, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, showaxis=false, label="", fontfamily="IPAMincho")
    (r1, x1, r2, x2, y2, r3, x3, x4, x5) = driver(r4, r5)
    b = tand(2atand(r1/x1))
    plot()
    circle(x1, r1, r1)
    circle(x2, y2, r2, :blue)
    circle(x3, r3, r3, :green)
    circle(x4, r4, r4, :magenta)
    circle(x5, r5, r5, :orange)
    abline(0, 0, b, x3 - r3, x1 + r1)
    if more
        delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
        hline!([0], color=:black, lw=0.5)
        vline!([0], color=:gray80, lw=0.5)
        point(x1, r1, "甲円:r1,(x1,r1)", :red, :center, delta=-delta)
        point(x2, y2, "乙円:r2,(x2,y2)", :blue, :center, delta=-delta)
        point(x3, r3, "丙円:r3,(x3,r3)", :green, :center, delta=-delta)
        point(x4, r4, "丁円:r4\n(x4,r4)", :magenta, :center, delta=-delta)
        point(x5, r5, "戊円:r5\n(x5,r5)", :orange, :center, delta=-delta)
        xlims!(x3 - r3 - 3delta, x1 + r1 + 3delta)
    end 
end;
draw(7.29/2, 7.84/2, true)

 

「算額あれこれ」の全ページの索引


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

算額(その2118)

続神壁算法 〇七 豆州三島大明神社 寛政12年(1800)

丸山良玄門人 豆州築地邑 堤里右衛門柴命
キーワード:円6個,半円
#Julia #SymPy #算額 #和算 #数学


半円の中に天円,地円,人円,大円,中円,小円を容れる。天円の直径が 44.56 寸,地円の直径が 38.99 寸のとき,人円の直径はいかほどか。

半円の半径と中心座標を \(r_0,\ (0,\ 0)\)
天円の半径と中心座標を \(r_1,\ (x_1,\ y_1)\)
地円の半径と中心座標を \(r_2,\ (x_2,\ y_2)\)
人円の半径と中心座標を \(r_3,\ (x_3,\ y_3)\)
大円の半径と中心座標を \(r_4,\ (x_4,\ r_4)\)
中円の半径と中心座標を \(r_5,\ (x_5,\ r_5)\)
小円の半径と中心座標を \(r_6,\ (x_6,\ y_6)\)
とおき,以下の連立方程式の数値解を求める。

デカルトの円定理による場合

include("julia-source.txt");  # julia-source.txt ソース
function driver(r1, r2)
    function H(u)
        function parameters()
            (k0, k1, k2, k3, k4, k5, k6) = 1 ./ (r0, r1, r2, r3, r4, r5, r6)
            eq1 = k1 + k4 + k6 - 2sqrt(k1*k4 + k4*k6 + k6*k1) + k0
            eq2 = k2 + k5 + k6 - 2sqrt(k2*k5 + k5*k6 + k6*k2) + k0
            eq3 = k4 + k5 + k6 - 2sqrt(k4*k5 + k5*k6 + k6*k4) + k0
            eq4 = k4 + k5 + k6 + 2sqrt(k4*k5 + k5*k6 + k6*k4) - k3
            eq5 = (r4 + r5)*r0 + 2r4*r5 - 2r0*sqrt(2r4*r5)  # 算法助術#48
            return [eq1, eq2, eq3, eq4, eq5]
        end;
        (r0, r3, r4, r5, r6) = u
        return parameters()
    end;
    iniv = BigFloat[520/2, 23/2, 240/2, 190/2, 90/2]
    res = nls(H, ini=iniv)
    res[2] || println("収束していない")
    return res[1]
end;
(r1, r2) = (44.56/2, 38.99/2)
(r0, r3, r4, r5, r6) = driver(r1, r2)
(r0, r3, r4, r5, r6) |> println

    (259.71644202470225, 11.345001175890475, 118.58511438337192, 94.60682648793063, 43.207231202249226)

@printf("天円の直径が %g, 地円の直径が %g のとき,人円の直径は %.15g\n", 2r1, 2r2, 2r3)
@printf("外円,大円,中円,小円の直径は %.15g, %.15g, %.15g, %.15g\n", 2r0, 2r4, 2r5, 2r6)

    天円の直径が 44.56, 地円の直径が 38.99 のとき,人円の直径は 22.690002351781
    外円,大円,中円,小円の直径は 519.432884049404, 237.170228766744, 189.213652975861, 86.4144624044985

描画に必要なすべてのパラメータを求める場合

include("julia-source.txt");  # julia-source.txt ソース
function driver(r1, r2)
    function H(u)
        function parameters()
            eq1 = (x1 - x4)^2 + (y1 - r4)^2 - (r1 + r4)^2
            eq2 = (x1 - x6)^2 + (y1 - y6)^2 - (r1 + r6)^2
            eq3 = x1^2 + y1^2 - (r0 - r1)^2
            eq4 = (x2 - x5)^2 + (y2 - r5)^2 - (r2 + r5)^2
            eq5 = (x2 - x6)^2 + (y2 - y6)^2 - (r2 + r6)^2
            eq6 = x2^2 + y2^2 - (r0 - r2)^2
            eq7 = (x3 - x4)^2 + (y3 - r4)^2 - (r3 + r4)^2
            eq8 = (x3 - x5)^2 + (y3 - r5)^2 - (r3 + r5)^2
            eq9 = (x3 - x6)^2 + (y3 - y6)^2 - (r3 + r6)^2
            eq10 = (x4 - x5)^2 + (r4 - r5)^2 - (r4 + r5)^2
            eq11 = (x4 - x6)^2 + (r4 - y6)^2 - (r4 + r6)^2
            eq12 = x4^2 + r4^2 - (r0 - r4)^2
            eq13 = (x5 - x6)^2 + (r5 - y6)^2 - (r5 + r6)^2
            eq14 = x5^2 + r5^2 - (r0 - r5)^2
            eq15 = x6^2 + y6^2 - (r0 - r6)^2
            return [eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8,
                    eq9, eq10, eq11, eq12, eq13, eq14, eq15]
        end;
        (r0, x1, y1, x2, y2, r3, x3, y3, r4, x4, r5, x5, r6, x6, y6) = u
        return parameters()
    end;
    iniv = BigFloat[259.7, 0.906, 237.4, -120.6, 207.8,
                    11.35, -48.22, 154.9, 118.6, 76.52,
                    94.61, -135.3, 43.21, -57.0, 208.6]
    res = nls(H, ini=iniv)
    res[2] || println("収束していない")
    return res[1]
end;
(r1, r2) = (44.56/2, 38.99/2)
res = driver(r1, r2)
res |> println

    [259.71644202470225, 0.9062099853854731, 237.43471267869023, -120.59869796687508, 207.75537359385396, 11.345001175890475, -48.21918757849542, 154.9370275194559, 118.58511438337193, 76.52203792690791, 94.60682648793063, -135.3171590175582, 43.207231202249226, -57.90246937846614, 208.62296712212012]

@printf("天円の直径が %g, 地円の直径が %g のとき,人円の直径は %.15g\n", 2r1, 2r2, 2res[6])
@printf("外円,大円,中円,小円の直径は %.15g, %.15g, %.15g, %.15g\n", 2res[1], 2res[9], 2res[11], 2res[13])

    天円の直径が 44.56, 地円の直径が 38.99 のとき,人円の直径は 22.690002351781
    外円,大円,中円,小円の直径は 519.432884049404, 237.170228766744, 189.213652975861, 86.4144624044985

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

function draw(r1, r2, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, showaxis=false, label="", fontfamily="IPAMincho")
    (r0, x1, y1, x2, y2, r3, x3, y3, r4, x4, r5, x5, r6, x6, y6) = driver(r1, r2)
    plot()
    circle(0, 0, r0, :purple, beginangle=0, endangle=180)
    circle(x1, y1, r1)
    circle(x2, y2, r2, :green)
    circle(x3, y3, r3, :blue)
    circle(x4, r4, r4, :magenta)
    circle(x5, r5, r5, :brown)
    circle(x6, y6, r6, :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(0, 0, "半円:r0,(0,0)", :purple, :center, delta=-delta)
        point(x1, y1, "天円:r1,(x1,y1)", :red, :left, delta=-4delta, deltax=4delta)
        point(x2, y2, "地円:r2,(x2,y2)", :green, :right, :bottom, delta=6delta)
        point(x3, y3, "人円:r3,(x3,y3)", :blue, :left, :vcenter, deltax=4delta)
        point(x4, r4, "大円:r4,(x4,r4)", :magenta, :center, delta=-delta)
        point(x5, r5, "中円:r5,(x5,r5)", :brown, :center, delta=-delta)
        point(x6, y6, "小円:r6\n(x6,y6)", :orange, :center, delta=-delta)
    end 
end;
draw(44.56/2, 38.99/2, true)

 

「算額あれこれ」の全ページの索引


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

算額(その2117)

百三十三 群馬県高崎市山名町 八幡宮 明治18年(1885)

群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.

キーワード:円2個,扇
#Julia #SymPy #算額 #和算 #数学


扇の中に大円と小円を容れる。大円と親骨の接点が地紙の境目である。扇長が 6 寸のとき,小円の直径を最大にしたい。そのとき,大円の直径はいかほどか。

扇長と要の座標を \(R,\ (0,\ 0)\)
大円の半径と中心座標を \(r_1,\ (0,\ R - r_1)\)
小円の半径と中心座標を \(r_2,\ (0,\ R - 2r_1 + r2)\)
大円と親骨の接点が地紙との境目なので,要から地紙までの長さは \(\sqrt{(R - r_1)^2 - r_1^2}\) である。
小円の直径は \(\sqrt{(R - r_1)^2 - r_1^2} - (R - 2r_1)\) なので,eq1 を得る。

include("julia-source.txt");  # julia-source.txt ソース
using SymPy
@syms R, r1, r2
r2 = (sqrt( (R - r1)^2 - r1^2) - (R - 2r1))/2

    \(\displaystyle - \frac{R}{2} + r_{1} + \frac{\sqrt{- r_{1}^{2} + \left(R - r_{1}\right)^{2}}}{2}\)

\(r_1\) の変化に応じて \(r_2\) がどのように変化するか,グラフを描いてみる。

pyplot(size=(300, 150), grid=false, aspectratio=:none, showaxis=true, label="", fontfamily="IPAMincho")
plot(r2(R => 6), xlims=(0,3), xlabel="r1", ylabel="r2")

\(r_1\) が 2 〜 2.5 の間で,\(r_2\) が最大になる。
詳しく調べるには \(r_2\) の導関数 \(g(r_1)\) を求め,\(g(r_0) = 0\) となる \(r_0\) を求めればよい。

r0 = solve(diff(r2, r1), r1)[1]

    \(\displaystyle \frac{3 R}{8}\)

r0(R => 6)

    \(\displaystyle \frac{9}{4}\)

\(r_1 = 9/4 = 2.25\) のとき,すなわち大円の直径が 4.5 のとき,\(r_2\) は最大値を取る。

\(r_2(r_0)\) が最大値である。

r2(r1 => 3R/8)

    \(\displaystyle - \frac{R}{8} + \frac{\sqrt{R^{2}}}{4}\)

r2(r1 => 3R/8)(R => 6)

    \(\displaystyle \frac{3}{4}\)

\(R = 6\) のとき,\(r_2\) の最大値は 0.75,すなわち小円の直径は 1.5 で最大になる。

「算額あれこれ」の全ページの索引


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

算額(その2116)

八十一 群馬県前橋市下大屋町 産泰神社 安政3年(1856)

群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.

キーワード:楕円3個,直角三角形
#Julia #SymPy #算額 #和算 #数学


直角三角形の中に大小の楕円が互いに外接し合って入っている。直角三角形の底辺,高さと大小楕円の短径が分かっているとき,小楕円の長径はいかほどか。

直角三角形の直角の頂点を原点 \( (0,\ 0)\)
直角三角形の底辺,高さを \(w,\ h\)
大楕円の長半径,短半径と中心座標を \(a,\ b,\ (a,\ b)\)
小楕円の長半径,短半径と中心座標を \(p,\ q,\ (x,\ q)\)
2 つの楕円の接点座標を \( (x_0,\ y_0)\)
とおき,以下の連立方程式の数値解を求める。

include("julia-source.txt");  # julia-source.txt ソース
function driver(w, h, b, q)
    function H(u)
        function parameters()
            # 大楕円が斜辺に接する
            eq1 = (h*a + w*b - w*h)^2 - (h^2*a^2 + w^2*b^2)
            # 算法助術公式97
            # eq1 = b^2*(h - 2b)*( (h^2 + w^2) - h^2)^2 - w^2*(h - b)^2*(w^2*h - 2w^2*b - 4a^2*h)
            # 楕円の接点が楕円の周上にある
            eq2 = (x0 - a)^2/a^2 + (y0 - b)^2/b^2 - 1
            eq3 = (x0 - x)^2/p^2 + (y0 - q)^2/q^2 - 1
            # 接線の傾きが等しい
            eq4 = b^2*(x0 - a)/(a^2*(y0 - b)) -  q^2*(x0 - x)/(p^2*(y0 - q))
            # 小楕円が斜辺に接する
            eq5 = (h*x + w*q - w*h)^2 - (h^2*p^2 + w^2*q^2)
            return [eq1, eq2, eq3, eq4, eq5]
        end;
        (a, p, x, x0, y0) = u
        return parameters()
    end;
    iniv = BigFloat[1.55, 0.84, 3.61, 2.83, 0.48]
    res = nls(H, ini=iniv)
    res[2] || println("収束していない")
    return res[1]
end;
# driver(5, 4, 1.1, 0.35) |> println
# [1.5517241379310345, 0.841103880024696, 3.6144166771888675, 2.8335892148924313, 0.48010930531158175]

直角三角形の底辺,高さが 5,4,大小楕円の短径が 1.1,0.35 のとき,小楕円の長径は 0.841103880024696 である。

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

function draw(w, h, b, q, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, showaxis=false, label="", fontfamily="IPAMincho")
    (a, p, x, x0, y0) = driver(w, h, b, q)
    println( (a, p, x))
    plot([0, w, 0, 0], [0, 0, h, 0], color=:green, lw=0.5)
    ellipse(a, b, a, b, color=:red)
    ellipse(x, q, p, q, color=:blue)
    if more
        delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
        hline!([0], color=:black, lw=0.5)
        vline!([0], color=:gray80, lw=0.5)
        point(a, b, "大楕円:a,b,(a,b)", :red, :center, delta=-delta)
        point(x, q, "小楕円:p,q,(x,q)", :blue, :center, delta=-delta)
        point(x0, y0, "(x0,y0)", :green, :right, :bottom, delta=delta/2)
        point(0, h, " (0,h)", :green, :left, :vcenter)
        point(0, 0, "(0,0)", :green, :center, delta=-delta)
        point(w, 0, "(w,0)", :green, :center, delta=-delta)
    end
end;
draw(5, 4, 1.1, 0.35, true)

    (1.5517241379310345, 0.841103880024696, 3.6144166771888675)

 

「算額あれこれ」の全ページの索引


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

算額(その2115)

七十八 群馬県高崎市 中之嶽神社 安政3年(1856)
百五十 群馬県多野郡新町 諏訪神社 昭和53年(1978) 復元

群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.

和算の館
http://wasan.jp/gunma/suwa.html
キーワード:3次元,球3個,角錐台
#Julia #SymPy #算額 #和算 #数学


直線上に一辺の長さが \(a\) の正八角形を置く。直線上にある右側の頂点 C を中心として時計廻りに,もう一つの頂点 D が直線上にくるように正八角形を回転させる。最初に直線上にあった頂点 A は B の位置に移動する。これを繰り返し A の位置にあった頂点が再び直線上 A' に戻るまで繰り返す。頂点 A が移動した距離(赤い円弧の合計)を求める。

下図は,正五角形を転がした場合の様子

正 \(n\) 角形における一般式を求める。

一辺の長さが \(a\) の正 \(n\) 角形が転がるとき,頂点 \(A\) が移動する合計距離 \(L\) の一般式を導く。

1 回ごとの回転角は外角 \(\theta = \frac{2\pi}{n}\) である。

\(k\) 番目の頂点を中心に回転するときの半径 \(r_k\) は,正 \(n\) 角形の外接円の半径を \(R\) とすると,次のように表せる。

\(\displaystyle R = \displaystyle \frac{a}{2 \sin\left(\frac{\pi}{n}\right)}\)

\(\displaystyle r_k = \displaystyle 2R \sin\left(\frac{k\pi}{n}\right)\)

ここで,正 \(n\) 角形の一辺の長さは \(a = \displaystyle 2R \sin\left(\frac{\pi}{n}\right)\) なので,\(r_k = \displaystyle a \frac{\sin(\frac{k\pi}{n})}{\sin(\frac{\pi}{n})}\) である。

合計距離 \(L\) は,各ステップでの円弧の合計である。

\(\displaystyle L = \displaystyle \sum_{k=1}^{n-1} \left( r_k \cdot \frac{2\pi}{n} \right) = \frac{2\pi a}{n \sin(\frac{\pi}{n})} \sum_{k=1}^{n-1} \sin\left(\frac{k\pi}{n}\right)\)

三角関数の和の公式 \(\displaystyle \sum_{k=1}^{n-1} \sin\left(\frac{k\pi}{n}\right) = \cot\left(\frac{\pi}{2n}\right)\) を適用し,倍角の公式で整理すると,一般式が得られる。

正 \(n\) 角形の頂点の移動距離 \(L\) は以下のようになる。

\(\displaystyle L = \displaystyle \frac{\pi a}{n \sin^2\left(\frac{\pi}{2n}\right)}\)

正八角形 \(n=8\) の場合 \(L = 10.317831580762471\) である。

# a, n を与えて,L を求める関数
get_L(a, n) = pi*a/(n*sin(pi/2n)^2);

get_L(1, 8)

    10.317831580762471

include("julia-source.txt");  # julia-source.txt ソース
L = 0
radius(k) = a * sin(k * π / n) / sin(π / n);
n = 8
a = 1
for k = 1:n - 1
    rk = radius(k)
    arc = 2pi*rk/n
    L += arc
    @printf("k = %d: r_k = %.15g, arc_k = %.15g\n", k, rk, arc)
end;
@printf("L = %.15g\n", L)

    k = 1: r_k = 1, arc_k = 0.785398163397448
    k = 2: r_k = 1.84775906502257, arc_k = 1.45122657606972
    k = 3: r_k = 2.41421356237309, arc_k = 1.89611889793704
    k = 4: r_k = 2.61312592975275, arc_k = 2.05234430595406
    k = 5: r_k = 2.41421356237309, arc_k = 1.89611889793704
    k = 6: r_k = 1.84775906502257, arc_k = 1.45122657606972
    k = 7: r_k = 1, arc_k = 0.785398163397449
    L = 10.3178315807625

なお,正 \(n\) 角形が内接する円の半径 \(R\)を 固定して \(n\) を大きくすると正 \(n\) 角形は円に近づく。
極限では円が一回転するのと同じになる。半径 \(R\) の円が転がって描くサイクロイド曲線の 1 山(1回転分)の周長は、円の半径の 8 倍である。

n = 300000000000
R = 1
a = R*2sin(pi/n)

    2.0943951023931954e-11

get_L(a, n)

    8.0

using SymPy
@syms a, n
p = PI*a/(n*sin(PI/2n)^2)/(a/2sin(PI/n))

    \(\displaystyle \frac{2 \pi \sin{\left(\frac{\pi}{n} \right)}}{n \sin^{2}{\left(\frac{\pi}{2 n} \right)}}\)

limit(p, n => oo)

    \(8\)

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

function draw(n, a=1, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, showaxis=false, label="", fontfamily="IPAMincho")
    ext_angle = 2π/n  # 正八角形のとき45度(以下同様)
    radius(k) = a*sin(k*π/n)/sin(π/n)
    # 1. 地面
    plot()
    hline!([0], color=:black, lw=1)
   
    # 2. 最初の正八角形 (左端)
    poly_xs = Float64
    poly_ys = Float64

    (curr_x, curr_y) = (0.0, 0.0)
    curr_ang = 0.0
    for i in 1:n+1
        push!(poly_xs, curr_x)
        push!(poly_ys, curr_y)
        curr_x += a*cos(curr_ang)
        curr_y += a*sin(curr_ang)
        curr_ang += 2π / n
    end
    plot!(poly_xs, poly_ys, fill=(0, :orange), fillalpha=0.15, linecolor=:brown, lw=1.5)
    # 3. 転がりと軌跡の描画
    for k in 1:(n-1)
        pivot_x = k*a
        pivot_y = 0.0
       
        # 半径と角度の計算
        rk = radius(k)
        # 幾何学的性質から,開始角度は π - (k - 1)*π/n
        start_θ = π - (k - 1)*(π/n)
        end_θ = start_θ - (2π/n)
       
        # 赤い軌跡 (円弧)
        θs = range(start_θ, end_θ, length=100)
        plot!(pivot_x .+ rk .* cos.(θs), pivot_y .+ rk .* sin.(θs), color=:red, lw=1.5)
       
        # 黒い補助線 (スポーク)
        plot!([pivot_x, pivot_x + rk*cos(start_θ)], [pivot_y, rk*sin(start_θ)], color=:black, lw=1)
        plot!([pivot_x, pivot_x + rk*cos(end_θ)], [pivot_y, rk*sin(end_θ)], color=:black, lw=1)
       
        # 支点(青)と移動頂点(赤)
        scatter!([pivot_x], [0.0], mc=:blue, ms=4, msw=0)
        scatter!([pivot_x + rk*cos(start_θ), pivot_x + rk*cos(end_θ)],
                [rk*sin(start_θ), rk*sin(end_θ)], mc=:red, ms=3.5, msw=0)
    end
    if more
        delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
        hline!([0], color=:black, lw=0.5)
        vline!([0], color=:gray80, lw=0.5)
    end
end;
draw(8, 1, true)

draw(7, 1, true)

 

「算額あれこれ」の全ページの索引


以下のアイコンをクリックして応援してください
[blog:g:10328749687233153773:banner] [blog:g:11696248318755496791:banner] [blog:g:11696248318758309580:banner] [blog:g:6802418398313943584:banner]

算額(その2114)

百五十 群馬県多野郡新町 稲荷神社 文政3年(1820)
百五十三 多野郡新町 諏訪神社 年代不明(上と同一人物)

群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.

和算の館
http://wasan.jp/gunma/suwa.html
キーワード:3次元,球3個,角錐台
#Julia #SymPy #算額 #和算 #数学


上面,下面が正方形の角錐台の中に 3 個の球を容れる。上下の球の直径が与えられたとき,真ん中の球の直径はいかほどか。

この空間図形を横から眺めると「算額(その0084)」のように,二本の直線に挟まれた円が 3 個見えるであろう。そのページに示したように,3個の円(球)の直径は等比数列をなす。すなわち,大球,中球,小球の直径を \(d_1,\ d_2,\ d_3\) とすると,\(d_2^2 = d_1 d_3\) ゆえ,\(d_2 = \sqrt{d_1 d_3}\) である。

「算額あれこれ」の全ページの索引


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

算額(その2113)

三重県松阪市 意非多神社 文化11年(1814)

和算の館
http://wasan.jp/kyoto/isida2.html
キーワード:3次元,球7個,正四面体
#Julia #SymPy #算額 #和算 #数学


正四面体の中に,甲球 4 個,乙球 3 個を容れる。乙球の直径が 155 寸のとき,甲球の直径はいかほどか。

算額(その1886)」も参照のこと。

甲球と乙球は,正四面体の頂点 D と辺 AD の中点 E を結ぶ直線に接する。

正四面体の底面を \(x-y\) 平面に置き,底面の重心を原点とする。
正四面体が内接する球の半径を \(R\)
正四面体の高さを \(\sqrt{2}R\)
甲球の半径と中心座標を \(r_1,\ (x_{11},\ 0,\ r_1),\ (x_{12},\ r_1,\ r_1),\ (0,\ 0,\ z_1)\)
乙球の半径と中心座標を \(r_2,\ (x_{21},\ 0,\ z_2),\ (x_{22},\ r_2,\ z_2)\)
とおき,以下の連立方程式の解を求める。

解析解を求める

まず,下にある 4 個の甲球について,算法助術の公式80 より,\(z_1 = r_1 (3 + 2\sqrt{6})/3\) がわかる。

include("julia-source.txt");  # julia-source.txt ソース
using SymPy
@syms r2::positive, R::positive, r1::positive, x11::positive, x12::negative, z1::positive, x21::positive, x22::negative, z2::positive
z1 = r1*(3 + 2√Sym(6))/3  # 算法助術公式80
eq1 = (x12 - x11)^2 + r1^2 - 4r1^2
eq2 = x11^2 + (z1 - r1)^2 - 4r1^2
eq3 = x12^2 + r1^2 + (z1 - r1)^2 - 4r1^2
eq4 = (x22 - x21)^2 + r2^2 - 4r2^2
eq5 = x21^2 + (z2 - z1)^2 - (r1 + r2)^2
eq6 = x22^2 + r2^2 + (z2 - z1)^2 - (r1 + r2)^2
eq7 = dist3(0, √Sym(2)*R, R/2, 0, x11, r1, r1) |> simplify
eq8 = dist3(0, √Sym(2)*R, R/2, 0, x21, z2, r2) |> simplify;

次に,eq2, eq3 を解いて \(x_{11},\ x_{12}\) が求まる。

(ans_x11, ans_x12) = solve([eq2, eq3], (x11, x12))[1]

    (2*sqrt(3)*r1/3, -sqrt(3)*r1/3)

更に,eq4, eq5, eq6 を解いて \(x_{21},\ x_{22},\ z_2\) が求まる。

(ans_x21, ans_x22, ans_z2) = solve([eq4, eq5, eq6], (x21, x22, z2))[2] # 2 of 2

    (2*sqrt(3)*r2/3, -sqrt(3)*r2/3, r1*(3 + 2*sqrt(6))/3 + sqrt(3)*sqrt(3*r1^2 + 6*r1*r2 - r2^2)/3)

eq7 の \(x_{11}\) に,前に求めた解を代入し,新たな方程式を解いて \(R\) を求める。

eq7_2 = eq7(x11 => ans_x11) |> factor

    \(\displaystyle \frac{2 \left(3 R^{2} - 8 \sqrt{3} R r_{1} - 3 \sqrt{2} R r_{1} + 4 r_{1}^{2} + 4 \sqrt{6} r_{1}^{2}\right)}{27}\)

ans_R = solve(eq7_2, R)[2]  # 2 of 2

    \(\displaystyle \frac{2 r_{1} \left(2 \sqrt{3} + 3 \sqrt{2}\right)}{3}\)

eq8

    \(\displaystyle \frac{2 R^{2}}{9} - \frac{8 R x_{21}}{9} - \frac{2 \sqrt{2} R z_{2}}{9} - r_{2}^{2} + \frac{8 x_{21}^{2}}{9} + \frac{4 \sqrt{2} x_{21} z_{2}}{9} + \frac{z_{2}^{2}}{9}\)

eq8_2 = eq8(x21 => ans_x21, z2 => ans_z2, R => ans_R) |> simplify |> x -> x*27

    \(12 \sqrt{6} r_{1}^{2} + 38 r_{1}^{2} - 24 \sqrt{6} r_{1} r_{2} - 26 r_{1} r_{2} - 6 \sqrt{3} r_{1} \sqrt{3 r_{1}^{2} + 6 r_{1} r_{2} - r_{2}^{2}} - 4 \sqrt{2} r_{1} \sqrt{3 r_{1}^{2} + 6 r_{1} r_{2} - r_{2}^{2}} + 4 r_{2}^{2} + 8 \sqrt{2} r_{2} \sqrt{3 r_{1}^{2} + 6 r_{1} r_{2} - r_{2}^{2}}\)

# k = r1/r2 として式を定義
Sqrt(x) = sympy.sqrt(x)
@syms k
eq8_3 = 12Sqrt(6)k^2 + 38k^2 - 24Sqrt(6)k - 26k -
      (6Sqrt(3)k + 4Sqrt(2)k - 8Sqrt(2))*sqrt(3k^2 + 6k - 1) + 4

    \(12 \sqrt{6} k^{2} + 38 k^{2} - 24 \sqrt{6} k - 26 k - \sqrt{3 k^{2} + 6 k - 1} \left(4 \sqrt{2} k + 6 \sqrt{3} k - 8 \sqrt{2}\right) + 4\)

# 根号を含まない部分 A と、根号の係数 B を抽出
sqrt_term = sqrt(3*k^2 + 6*k - 1)

    \(\sqrt{3 k^{2} + 6 k - 1}\)

B = eq8_3.coeff(sqrt_term)

    \(- 6 \sqrt{3} k - 4 \sqrt{2} k + 8 \sqrt{2}\)

A = simplify(eq8_3 - B * sqrt_term)

    \(12 \sqrt{6} k^{2} + 38 k^{2} - 24 \sqrt{6} k - 26 k + 4\)

# A^2 - B^2 * D = 0 を解く
eq8_4 = A^2 - B^2 * (3*k^2 + 6*k - 1) |> factor

    \(16 \left(k - 1\right) \left(48 \sqrt{6} k^{3} + 118 k^{3} - 105 \sqrt{6} k^{2} - 250 k^{2} + 18 \sqrt{6} k + 60 k - 9\right)\)

ans_k = solve(eq8_4, k)[4].evalf()

    \(1.93484692283495\)

\(k=r_1/r_2\) としたので,もとに戻すと \(r_1 = 1.93484692283495 \cdot r_2\) である。

ここが,今日のハイライト!!
1.93484692283495 という数値が,どういうものか SymPy の nsimplify() で探索する。

sympy.nsimplify(ans_k, [Sqrt(6)]) |> factor

    \(\displaystyle \frac{3 \left(\sqrt{6} + 4\right)}{10}\)

\(\displaystyle 1.93484692283495 = \frac{3\left(\sqrt{6} + 4\right)}{10}\) である。

術は \( (\sqrt{0.54} + 1.2)\cdot 155 = \displaystyle \frac{3\left(\sqrt{6} + 4\right)}{10}\cdot 155\) で一致している。

(sqrt(Sym(54)/100) + Sym(12)/10) |> factor

    \(\displaystyle \frac{3 \left(\sqrt{6} + 4\right)}{10}\)

数値解を求める

最後に nsimplify が使えるなら,数値解を求めるのが簡単である。

include("julia-source.txt");  # julia-source.txt ソース
function driver(r2)
    function H(u)
        function parameters()
            eq1 = (x12 - x11)^2 + r1^2 - 4r1^2
            eq2 = x11^2 + (z1 - r1)^2 - 4r1^2
            eq3 = x12^2 + r1^2 + (z1 - r1)^2 - 4r1^2
            eq4 = (x22 - x21)^2 + r2^2 - 4r2^2
            eq5 = x21^2 + (z2 - z1)^2 - (r1 + r2)^2
            eq6 = x22^2 + r2^2 + (z2 - z1)^2 - (r1 + r2)^2
            eq7 = dist3(0, √2R, R/2, 0, x11, r1, r1)
            eq8 = dist3(0, √2R, R/2, 0, x21, z2, r2)
            return [eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8]
        end;
        (R, r1, x11, x12, z1, x21, x22, z2) = u
        return parameters()
    end;
    iniv = BigFloat[10,  2, 2.2, -1.1, 5, 1.2, -0.6, 7.6]*r2
    res = nls(H, ini=iniv)
    res[2] || println("収束していない")
    return res[1]
end;
r2 = 1/2
(R, r1, x11, x12, z1, x21, x22, z2) = driver(r2)
@printf("乙円の直径が %g のとき,甲円の直径は %.15g である。\n", 2r2, 2r1)

    乙円の直径が 1 のとき,甲円の直径は 1.93484692283495 である。

sympy.nsimplify(1.93484692283495, [sqrt(Sym(6))]) |> simplify |> factor

    \(\displaystyle \frac{3 \left(\sqrt{6} + 4\right)}{10}\)

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

function draw(r2, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, showaxis=false, label="", fontfamily="IPAMincho")
    (R, r1, x11, x12, z1, x21, x22, z2) = driver(r2)
    p1 = plot(xlabel="x-axis", ylabel="y-axis")
    plot!([0.5, 0.5, -1, 0.5].*R, [-√3, √3, 0, -√3].*R/2, color=:green, lw=0.5)
    rotate(x11, 0, r1)
    circle(0, 0, r1)
    rotate(x21, 0, r2, :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)
    end
    p2 = plot(xlabel="x-axis", ylabel="z-axis")
    plot!([0.5, 0, -1, 0.5].*R, [0, √2, 0, 0].*R, color=:green, lw=0.5)
    circle(x11, r1, r1)
    circle(x12, r1, r1)
    circle(0, z1, r1)
    circle(x21, z2, r2, :blue)
    circle(x22, z2, r2, :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(0, √2R, "√2R", :green, :left, :bottom, delta=delta/2)
        point(R/2, 0, "R/2", :green, :left, :bottom, delta=delta/2)
        xlims!(-R - delta, R/2 + 8delta)
    end
    plot(p1, p2)
end;
draw(155/2, true)

 

「算額あれこれ」の全ページの索引


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

算額(その2112)

京都府八幡市 石田神社 明和2年(1765)

和算の館
http://wasan.jp/kyoto/isida2.html
キーワード:四角形,面積
#Julia #SymPy #算額 #和算 #数学


今,四角形の廓が有,龍虎の長さは 130 歩,虎風の長さは 370 歩,風雲の長さは 250 歩,雲龍の長さは 390 歩,龍風の長さは 400 歩,2 歩巾の連絡道を 2 本作る。分けられた 3 つの面積は等しいとする。2 本の連絡道をどこに作ればよいか。(2 本の連絡道は風雲に平行である。)

一般化するのはあまり意味がないので,実値で計算する。
まず,四辺形の交点座標を確定する。

include("julia-source.txt");  # julia-source.txt ソース
using SymPy
@syms Ax::nonnegative, Ay::nonnegative, Bx::nonnegative, By::nonnegative,
      Cx::nonnegative, Cy::nonnegative, Dx::nonnegative, Dy::nonnegative
(Ax, Ay) = (0, 0)
(Bx, By) = (250, 0)
dist(x1, y1, x2, y2, d) = sqrt( (x1 - x2)^2 + (y1 - y2)^2) - d
eq1 = dist(Cx, Cy, Dx, Dy, 130)
eq2 = dist(Dx, Dy, Bx, By, 370)
eq3 = dist(Ax, Ay, Cx, Cy, 390)
eq4 = dist(Cx, Cy, Bx, By, 400)
res = solve([eq1, eq2, eq3, eq4], (Cx, Cy, Dx, Dy))[2]  # 2 of 2

    (546/5, 1872/5, 5978/25, 9246/25)

実値として確定する。

(Cx, Cy, Dx, Dy) = (546/5, 1872/5, 5978/25, 9246/25)

    (109.2, 374.4, 239.12, 369.84)

1. 数値解を求める

include("julia-source.txt");  # julia-source.txt ソース
function driver(Ax, Ay, Bx, By, Cx, Cy, Dx, Dy)
    function H(u)
        function parameters()
            # 底辺からの高さが h の水平線と四辺形の斜辺の交点座標を求める関数
            intersection(h) = (Cx*h/Cy, Bx - h*(Bx - Dx)/Dy);
            h2 = h1 + 2 # 下の道の上辺
            h4 = h3 + 2 # 上の道の上辺
            (x11, x12) = intersection(h1) # 下の道の下辺
            (x21, x22) = intersection(h2) # 下の道の上辺
            (x31, x32) = intersection(h3) # 上の道の下辺
            (x41, x42) = intersection(h4) # 上の道の上辺
            S = area([0 0; Cx Cy; Dx Dy; Bx By]) # 全体の面積
            S1 = area([0 0;    x11 h1; x12 h1; Bx By]); # 下の面積
            S2 = area([x11 h1; x21 h2; x22 h2; x12 h1]); # 道の面積
            S3 = area([x21 h2; x31 h3; x32 h3; x22 h2]); # 中の面積
            S4 = area([x31 h3; x41 h4; x42 h4; x32 h3]); # 道の面積
            S5 = area([x41 h4;  Cx Cy;  Dx Dy; x42 h4]); # 上の面積
            S0 = (S - S2 - S4)/3 # 分割された 3 つの面積
            return [S0 - S1, S0 - S3]
        end;
        (h1, h3) = u
        return parameters()
    end;
    iniv = BigFloat[120, 180]
    res = nls(H, ini=iniv)
    res[2] || println("収束していない")
    return res[1]
end;
(Ax, Ay, Bx, By, Cx, Cy, Dx, Dy) = (0, 0, 250, 0, 546/5, 1872/5, 5978/25, 9246/25)
driver(Ax, Ay, Bx, By, Cx, Cy, Dx, Dy)

    2-element Vector{Float64}:
    99.7284109780722
    219.31098859049712

下の道は,風雲から (99.7284109780722, 101.7284109780722) の間に作る
上の道は,風雲から (219.31098859049712, 221.31098859049712) の間に作る
分割された 3 つの面積はそれぞれ 23335.3872461943 である。

2.解析解を求める

using SymPy
@syms Ax::nonnegative, Ay::nonnegative, Bx::nonnegative, By::nonnegative,
      Cx::nonnegative, Cy::nonnegative, Dx::nonnegative, Dy::nonnegative
@syms h1, h2, h3, h4
(Ax, Ay, Bx, By, Cx, Cy, Dx, Dy) = (0, 0, 250, 0, 546/5, 1872/5, 5978/25, 9246/25)
# 底辺からの高さが h の水平線と四辺形の斜辺の交点座標を求める関数
intersection(h) = (Cx*h/Cy, Bx - h*(Bx - Dx)/Dy);
h2 = h1 + 2 # 下の道の上辺
h4 = h3 + 2 # 上の道の上辺
(x11, x12) = intersection(h1) # 下の道の下辺
(x21, x22) = intersection(h2) # 下の道の上辺
(x31, x32) = intersection(h3) # 上の道の下辺
(x41, x42) = intersection(h4) # 上の道の上辺
S = area([0 0; Cx Cy; Dx Dy; Bx By]) # 全体の面積
S1 = area([0 0;    x11 h1; x12 h1; Bx By]); # 下の面積
S2 = area([x11 h1; x21 h2; x22 h2; x12 h1]); # 道の面積
S3 = area([x21 h2; x31 h3; x32 h3; x22 h2]); # 中の面積
S4 = area([x31 h3; x41 h4; x42 h4; x32 h3]); # 道の面積
S5 = area([x41 h4;  Cx Cy;  Dx Dy; x42 h4]); # 上の面積
S0 = (S - S2 - S4)/3 # 分割された 3 つの面積

    \(\displaystyle - \frac{h_{1} \left(0.321084793424183 h_{1} - 249.941163746485\right)}{6} - \frac{h_{1} \left(0.321084793424183 h_{1} - 249.416666666667\right)}{6} - \frac{h_{3} \left(0.321084793424183 h_{3} - 249.941163746485\right)}{6} - \frac{h_{3} \left(0.321084793424183 h_{3} - 249.416666666667\right)}{6} - \frac{\left(249.416666666667 - 0.321084793424183 h_{1}\right) \left(h_{1} + 2\right)}{6} - \frac{\left(249.416666666667 - 0.321084793424183 h_{3}\right) \left(h_{3} + 2\right)}{6} - \frac{\left(249.941163746485 - 0.321084793424183 h_{1}\right) \left(h_{1} + 2\right)}{6} - \frac{\left(249.941163746485 - 0.321084793424183 h_{3}\right) \left(h_{3} + 2\right)}{6} + 23600.0\)

# 全体の面積
S

    70800.0

# 分割された 3 つの面積
S0 = (S - S2 - S4)/3 |> simplify;

S0(h1 => 99.7284109780722, h3 => 219.31098859049712)

    \(23335.3872461943\)

S5

    \(\displaystyle - 60.04 h_{3} + \frac{\left(0.0294181267575168 h_{3} - 140.741163746485\right) \left(h_{3} + 2\right)}{2} + \frac{\left(0.291666666666667 h_{3} - 238.536666666667\right) \left(h_{3} + 2\right)}{2} + 70679.92\)

eq5 = S0 - S1;

ans_h1 = solve(eq5, h1)[1]  # 1 of 2

    \(777.943859649123 - 678.430990939778 \sqrt{1 - 2.89685915117213 \cdot 10^{-6} h_{3}}\)

eq6 = S0 - S5;

eq6_2 = eq6(h1 => ans_h1)

    \(\displaystyle 60.2540565289494 h_{3} - 145.222583052302 \sqrt{1 - 2.89685915117213 \cdot 10^{-6} h_{3}} - \frac{\left(0.0294181267575168 h_{3} - 140.741163746485\right) \left(h_{3} + 2\right)}{2} - \frac{\left(0.291666666666667 h_{3} - 238.536666666667\right) \left(h_{3} + 2\right)}{2} - 47246.3012579614\)

res = solve(eq6_2, h3)

    \(\left[\begin{smallmatrix}219.310988590497 - 2.8235349718099 \cdot 10^{-33} i\\1335.24470906511 + 2.8235349718099 \cdot 10^{-33} i\end{smallmatrix}\right]\)

解は両方とも見かけは虚数であるが,虚部は実質 0 であり,\(h_3 = 219.310988590497\) が適解である。

abs(res[1]) |> println

    219.310988590497

先に求めた \(ans_{h1}\) に \(h_3 = 219.310988590497\) を代入して \(h_1 = 99.7284109780722\) である。

ans_h1(h3 =>  219.310988590497)

    \(99.7284109780722\)

 

「算額あれこれ」の全ページの索引


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

算額(その2111)

京都府八幡市 石田神社 明和2年(1765)

和算の館
http://wasan.jp/kyoto/isida2.html
キーワード:角錐台,体積,整数方程式
#Julia #SymPy #算額 #和算 #数学


今,高台が有,その高さは知らない。上径と下径の和が 28歩,それに体積が 8557 歩。問,上径,下径,及び高さはいくらか。

図によれば,高台は四角錐台なので,上径・下径とは,正方形の一辺の長さの意である。
以下のブルートフォースによるプログラムで解を得る。

@time for x = 15:27, h = 1:10000
    y = 28 - x
    h*(x^2 + y^2 + x*y)/3 == 8557 && println( (x, y, h))
end

    (17, 11, 43)
    0.029180 seconds (41.57 k allocations: 3.430 MiB, 95.65% compilation time)

問題文を読んでプログラム書くまでが 3 分ほど。
実行時間は 0.029180 秒。
紙と鉛筆だけだとそれよりは遅いだろう。

上径 11,下径 17,高さ 43

「算額あれこれ」の全ページの索引


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

算額(その2110)

京都府八幡市 石田神社 明和2年(1765)

和算の館
http://wasan.jp/kyoto/isida2.html
キーワード:整数方程式
#Julia #SymPy #算額 #和算 #数学


今,上,中,下の農夫を戸毎の鶏税で使っている。上農は 311 戸,中農は 739 戸,下農は 3513 戸,總鶏税は 44384 匹,また,上農の税は下農より一戸毎 21 匹多い。上,中,下の農夫の戸毎の鶏税はいくらか。

「鶏税」というのは,ものの喩えで,「年貢」,「税金」であろう。

上,中,下の農夫の鶏税を \(x,\ y,\ z\) とおき,以下のプログラムでブルートフォースで解を求める。

@time for x = 22:100000, y = 1:x - 1, z = x - 21
    311x + 739y + 3513z == 44384 && println( (x, y, z))
end;

    (28, 15, 7)
    1.595942 seconds (41.56 k allocations: 3.429 MiB, 1.61% compilation time)

問題文を読んでプログラム書くまでが 3 分ほど。
実行時間は 1.6 秒。
紙と鉛筆だけだとそれよりは遅いだろう。

戸毎の鶏税は,28, 15, 7 匹(羽)
これだけ広範囲を検索して,唯一の解とは。唯一の解が得られる条件を見つけるのは相当苦労したのであろうか。

# 検算
(x, y, z) = (28, 15, 7)
311x + 739y + 3513z == 44384

    true

 

「算額あれこれ」の全ページの索引


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

算額(その2109)

京都府八幡市 石田神社 明和2年(1765)

和算の館
http://wasan.jp/kyoto/isida2.html
キーワード:3次元,球
#Julia #SymPy #算額 #和算 #数学


青球,黄球,白球が平面上に互いに外接して載っている。その上に赤球を載せたとき,平面から赤球のてっぺんまでの高さはいかほどか。

青玉の半径と中心座標を \(r_1,\ (0,\ 0,\ r_1)\)
黄玉の半径と中心座標を \(r_2,\ (x_2,\ 0,\ r_2)\)
白玉の半径と中心座標を \(r_3,\ (x_3,\ y_3,\ r_3)\)
赤玉の半径と中心座標を \(r_4,\ (x_4,\ y_4,\ z_4)\)
とおく。

4 個の球の半径と最上球のてっぺんまでの高さに関する,算法助術の公式80 そのものである。

\(h^2 r_1 r_2 r_3 (r_1 + r_2 + r_3) - 4 h r_1 r_2 r_3 r_4 (r_1 + r_2 + r_3) - 2 h r_1 r_2 r_3 (r_1 r_2 + r_1 r_3 + r_2 r_3) + 2 h r_4 (r_1^2 r_2^2 + r_1^2 r_3^2 + r_2^2 r_3^2) + 4 r_1^2 r_2^2 r_3^2 = 0\)

using SymPy
@syms r1, r2, r3, r4, h
t1 = 4r1^2*r2^2*r3^2
t2 = 2r1*r2*r3*(r1*r2 + r1*r3 + r2*r3)*h
t3 = 2r4*(r1^2*r2^2 + r1^2*r3^2 + r2^2*r3^2)*h
t4 = 4r1*r2*r3*r4*(r1 + r2 + r3)*h
t5 = r1*r2*r3*(r1 + r2 + r3)*h^2
formula80 = t1 - t2 + t3 - t4 + t5;

formula80 を \(h\) について解く。
式は長いので表示は省略する。

# h
ans_h = solve(formula80, h)[2];  # 2 of 2

各球の半径の実値を代入して,目的の数値を得る。

ans_h(r1 => 1.3/2, r2 => 1.1/2, r3 => 1/2, r4 => 1.2/2)

    \(2.10633182021037\)

4 個の球の中心間距離に関する,3 次元におけるピタゴラスの定理を記述した以下の連立方程式の数値解を求める。

include("julia-source.txt");  # julia-source.txt ソース
function driver(r1, r2, r3, r4)
    function H(u)
        function parameters()
            eq1 = x2^2 + (r1 - r2)^2 - (r1 + r2)^2
            eq2 = x3^2 + y3^2 + (r3 - r1)^2 - (r3 + r1)^2
            eq3 = (x2 - x3)^2 + y3^2 + (r3 - r2)^2 - (r3 + r2)^2
            eq4 = x4^2 + y4^2 +(z4 - r1)^2 - (r4 + r1)^2
            eq5 = (x4 - x2)^2 + y4^2 + (z4 - r2)^2 - (r4 + r2)^2
            eq6 = (x4 - x3)^2 + (y4 - y3)^2 + (z4 - r3)^2 - (r4 + r3)^2
            return [eq1, eq2, eq3, eq4, eq5, eq6]
        end;
        (x2, x3, y3, x4, y4, z4) = u
        return parameters()
    end;
    iniv = BigFloat[1.8, 1.0, 1.4, 1.2, 0.7, 2.3] * r1
    res = nls(H, ini=iniv)
    res[2] || println("収束していない")
    return res[1]
end;
res = driver(1.3/2, 1.1/2, 1/2, 1.2/2)
res |> println

    [1.1958260743101399, 0.6815372381557789, 0.9140607162584949, 0.7740533526625316, 0.4796219562604338, 1.5063318202103722]

赤球のてっぺんまでの高さ \(h\) は,赤球の中心座標 \(z_4\) に,赤球の半径 \(r_4\) を加えたものである。

r4 = 1.2/2
h = res[6] + r4

    2.106331820210372

解析解と同じ答えが得られた。

「算額あれこれ」の全ページの索引


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

サクラあれこれ

ソメイヨシノ

エドヒガンザクラ

ヨウコウザクラ

ヤマザクラ

 

「算額(その0109)」を改訂しました

算額(その0109)」を改訂しました

この算額(問)には根本的な欠陥があります

sangaku0418.hatenablog.com

算額(その2108)

富山県射水市八幡町 越中放生津八幡社 天明3年(1783)

関流田中文蔵高寛門人 石黒藤右衛門信由
和算の館
http://wasan.jp/toyama/hojozu.html
キーワード:円1個,四角形
#Julia #SymPy #算額 #和算 #数学


(不等辺)四角形の 4 辺の全てに接する内接円がある。4 つの頂点から接点までの距離が与えられたとき,内接円の直径はいかほどか。

子,丑,寅,卯が 42.84 寸,83.3 寸,119 寸,61.2 寸のとき,内接円の直径は 142.8 寸である。

算法助術の公式37そのものである。
内接円の中心角 \(\alpha,\ \beta,\ \gamma,\ \delta\) を用いれば,\(\tan(\alpha+\beta+\gamma+\delta) = 0\) より,加法定理を用いて展開すれば,求める等式を得る。

\( (a + b) c d + (c + d) a b = r^2(a + b + c + d)\)

\(\displaystyle \displaystyle r = \sqrt{\frac{(a + b) c d + (c + d) a b}{a + b + c + d}}\)

# formula37
# a, b, c, d を与えて内接円の半径を返す関数
r(a, b, c, d) = sqrt( ( (a + b)*c*d + (c + d)*a*b)/(a + b + c + d));

r(42.84, 83.3, 119, 61.2)*2

    142.8

 

「算額あれこれ」の全ページの索引


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

算額(その2107)

富山県射水市八幡町 越中放生津八幡社 天明3年(1783)

関流田中文蔵高寛門人 石黒藤右衛門信由
和算の館
http://wasan.jp/toyama/hojozu.html
キーワード:円2個,菱形,斜線
#Julia #SymPy #算額 #和算 #数学


菱形の中に,斜線を隔てて甲乙 2 円を容れる。菱形の対角線が 8 寸と 6 寸,甲円の直径が 3 寸のとき,乙円の直径はいかほどか。


菱形の対角線を \(2a,\ 2b\)
甲円の半径と中心座標を \(r_1,\ (0,\ y_1)\)
乙円の半径と中心座標を \(r_2,\ (0,\ y_2)\)
斜線と菱形の辺の交点座標を \( (x_0,\ y_0)\)
とおき,以下の連立方程式の解を求める。

include("julia-source.txt");  # julia-source.txt ソース
using SymPy
@syms a, b, c, r1, r2, y1, y2, x0, y0
y0 = -b - x0*b/a
c = sqrt(a^2  + b^2)
eq1 = dist2(a, 0, x0, y0, 0, y1, r1)
eq2 = dist2(a, 0, x0, y0, 0, y2, r2)
eq3 = r1/(b - y1) - a/c
eq4 = r2/(b + y2) - a/c;

一度に求めることはできないので,まず eq2, eq3, eq4 を解いて \(x_0,\ y_1,\ y_2\) を求める。

res = solve([eq2, eq3, eq4], (x0, y1, y2))[2];  # 2 of 2

解を eq1 に代入し,新たな方程式を解いて \(r_2\) を求める。

eq1_1 = eq1(x0 => res[1], y1 => res[2], y2 => res[3]) |> simplify |> numerator

    \(4 a b^{2} \left(a^{5} b^{2} + a^{5} r_{1} r_{2} + a^{5} r_{2}^{2} - a^{4} b r_{1} \sqrt{a^{2} + b^{2}} - 2 a^{4} b r_{2} \sqrt{a^{2} + b^{2}} + a^{3} b^{2} r_{1} r_{2} + a^{3} b^{2} r_{2}^{2} - a^{3} r_{1}^{2} r_{2}^{2} - a^{3} r_{1} r_{2}^{3} + a^{2} b r_{1}^{2} r_{2} \sqrt{a^{2} + b^{2}} + a^{2} b r_{1} r_{2}^{2} \sqrt{a^{2} + b^{2}} - 2 a b^{2} r_{1}^{2} r_{2}^{2} - a b^{2} r_{1} r_{2}^{3} + b r_{1}^{2} r_{2}^{3} \sqrt{a^{2} + b^{2}}\right)\)

式を見やすくするために \(\sqrt{a^2 + b^2}\) を \(c\) とする。

# r2: 乙円の半径
@syms d, c
ans_r2 = solve(eq1_1, r2)[3]; # 3 of 3
ans_r2 = apart(ans_r2, d) |> simplify |> x -> x(sqrt(a^2 + b^2) => c)
@show(ans_r2)

    ans_r2 = a*(-a^2*r1 + a*b*c - b^2*r1)/(a^3 + a*b^2 - b*c*r1)

    \(\displaystyle \frac{a \left(- a^{2} r_{1} + a b c - b^{2} r_{1}\right)}{a^{3} + a b^{2} - b c r_{1}}\)

必須ではないが,図を描くために以下のパラメータも再掲。

# x0
ans_x0 = res[1](sqrt(a^2 + b^2) => c)
@show(ans_x0)

    ans_x0 = r2*(a*c - b*r2)/(-a*b + c*r2)

    \(\displaystyle \frac{r_{2} \left(a c - b r_{2}\right)}{- a b + c r_{2}}\)

# y1
ans_y1 = res[2](sqrt(a^2 + b^2) => c)
@show(ans_y1)

    ans_y1 = b - c*r1/a

    \(\displaystyle b - \frac{c r_{1}}{a}\)

# y2
ans_y2 = res[3](sqrt(a^2 + b^2) => c)
@show(ans_y2)

    ans_y2 = -b + c*r2/a

    \(\displaystyle - b + \frac{c r_{2}}{a}\)

菱形の対角線が 8, 6,甲円の直径が 3 のとき,乙円の直径は 2.32258064516129 である。

なお,数値解は以下で求めることもできる。

include("julia-source.txt");  # julia-source.txt ソース
function driver(a, b, r1)
    function H(u)
        function parameters()
            y0 = -b - x0*b/a
            c = sqrt(a^2  + b^2)
            eq1 = dist3(a, 0, x0, y0, 0, y1, r1)
            eq2 = dist3(a, 0, x0, y0, 0, y2, r2)
            eq3 = r1/(b - y1) - a/c
            eq4 = r2/(b + y2) - a/c
            return [eq1, eq2, eq3, eq4]
        end;
        (y1, r2, y2, x0) = u
        return parameters()
    end;
    iniv = BigFloat[0.28, 0.29, -0.39, -0.77] .* a
    res = nls(H, ini=iniv)
    res[2] || println("収束していない")
    return res[1]
end;
driver(4, 3, 3/2) |> println

    [1.125, 1.1612903225806452, -1.5483870967741935, -3.0967741935483875]

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

function draw(a, b, r1, more)
    pyplot(size=(500, 500), grid=false, showaxis=false, aspectratio=1, label="", fontfamily="IPAMincho")
    #=
    (y1, r2, y2, x0) = driver(a, b, r1)
    =#
    c = sqrt(a^2  + b^2)
    r2 = a*(-a^2*r1 + a*b*c - b^2*r1)/(a^3 + a*b^2 - b*c*r1)
    x0 = r2*(a*c - b*r2)/(-a*b + c*r2)
    y0 = -b - x0*b/a
    y1 = b - c*r1/a
    y2 = -b + c*r2/a
    @printf("菱形の対角線が %g, %g,甲円の直径が %g のとき,乙円の直径は %.15g である。\n", 2a, 2b, 2r1, 2r2)
    y0 = -b - x0*b/a
    plot([a, 0, -a, 0, a], [0, b, 0, -b, 0], color=:green, lw=0.5)
    circle(0, y1, r1)
    circle(0, y2, r2, :blue)
    segment(x0, y0, a, 0, :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(x0, y0, "(x0,y0)", :green, :right, :vcenter, deltax=-delta)
        point(0, y1, "甲円:r1,(0,y1)", :red, :center, delta=-delta)
        point(0, y2, "乙円:r2,(0,y2)", :blue, :center, delta=-delta)
        point(a, 0, "(a,0)", :green, :left, :bottom, delta=delta)
        point(0, b, "(0,b)", :green, :center, :bottom, delta=delta)
        point(0, 0, "(0,0)", :green, :center, :bottom, delta=delta)
        plot!(xlims=(-a, a + 7delta), ylims=(-b, b + delta))
    end
end;
draw(4, 3, 3/2, true)

    菱形の対角線が 8, 6,甲円の直径が 3 のとき,乙円の直径は 2.32258064516129 である。

 

「算額あれこれ」の全ページの索引


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




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

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