山形県新庄市堀端町 戸澤神社(戸沢神社) 文政元年(1818)
http://www.wasan.jp/yamagata/tozawa.html
キーワード:円2個,円弧,直角三角形
#Julia #SymPy #算額 #和算 #数学
直角三角形の中に,円弧,大円,小円を容れる。鈎,股が与えられたとき,小円の最小値を求めよ。

鈎,股をそのまま変数名とし,弦を前もって求めておく。
大円の半径と中心座標を \(r_1, (r_1, r_1)\)
小円の半径と中心座標を \(r_2, (r_1 + 2\sqrt{r_1 r_2}, r_2)\)
円弧の半径と中心座標を \(R, (x, y)\)
とおき,以下の連立方程式を立てる。
算額の図では,円弧は股に一点で交差または外接している。そのためには円弧の中心の \(x\) 座標が股の長さに等しくなければならない。もしその条件が満たされないと,円弧は股と 2 点で交差することになり,算額の図のようにはならない。つまり,円弧は股に接しているのである。そのとき小円は確定し,必然的に最小値になる。
include("julia-source.txt"); # julia-source.txt ソース
using SymPy
@syms R::positive, x::positive, y::positive, r1::positive, r2::positive, 鈎::positive, 股::positive
@syms R, x, y, r1, r2, 鈎, 股
x = 股
y = R
eq1 = (x - r1)^2 + (y - r1)^2 - (R + r1)^2
eq2 = (x - (r1 + 2sqrt(r1*r2)))^2 + (y - r2)^2 - (R + r2)^2
eq3 = x^2 + (y - 鈎)^2 - R^2;
eq3 から円弧の半径,eq1 から大円の半径,eq2 から小円の半径が順次決定できる。
# R
ans_R = solve(eq3, R)[1]
ans_R |> println
(股^2 + 鈎^2)/(2*鈎)
# r1
ans_r1 = solve(eq1, r1)[1]
ans_r1 |> println
2*R + 股 - 2*sqrt(R*(R + 股))
# r2
@syms d
ans_r2 = solve(eq2, r2)[1] |> x -> apart(x, d) |> factor
ans_r2 |> println
(r1 - 股)^2*(R + r1 - 2*sqrt(R*r1))/(4*(-R + r1)^2)
たとえば,\(鈎 = 3, 股 = 4\) のとき,\(弦 = 5, r1 = 0.666666666666667 = 2/3, r2 = 0.340136054421768 \)である。
ans_r2(R => ans_R, r1 => 0.666666666666667)(鈎 => 3, 股 => 4).evalf() |> println
0.340136054421769
描画関数プログラムのソースを見る
function draw(鈎, 股, more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
R = (股^2 + 鈎^2)/(2*鈎)
x = 股
y = R
r1 = 2R + 股 - 2sqrt(R*(R + 股))
r2 = (r1 - 股)^2*(R + r1 - 2sqrt(R*r1))/(4(r1 - R)^2)
@printf("r1 = %g; R = %g; x = %g; y = %g; r2 = %g\n", r1, R, x, y, r2)
plot([0, 股, 0, 0], [0, 0, 鈎, 0], color=:green, lw=0.5)
circle(x, y, R, :magenta)
circle(r1, r1, r1)
circle(r1 + 2sqrt(r1*r2), r2, r2, :blue)
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(x, y, "円弧:R,(x,y)", :magenta, :center, :bottom, delta=delta)
point(x + 3delta, y - 7delta, "大円:r1,(r1,r1)", :red, :left, mark=false)
point(x + 3delta, y - 10delta, "小円:r2,(r1+2√(r1*r2),r2)", :blue, :left, mark=false)
segment(x, y, 股, 0, :orange)
end
end;
draw(3, 4, true)
以下のアイコンをクリックして応援してください