裏 RjpWiki

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

算額(その1646)

2025年03月05日 | Julia

算額(その1646)

三十二 一関市舞川 観福寺内地蔵堂後額 明治34年(1901)

山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.
http://www.wasan.jp/yamamura/yamamura.html

今有如図 03086
https://w.atwiki.jp/sangaku/pages/158.html

小円を中心として楕円を 5 個配置する。楕円の内外に大円を 10個置く。小円の直径が与えられたときに大円の直径を求める術をのべよ。

図の解釈としては「今有如図」を採った。

楕円の長半径と短半径と中心座標を a, b, (0, r2 + b)
大円の半径と中心座標を r1, (0, r2 + b)
小円の半径と中心座標を r2, (0, 0)
楕円と右隣の楕円の接点座標を (x0, y0)
とおき,以下の連立方程式を解く。

なお,方程式中に tan(54°) = sqrt(2*sqrt(5)/5 + 1) の定数が出てくるが,これをそのまま用いると式が複雑になりすぎて SymPy では解がもとまらない。t = tan(54°) として,t をつかって方程式を解く。

include("julia-source.txt");
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf

using SymPy
@syms a::positive, b::positive, r1::positive, r2::positive,
      x0::positive, y0::positive
@syms a, b, r1, r2, x0, y0, t
# t = tand(Sym(54))
a = r1
eq1 = x0^2/a^2 + (y0 - (r2 + b))^2/b^2 - 1
eq2 = -b^2*x0/(a^2*(y0 - (r2 + b))) - t
eq3 = (r2 + b)/2r1 - t;
eq4 = t - y0/x0;

res = solve([eq1, eq2, eq3, eq4], (r1, b, x0, y0))[2]  # 2 of 2

    (r2*(4*sqrt(3) + 7)/(t*(sqrt(3) + 2)), r2*(3 + 2*sqrt(3)), r2*(sqrt(3) + 2)/(2*t), r2*(sqrt(3) + 2)/2)

大円の半径は以下のようになる。

# r1
res[1] |> println

    r2*(4*sqrt(3) + 7)/(t*(sqrt(3) + 2))

t に tan(54°) を代入すると以下のようになり,SymPy では直接的には簡約化できない。

res[1](t => tand(Sym(54)))

SymPy の力を借りながら手作業で簡約化して最終的に以下を得る。

大円の半径は,小円の半径の sqrt(2√5 + 5)*(√5 - 2)*(√3 + 2) = 2.71149362837554 倍である。
たとえば,小円の直径が 1 のとき,大円の直径は 2.71149362837554 である。

# r1
r1 = r2*sqrt(2√5 + 5)*(√5 - 2)*(√3 + 2)
r1 |> println

    2.71149362837554*r2

r1(r2 => 1)

    2.71149362837554

術は以下のようであるが,小円径 = 1 のとき,大円径 = 3.804226065180614 になってしまう。
術がおかしいのか,算額の図形の解釈が間違えているのかわからない。
一つの可能性としては山村の図のように 10 個の楕円の中心が同一円の円周上にあるような図形であるが,ちょっと立式が難しいか?

法 = sqrt(sqrt(0.8) + 1)
小円径 = 1
大円径 = (sqrt(5) + 3)*小円径/法

    3.804226065180614

function draw(r2, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    t = tand(54)
    (r1, b, x0, y0) = (r2*(4*sqrt(3) + 7)/(t*(sqrt(3) + 2)), r2*(3 + 2*sqrt(3)), r2*(sqrt(3) + 2)/(2*t), r2*(sqrt(3) + 2)/2)
    r1 = r2*sqrt(2√5 + 5)*(√5 - 2)*(√3 + 2)
    a = r1
    @printf("r2 = %g;  r1 = %g;  a = %g;  b = %g;  x0 = %g;  y0 = %g\n", r2, r1, a, b, x0, y0)
    plot()
    circle(0, 0, r2, :green)
    l = (r2 + b)
    l2 = l/cosd(36)
    for i = 0:4
        θ = 90 + 72i
        ellipse(l*cosd(θ), l*sind(θ), a, b, color=:blue, φ=θ+90)
        circle(l*cosd(θ), l*sind(θ), r1, :red)
        circle(l2*cosd(θ + 36), l2*sind(θ + 36), r1, :red)
        i == 4 &&  segment(0, 0, l2*cosd(θ + 36), l2*sind(θ + 36), :black)
    end
    x = l2.*cosd.(54:72:414)
    y = l2.*sind.(54:72:414)
    plot!(x, y, color=:gray80, lw=0.5)
    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)", :blue, :left, :vcenter)
        point(0, r2 + b, "大円:r1\n(0,r2+b)", :red, :center, delta=-delta/2)
    end
end;

draw(1/2, true)


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

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

Julia」カテゴリの最新記事