算額(その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)