裏 RjpWiki

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

算額(その665)

2024年01月31日 | Julia

算額(その665)

長野市若穂 清水寺観音堂 寛政6年(1794)
中村信弥「改訂増補 長野県の算額」(p.45-46)

http://www.wasan.jp/zoho/zoho.html
キーワード:円2個,直角三角形,斜線
#Julia, #SymPy, #算額, #和算

直角三角形内に斜線と大円,小円を入れる。直角を挟む二辺(鈎と股)の和が 42 寸,斜辺(弦)の長さが 30 寸,大円の直径が 9 寸のとき,小円の直径を求めよ。

直角三角形の 3 辺の長さを,鈎,股,弦とおく。
大円の半径と中心座標を r1, (r1, y1)
小円の半径と中心座標を r2, (x2, r2)
斜線と斜辺の交点座標を (x, y)
斜線の長さを l, (x, y) と (0, 鈎) を結ぶ線分の長さを m
とおき,以下の連立方程式を解く。

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

using SymPy
@syms r1::positive, y1::positive, r2::positive,
     x2::positive, x::positive, y::positive,
     鈎::positive, 股::positive, 弦::positive
弦 = 30
鈎股の和 = 42
r1 = 9//2
l = sqrt(x^2 + y^2)
m = sqrt(x^2 + (鈎 - y)^2)
eq1 = y/(股 - x) - 鈎/股
eq2 = 鈎 + 股 - 鈎股の和
eq3 = 鈎^2 + 股^2 - 弦^2
eq4 = (鈎 + l + m)*r1 +(弦 - m + l + 股)*r2 - 鈎*股
eq5 = dist(0, 鈎, 股, 0, r1, y1) - r1^2
eq6 = dist(0, 鈎, 股, 0, x2, r2) - r2^2
eq7 = dist(0, 0, x, y, r1, y1) - r1^2
res = solve([eq1, eq2, eq3, eq4, eq5, eq6, eq7],
   (鈎, 股, y1, r2, x2, x, y))

   8-element Vector{NTuple{7, Sym}}:
    (18, 24, 9, 4, 12, 12, 9)
    (18, 24, 9, 4, 76/3, 12, 9)
    (18, 24, 81/4, 1443/352, 4119/352, 81/13, 693/52)
    (18, 24, 81/4, 1443/352, 8929/352, 81/13, 693/52)
    (24, 18, 21/2, 4, 10, 21/2, 10)
    (24, 18, 21/2, 4, 20, 21/2, 10)
    (24, 18, 51/2, 117/32, 171/16, 153/26, 210/13)
    (24, 18, 51/2, 117/32, 1269/64, 153/26, 210/13)

解は 8 組得られるが,最初のものが適解である。
小円の直径は 8 寸である。
その他のパラメータは以下の通りである。
鈎 = 18;  股 = 24;  y1 = 9;  r2 = 4;  x2 = 12;  x = 12;  y = 9

なお,5 番目のものも(普通は「鈎<股」なので),図を y = x の直線で裏返せば最初のものとは異なる図形が得られる。
ただし,大円と小円の位置が異なるので,適解とはいえない。
小円の直径 = 8;  鈎 = 24;  股 = 18;  y1 = 10.5;  r2 = 4;  x2 = 10;  x = 10.5;  y = 10

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (鈎, 股, y1, r2, x2, x, y) = res[n]
   弦 = 30
   鈎股 = 42
   r1 = 9//2
   l = sqrt(x^2 + y^2)
   m = sqrt(x^2 + (鈎 - y)^2)
   @printf("小円の直径 = %g;  鈎 = %g;  股 = %g;  y1 = %g;  r2 = %g;  x2 = %g;  x = %g;  y = %g\n",
           2r2, 鈎, 股, y1, r2, x2, x, y)
   plot([0, 股, 0, 0], [0, 0, 鈎, 0], color=:black, lw=0.5)
   circle(r1, y1, r1)
   circle(x2, r2, r2, :blue)
   segment(0, 0, x, y)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
       point(r1, y1, "大円:r1,(r1,y1)", :red, :center, delta=-delta)
       point(x2, r2, "小円:r2,(x2,r2)", :blue, :center, delta=-delta)
       point(x, y, " (x,y)", :black, :left, :bottom)
       point(0, 鈎, " 鈎", :black, :left, :bottom)
       point(股, 0, " 股", :black, :left, :bottom)
       plot!(xlims=(-1, 26))
   end
end;


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

コメントを投稿

Julia」カテゴリの最新記事