裏 RjpWiki

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

算額(その1306)

2024年09月21日 | Julia

算額(その1306)

百三十四 群馬県富岡市一ノ宮 貫前神社 明治20年(1887)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円4個,直角三角形,中鈎

直角三角形の中に中鈎(直角の頂点から斜辺への垂線)を引き,区画された領域に大円 1 個,等円 3 個を容れる。鈎が 5.4 寸,股が 7.2 寸,大円の直径が 2.88 寸のとき,等円の直径はいかほどか。

鈎,股を「鈎」,「股」
中鈎と斜辺(弦)の交点座標を (x, y)
大円の半径と中心座標を r1, (x1, r1)
等円の半径と中心座標を r2, (r2, y2), (r2, y2 + 2r2), (r2, y2 + 4r2)
とおき,以下の連立方程式を解く。
SymPy の能力的に,一度に解けないので,逐次解いていく。

まず,中鈎と斜辺の交点座標 (x, y) を求める。
eq5, eq6 を解いて x = 股*鈎^2/(股^2 + 鈎^2), y = 股^2*鈎/(股^2 + 鈎^2) を得る。

include("julia-source.txt");

using SymPy

@syms 鈎::positive, 股::positive,
     x::positive, y::positive
eq5 = y*股 - 鈎*(股 - x);
eq6 = x/y - 鈎/股;
res = solve([eq5, eq6], (x, y))
res[x] |> println
res[y] |> println

   股*鈎^2/(股^2 + 鈎^2)
   股^2*鈎/(股^2 + 鈎^2)

@syms 鈎::positive, 股::positive,
     x::positive, y::positive,
     r1::positive, x1::positive,
     r2::positive, y2::positive
x = 股*鈎^2/(股^2 + 鈎^2)
y = 股^2*鈎/(股^2 + 鈎^2)

eq1 = dist2(0, 0, x, y, x1, r1, r1)
eq2 = dist2(0, 0, x, y, r2, y2, r2)
eq4 = dist2(股, 0, 0, 鈎, r2, y2 + 4r2, r2);

この問題では,「鈎が 5.4 寸,股が 7.2 寸,大円の直径が 2.88 寸」というように,条件が 3 つ与えられている。しかし,鈎と股が決まれば中鈎が決まり,大円が入る直角三角形が決まれば大円の直径は自ずと決まる。つまり,大円の直径の情報は余分である上にもし,個の数値を誤って与えてしまうと図形が成立しない。

鈎,股の 2 条件から,内接する大円の直径をは以下のようにして求めることができる。
中鈎の長さを「中鈎」,中鈎の脚で分割される斜辺(弦)の長い方を「長弦」とする。

@syms 中鈎::positive, 長弦::positive
中鈎 = sqrt(x^2 + y^2);

長弦を求める。

eq01 = sqrt(中鈎^2 + 長弦^2) - 股
ans_長弦 = solve(eq01, 長弦)[1]

直角三角形に内接する円の直径は「鈎 + 股 - 弦 = 直径」の関係があるので,以下の方程式を解く。鈎,股を与えれば半径が求まる。

eq0 = 中鈎 + ans_長弦 - 股 - 2r1
ans_r1 = solve(eq0, r1)[1](鈎 => 5.4, 股 => 7.2)
ans_r1 |> println

   1.44000000000000

さらに,この算額問題を解くにあたり,大円は必要ない。
しかし,図を描くために大円の中心座標(x 座標)を求める。

ans_x1 = solve(eq1, x1)[2]  # 2 of 2
ans_x1 |> println

   r1*(鈎 + sqrt(股^2 + 鈎^2))/股

さて,本来の目的である,等円の直径(と中心座標)を求める。
まず,eq2 に,最初に求めた鈎一番下の等円の中心座標(y 座標)を求める。

ans_y2 = solve(eq2, y2)[2]
ans_y2 |> println

   r2*(股 + sqrt(股^2 + 鈎^2))/鈎

最後に,eq4 の y2 に上で求めた ans_y2 を代入して,r2 を求める。

eq14 = eq4(y2 => ans_y2)
ans_r2 = solve(eq14, r2)[1]  # 1 of 2
ans_r2 |> println

   鈎^2*(股^2 + 4*股*鈎 + 股*sqrt(股^2 + 鈎^2) + 鈎^2 - 鈎*sqrt(股^2 + 鈎^2))/(2*(股^3 + 4*股^2*鈎 + 股^2*sqrt(股^2 + 鈎^2) + 9*股*鈎^2 + 4*股*鈎*sqrt(股^2 + 鈎^2) + 4*鈎^3 + 鈎^2*sqrt(股^2 + 鈎^2)))

式は長いが,以下のように鈎が 5.4 寸, 股が 7.2 寸を代入すれば,等円の直径は 1.2 寸と求まる。

ans_r2(鈎 => 5.4, 股 => 7.2) * 2 |> println

   1.20000000000000

以上をまとめると,鈎,股が与えられれば,以下の順に計算を進める。
   x = 股*鈎^2/(股^2 + 鈎^2)
   y = 股^2*鈎/(股^2 + 鈎^2)
   x1 = r1*(鈎 + sqrt(股^2 + 鈎^2))/股
   r2 = 鈎^2*(股^2 + 4*股*鈎 + 股*sqrt(股^2 + 鈎^2) + 鈎^2 - 鈎*sqrt(股^2 + 鈎^2))/(2*(股^3 + 4*股^2*鈎 + 股^2*sqrt(股^2 + 鈎^2) + 9*股*鈎^2 + 4*股*鈎*sqrt(股^2 + 鈎^2) + 4*鈎^3 + 鈎^2*sqrt(股^2 + 鈎^2)))
   y2 = r2*(股 + sqrt(股^2 + 鈎^2))/鈎

function draw(鈎, 股, r1, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   #(x1, r2, y2, x, y) = res[1]
   x = 股*鈎^2/(股^2 + 鈎^2)
   y = 股^2*鈎/(股^2 + 鈎^2)
   x1 = r1*(鈎 + sqrt(股^2 + 鈎^2))/股
   r2 = 鈎^2*(股^2 + 4*股*鈎 + 股*sqrt(股^2 + 鈎^2) + 鈎^2 - 鈎*sqrt(股^2 + 鈎^2))/(2*(股^3 + 4*股^2*鈎 + 股^2*sqrt(股^2 + 鈎^2) + 9*股*鈎^2 + 4*股*鈎*sqrt(股^2 + 鈎^2) + 4*鈎^3 + 鈎^2*sqrt(股^2 + 鈎^2)))
   y2 = r2*(股 + sqrt(股^2 + 鈎^2))/鈎
   plot([0, 股, 0, 0], [0, 0, 鈎, 0], color=:green, lw=0.5)
   circle(x1, r1, r1)
   circle(r2, y2, r2, :blue)
   circle(r2, y2 + 2r2, r2, :blue)
   circle(r2, y2 + 4r2, r2, :blue)
   segment(0, 0, x, y, :magenta)
   segment(x, y, 股, 0, :black)
   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(0, 鈎, " 鈎", :green, :left, :bottom, delta=delta/2)
       point(股, 0, " 股", :green, :left, :bottom, delta=delta/2)
       point(x1, r1, "大円:r1,(x1,r1)", :red, :center, delta=-delta/2)
       point(r2, y2, " 等円:r2,(r2,y2)", :blue, :left, :vcenter)
       point(r2, y2 + 2r2, " 等円:r2,(r2,y2+2r2)", :blue, :left, :vcenter)
       point(r2, y2 + 4r2, " 等円:r2,(r2,y2+4r2)", :blue, :left, :vcenter)
       point(x, y, "(x,y)", :magenta, :left, :bottom, delta=delta/2)
       point(x/4, y/5, "中鈎", :magenta, :left, :vcenter, mark=false)
       point((x + 股)/2, y/2, "  長弦", :black, :left, :vcenter, mark=false)
       xlims!(-2delta, 股 + 5delta)
   end
end;

draw(5.4, 7.2, 2.88/2, true)

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

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

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