裏 RjpWiki

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

算額(その1594)

2025年02月06日 | Julia

算額(その1594)

深川英俊,トニー・ロスマン:聖なる数学:算額,p. 114,森北出版株式会社,2010年4月22日.
キーワード:正12角形2個,対角線
#Julia, #SymPy, #算額, #和算, #数学

図に示すような正12角形の24本の対角線の長さの和が与えられたとき,内部にできる小さな正12角形の一辺の長さを求める術を述べよ。

外側の正12角形が内接する円の直径を R
内側の正12角形が内接する円の直径を r
とすると,
a = c*tan(15°), c = (a + b)*tan(15°)
対角線の長さの和を l とすると,
l = 12*2*(a + b)
より,以下の連立方程式を解き,a, b を求める。

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

using SymPy
@syms a::positive, b::positive, c::positive,
      l::positive
eq1 = (a + b)*tand(Sym(15)) - a/tand(Sym(15))
eq2 = 12*2(a + b) - l;

表には出てこないが,tan(15°) = 2 - √3 なので,
eq1 = -2*sqrt(3)*a - sqrt(3)*b + 2*b
である。

連立方程式を解いて,a, b を求める。

res = solve([eq1, eq2], (a, b));

# a
res[a] |> simplify |> println

    l*(7 - 4*sqrt(3))/24

l = 150 のとき,a = 0.897459621556135 である。

2*res[a](l => 150).evalf() |> println

    0.897459621556135

長精度演算すると以下のようになる。

2*150*(7 - 4*sqrt(big"3"))/24

    0.897459621556135323627682924706381...

# b
res[b] |> simplify |> println

    l*(-3 + 2*sqrt(3))/12

a = r*sin(15°) なので,
r = a/sin(15°)

c = R*sin(15°) なので,
R = c/sin(15°)

c = (a + b)*tan(15°) なので,
R = (a + b)*tan(15°)/sin(15°)

function draw(n, l, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    a = l*(7 - 4√3)/24
    b = l*(2√3 - 3)/12
    r = a/sind(15)
    R = (a + b)*tand(15)/sind(15)
    x = [R*cosd(z) for z = 0:360/n:360]
    y = [R*sind(z) for z = 0:360/n:360]
    c = R*sind(15)
    plot()
    for i = 1:n
        segment(x[i], y[i], x[mod(i - 2 + (n + 1)÷2, n) + 1], y[mod(i - 2 + (n + 1)÷2, n) + 1], :brown, lw=0.3)
    end
    circle(0, 0, R, :green)
    circle(0, 0, r, :red)
    circle(0, 0, c, :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(r, 0, " r", :red, :left, :bottom, delta=delta/5)
        point(c, 0, "c ", :blue, :right, :bottom, delta=delta/5)
        lens!([0, 0.2], [-0.01, 0.2], inset = (1, bbox(0.7, 0.0, 0.3, 0.35)))
    end
end;

draw(12, 15, true)

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

コメントを投稿

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

Julia」カテゴリの最新記事