裏 RjpWiki

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

算額(その252)

2023年05月30日 | Julia

算額(その252)

中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額3(234)
長野県北佐久郡軽井沢町峠 熊野神社 明治5年(1872)

円内の弦の上に等円 2 個と菱形が入っている。菱形の長い方の対角線の長さが 8 寸,等円の径が 4 寸,のとき図の「矢」の長さはいかほどか。

外円の半径,中心座標を r0, (0, r1) とする。
弦の位置の y 座標を y とする。「矢」の長さは y である。
右側の等円の半径,中心座標を r1, (r1, y + r1) とする。r1 = 2 である。
菱形の短い方の対角線の長さを 2b とおく。b = 4 である。
菱形の短い方の対角線の長さを 2a とおく。菱形の右の頂点は (4, 2r0 - a) である。

以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms r0::positive, r1::positive, a::positive, b::positive, y::positive;

r1 = 2
b = 4
eq1 = b^2 +(r0 - a)^2 - r0^2
eq2 = r1^2 + (r0 - r1 - y)^2 - (r0 - r1)^2
eq3 = distance(0, 2r0 - 2a, b, 2r0 - a, r1, y + r1) - r1^2;
eq3 = (distance(0, 2r0 - 2a, b, 2r0 - a, r1, y + r1) - r1^2)*(a^2 + b^2)/b |> expand |> simplify;
res = solve([eq1, eq2, eq3], (r0, a, y))

   3-element Vector{Tuple{Sym, Sym, Sym}}:
    (9/2, 9/2 - sqrt(17)/2, 1)
    (9/2, sqrt(17)/2 + 9/2, 1)
    (9*sqrt(5)/5, 2*sqrt(5), 1 + 3*sqrt(5)/5)

(9/2, 9/2 - sqrt(17)/2, 1) |> println
(9/2, sqrt(17)/2 + 9/2, 1) |> println
(9*sqrt(5)/5, 2*sqrt(5), 1 + 3*sqrt(5)/5) |> println

   (4.5, 2.4384471871911697, 1)
   (4.5, 6.561552812808831, 1)
   (4.024922359499621, 4.47213595499958, 2.341640786499874)

a < b なので,最初の解が適切である。

このとき「矢」は 1,もとの単位では 1 寸である。

   r0 = 4.5000000;  a = 2.4384472;  y(矢) = 1.0000000

SymPy の solve() では,r1, b を変数のままで r0, a, y を求めることはできない (計算時間が長く一向に終わらない)。

術では,等円^2 / 4(菱長 - 等円) である。

func(r1, b) = 2(r1^2//4(b - r1))

func(2, 4), func(3, 7), func(2, 7), func(1, 6)

   (1//1, 9//8, 2//5, 1//10)


using Plots

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r0, a, y) = res[1]
   @printf("r0 = %.7f;  a = %.7f;  y(矢) = %.7f\n", r0, a, y)
   r1 = 2
   x = 4
   plot([x, 0, -x, 0, x], [2r0 - a, 2r0, 2r0 - a, 2r0 - 2a, 2r0 - a], color=:black, lw=0.5)
   circle(0, r0, r0)
   circle(r1, y + r1, r1, :blue)
   circle(-r1, y + r1, r1, :blue)
   x1 = sqrt(r0^2 - (r0 - y)^2)
   segment(-x1, y, x1, y)
   if more == true
       point(0, 2r0, " 2r0", :red, :left, :bottom)
       segment(-4, 2r0 - a, 4, 2r0 - a)
       point(0, 2r0 - a, " 2r0-a", :black)
       point(0, 2r0 - 2a, " 2r0-2a", :black)
       point(0, r0, " r0", :red)
       point(0, y, " y", :black)
       point(r1, y + r1, "(r1,y+r1)", :blue)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村