裏 RjpWiki

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

算額(その1532)

2025年01月12日 | Julia

算額(その1532)

藤田貞資(1789):神壁算法巻上
http://www.wasan.jp/jinpeki/jinpekisanpo1.pdf
所懸于東都湯嶋天満宮者二事
天明8年戌申二月
中術 關流神谷幸吉定令門人 東都本郷金助町住 矢崎新九郎永維

正六角形の中に 3 本の矢を設け,3 個の正方形を容れる。正六角形の一辺の長さが 1666 寸,矢の長さが,2499 寸のとき,正方形の一辺の長さはいかほどか。

この算題は,算額(その1497)算額(その1462)算額(その1459)算額(その597)算額(その381)算額(その770)のような「多角形の頂点から矢を引き,内部に多角形と相似な多角形を作る」の類題である。基本的な解法は共通している。本問では「正六角形」が表に出ているが,実は「正三角形」に関する問題でもある。

正六角形の一辺の長さを 「六」,正方形の一辺の長さを「四」,矢の長さを「矢」とおく。
三角形 ABC において,BC = a, AC = BD = b, AD = c
∠BAC = 120° で第二余弦定理(eq2),∠ABC = θ で第二余弦定理(eq3)を適用。
また,F は BE 上に,G は AB 上にあり,FH = FG/2 である。

これらの条件を記述する,以下の連立方程式を解く。

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

using SymPy
@syms a, b, c, θ, 四, 六, 矢
a = √Sym(3)*六  # 1666
eq1 = b + c - 矢  # 2499
eq2 = b^2 + (b + c)^2 + 2b*(b + c)/2 - a^2
eq3 = a^2 + (b + c)^2 - 2a*(b + c)*cosd(θ) - b^2
eq4 = (tand(Sym(30))*(a/2 - 四/2) + tand(θ)*(a/2 - 四/2)) - 四;
res = solve([eq1, eq2, eq3, eq4], (b, c, θ, 四))[4];  # 2 of 4

#b
res[1] |> factor |> println

    (-矢 + sqrt(3)*sqrt(4*六^2 - 矢^2))/2

# c
res[2] |> factor |> println

    -(-3*矢 + sqrt(3)*sqrt(4*六^2 - 矢^2))/2

# θ
res[3] |> println

    180*acos((sqrt(3)*矢 + sqrt(4*六^2 - 矢^2))/(4*六))/pi

一般解は複雑であるが,共通項を含むので,以下のように一時変数を用いれば,若干簡単になる。

# 四
s = √3矢 + sqrt(4六^2 - 矢^2)
t = sqrt((16六^2 - s^2)/六^2)
四 = 3六*(√3六*t + s)/(3六*t + (√3 + 6)*s);

「六」,「矢」に数値を代入することにより正しい数値解 809.000681202592 を得る。

四(六 => 1666, 矢 => 2499).evalf() |> println

    809.000681202592

式の段階で,「六」,「矢」に数値を代入すると式は以下のようになる。

@syms d
ans_四 = res[4](六 => 1666, 矢 => 2499) |> simplify
ans_四 = apart(ans_四, d) |> factor
ans_四 |> println
ans_四.evalf() |> println

    -833*(-462 - 259*sqrt(3) + 72*sqrt(21) + 189*sqrt(7))/83
    809.000681202592

正六角形の一辺の長さが 1666 寸,矢の長さが,2499 寸のとき,正方形の一辺の長さは
833*(462 + 259√3 - 72√21 - 189√7)/83 = 809.0006812025915 = 809.000 有奇である。

function transform(x, y; deg=0, dx=0, dy=0)
   (x, y) = [cosd(deg) -sind(deg); sind(deg) cosd(deg)] * [x, y]
   return (x .+ dx, y .+ dy)
end;

function driver(x1, y1, x2, y2, x3, y3, x4, y4)
    (x31, y31, x32, y32, x33, y33, x34, y34) = (x3, y3, x4, y3, x4, y4, x3, y4)
    for i = 0:2
        segment(x1, y1, x2, y2, :blue)
        plot!([x31, x32, x33, x34, x31], [y31, y32, y33, y34, y31], color=:red, lw=0.5)
        x = [x1, x2, x31, x32, x33, x34]
        y = [y1, y2, y31, y32, y33, y34]
        (x, y) = transform(x, y, deg=120)
        (x1, x2, x31, x32, x33, x34) = x
        (y1, y2, y31, y32, y33, y34) = y
    end        
end;

function draw(六, 矢, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    θ = 180*acos((sqrt(3)*矢 + sqrt(4*六^2 - 矢^2))/(4*六))/pi
    四 = 3*六*(sqrt(3)*六*sqrt((16*六^2 - (sqrt(3)*矢 + sqrt(4*六^2 - 矢^2))^2)/六^2) + sqrt(3)*矢 + sqrt(4*六^2 - 矢^2))/(3*六*sqrt((16*六^2 - (sqrt(3)*矢 + sqrt(4*六^2 - 矢^2))^2)/六^2) + (sqrt(3) + 6)*(sqrt(3)*矢 + sqrt(4*六^2 - 矢^2)))
    println("四 = $四")
    a = √3六   
    θ6 = 90:60:450
    xa = @. 六*cosd(θ6)
    ya = @. 六*sind(θ6)
    plot()
    for i = 1:6
        segment(xa[i], ya[i], xa[i + 1], ya[i + 1], :green)
    end
    plot!([xa[2], xa[4], xa[6], xa[2]], [ya[2], ya[4], ya[6], ya[2]], color=:gray80, lw=0.5)

    (x0, y0) = float.(intersection(-a/2, ya[2], 0, ya[2]-a/2*tand(θ),
        a/2, ya[2], 0, ya[2]-a/2*tand(60 - θ)))
    #segment(xa[2], ya[2], x0, y0, :blue)
    #rect(-四/2, ya[2] + (a/2 - 四/2)/√3, 四/2, ya[2] - (a/2 - 四/2)*tand(θ), :red)
    driver(xa[2], ya[2], x0, y0, -四/2, ya[2] + (a/2 - 四/2)/√3, 四/2, ya[2] - (a/2 - 四/2)*tand(θ))
    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, " A", :blue, :left, :vcenter)
        point(xa[6], ya[6], " C", :blue, :left, :vcenter)
        point(xa[2], ya[2], "B ", :blue, :right, :vcenter)
        θ0 = atand(y0, x0)
        l0 = sqrt(x0^2 + y0^2)
        x01 = l0*cosd(θ0 + 120)
        y01 = l0*sind(θ0 + 120)
        point(x01, y01, "D ", :blue, :right, delta=-delta/2)
        point(xa[1], ya[1], "E ", :green, :center, :bottom, delta=delta)
        point(-四/2, ya[2] + (a/2 - 四/2)/√3, "F ", :red, :right, :bottom)
        point(0, ya[2] + (a/2 - 四/2)/√3, "H", :red, :center, :bottom, delta=delta)
        point(-四/2, ya[2] + (a/2 - 四/2)/√3 - 四, "G ", :red, :right, :bottom, delta=delta)
        plot!(xlims=(xa[2] - 5delta, xa[6] + 5delta))
    end
end;

draw(1666, 2499, true)


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

コメントを投稿

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

Julia」カテゴリの最新記事