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


算額(その1625)

長野県下高井郡木島平村往郷 水穂神社 寛政12年(1800)

中村信弥「改訂増補 長野県の算額」県内の算額(P.62)
http://www.wasan.jp/zoho/zoho.html
キーワード:円多数,正三角形,斜線
#Julia #SymPy #算額 #和算 #数学


正三角形の中に斜線と数個の等円を容れる。左右の等円の個数が与えられたとき,等円の直径を求める術を述べよ。

正三角形の一辺の長さを \(a\)
斜線と正三角形の右側の斜辺との角度を \(\theta\)
等円の個数と直径を \(m,\ n,\ r\)
とおき,以下の連立方程式を解く。

eq1, eq2 は斜辺の長さを表す式が \(a\) に等しいというものである。

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

using SymPy
@syms a::positive, r::positive, θ::positive,
      m::integer, n::integer,
      s::positive, t::positive,
      u::positive, v::positive
s = r/tand(θ/2); t = r/tand(Sym(30))
u = r/tand( (60 - θ)/2); v = r/tand(Sym(30))
eq1 = (s + t + 2(m - 1)r) - a
eq2 = (u + v + 2(n - 1)r) - a |> simplify;

@syms x
eq11 = eq1(tan(π*θ/360) => x)
eq11 |>  println

    -a + r*(2*m - 2) + sqrt(3)*r + r/x

eq2 |> simplify
eq2 |> println

    -a + 2*n*r + r*tan(pi*θ/360 + pi/3) - 2*r + sqrt(3)*r

eq2 は \(\tan(\pi \theta/360 + \pi/3)\) を含むので,これを \(\tan(\pi\theta/360)\) で表す。

eq12 = -a + r*(2n - 2) + √Sym(3)*r + r*(x + √Sym(3))/(1 - √Sym(3)*x) |> simplify
eq12 |> println

    (-r*(x + sqrt(3)) + (sqrt(3)*x - 1)*(-a + 2*r*(n - 1) + sqrt(3)*r))/(sqrt(3)*x - 1)

まず eq11 を解き,\(x\) を求める。

ans_x = solve(eq11, x)[1]
ans_x |> println

    r/(a - 2*m*r - sqrt(3)*r + 2*r)

eq12 に \(x\) を代入し,\(r\) を求める。

eq12 = eq12(x => ans_x)
ans_r = solve(eq12, r)[1];  # 1 of 2

等円の半径は \(a,\ m,\ n\) の関数として以下のように表される。

ans_r |> println
ans_r |> display

    a*(m + n - sqrt(m^2 - 2*m*n + n^2 + 4) - 2 + 2*sqrt(3))/(4*(m*n - m + sqrt(3)*m - n + sqrt(3)*n - 2*sqrt(3) + 3))

    \(\frac{a \left(m + n - \sqrt{m^{2} - 2 m n + n^{2} + 4} - 2 + 2 \sqrt{3}\right)}{4 \left(m n - m + \sqrt{3} m - n + \sqrt{3} n - 2 \sqrt{3} + 3\right)}\)

\(m = 5,\ n = 3,\ a = 1\) のとき,等円の直径は 0.162700453447863 である。

2ans_r(m => 5, n => 3, a => 1).evalf() |> println

    0.162700453447863

術は以下のようになっている。

function diameter(m, n, a)
    num = (m + n) + 2(√3 - 1) - sqrt( (m - n)^2 + 4)
    den = 2(m*n + (√3 - 1)*(m + n) + (3 - 2√3))
    return a*num/den
end;
diameter(5, 3, 1)

    0.16270045344786252

\(\theta\) は以下の方程式を解くことで得られる。

eq = tan(PI*θ/360) - r/(a - 2*m*r - sqrt(Sym(3))*r + 2*r)
ans_θ = solve(eq, θ)[1]
ans_θ |> println

    360*atan(r/(a - 2*m*r - sqrt(3)*r + 2*r))/pi

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

function draw(a, m, n, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    r = a*(m + n - sqrt(m^2 - 2*m*n + n^2 + 4) - 2 + 2*sqrt(3))/(4*(m*n - m + sqrt(3)*m - n + sqrt(3)*n - 2*sqrt(3) + 3))
    θ = 360*atan(r/(a - 2*m*r - sqrt(3)*r + 2*r))/pi
    s = r/tand(θ/2); t = r/tand(30)
    u = r/tand( (60 - θ)/2); v = r/tand(30)
    p = plot([a/2, 0, -a/2, a/2], [0, √3a/2, 0, 0], color=:green, lw=0.5)
    segment(0, √3a/2, -√3a/2/tand(120 - θ), 0, :blue)
    for i = 0:max(m, n) - 1
        x = a/2 - t - r*i
        y = r + √3r*i
        i < m && circle(x, y, r)
        i < n && circle(-x, y, r)
    end
    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)
        circle(0, √3a/2, 0.15a, :magenta, beginangle=300 - θ, endangle=300)
        circle(0, √3a/2, 0.16a, :magenta, beginangle=300 - θ, endangle=300)
        point(0.18a*cosd(300 - θ/2), √3a/2 + 0.18a*sind(300 - θ/2), "θ", :magenta, mark=false)
        dimension_line(0, √3a/2, s*cosd(300), √3a/2 + s*sind(300), "s", :black, :left, :vcenter, length=0.03, deltax = 3delta, dx=0.02, dy=0.017)
        dimension_line(s*cosd(300), √3a/2 + s*sind(300), (s + 2(m - 1)r)*cosd(300), √3a/2 + (s + 2(m - 1)r)*sind(300), "2(m-1)r", :black, :left, :vcenter, length=0.03, deltax = 3delta, dx=0.02, dy=0.017)
        dimension_line( (s + 2(m - 1)r)*cosd(300), √3a/2 + (s + 2(m - 1)r)*sind(300), (s + 2(m - 1)r + t)*cosd(300), √3a/2 + (s + 2(m - 1)r + t)*sind(300), "t", :black, :left, :vcenter, length=0.03, deltax = 3delta, dx=0.02, dy=0.017)

        dimension_line(0, √3a/2, -u*cosd(300), √3a/2 + u*sind(300), "u", :black, :right, :vcenter, length=0.03, deltax = -3delta, dx=-0.025, dy=0.017)
        dimension_line(-u*cosd(300), √3a/2 + u*sind(300), -(u + 2(n - 1)r)*cosd(300), √3a/2 + (u + 2(n - 1)r)*sind(300), "2(n-1)r", :black, :right, :vcenter, length=0.03, deltax = -3delta, dx=-0.025, dy=0.017)
        dimension_line(-(u + 2(n - 1)r)*cosd(300), √3a/2 + (u + 2(n - 1)r)*sind(300),-(u + 2(n - 1)r + v)*cosd(300), √3a/2 + (u + 2(n - 1)r + v)*sind(300), "v", :black, :right, :vcenter, length=0.03, deltax = -3delta, dx=-0.025, dy=0.017)

        point( a/2 - t, r, "(a/2-t,r)", :red, :center, delta=-delta/2)
        point( t - a/2, r, "(t-a/2,r)", :red, :center, delta=-delta/2)

        point(0, √3a/2, "√3a/2", :blue, :center, :bottom, delta=2delta)
        point(a/2, 0, "a", :blue, :center, delta=-1.5delta)
        point(-√3a/2tand(120 - θ), 0, "-√3a/2tand(120-θ)", :blue, :center, delta=-1.5delta)
        plot!(xlims=(-a/2 - 6delta, a/2 + 2delta), ylims=(-6delta, √3a/2 + 2delta))
    end
    return p
end;

draw(1, 2, 3, true)

p1 = draw(1, 2, 3, false)
p2 = draw(1, 5, 3, false)
p3 = draw(1, 4, 4, false)
p4 = draw(1, 21, 31, false)
plot(p1, p2, p3, p4)


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




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

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