「高さ h からの斜方投射の最大到達距離を求める準備」のページを参照。
最大水平到達距離となる打ち出し角度 $\theta$ を求めるには,平方根を含む非線形方程式を解く必要がるので,SymPy や Maxima でやってみた。
SymPy で高さ $H$ からの斜方投射の最大水平到達距離を求める
必要なモジュールの import
from sympy import *
# 1文字変数の Symbol の宣言が省略できる
from sympy.abc import *
水平到達距離 $L$
$u \equiv \tan\theta$ として規格化された水平到達距離 $L$ を $u$ で表すと
\begin{eqnarray}
L(u, H)
&=& \frac{1}{1+u^2} \left\{u + \sqrt{(1+2H) u^2 + 2H} \right\}
\end{eqnarray}
def L(u, H):
return (u+sqrt((1+2*H)*u**2 + 2*H))/(1 + u**2)
L(u, H)
$L$ が最大となる $u$ を求める
$\displaystyle \frac{d L(u, H)}{du} = 0$ となる $u \equiv u_{\rm max}$ を solve()
で求めます。
dL = diff(L(u, H), u)
sols = solve(dL, u)
sols
さすが SymPy! あっさりと答えを出してくれましたねぇ… などと安易に信じてはいけません!(私も最初はすっかり騙されました。)
一つめ(Python では [0]
番め)が解になっていないことは,実際に dL
に代入してみればわかります。
factor(dL.subs(u, sols[0]))
simplify(
factor(dL.subs(u, sols[0])*2*(1+H)**2/(1+2*H))
)
SymPy はなかなか気がきかなくて,平方根の項を簡単化してくれませんが,これがゼロにならないのは明らかです。
一方で,二つめ(Python では [1]
番め)のほうは代入すると,確かに解になっているようです。
simplify(
factor(dL.subs(u, sols[1])*2*(1+H)**2/(1+2*H))
)
SymPy はなかなか気がきかなくて,平方根の項を簡単化してくれませんが,これがゼロになるのは明らかです。
平方根を含む方程式の解を求めるときには,こっそり両辺を二乗したりするので,その際に本来の方程式の解ではない,うその解が紛れ込む可能性があります。
元の方程式 dL = 0
を確かに満たしている解かどうかを確認する必要があります。
最終的に,$L$ が最大となる $u$ の値 $u_{\rm max}$ は…
def umax(H):
return 1/sqrt(1 + 2*H)
最大水平到達距離 $L_{\rm max}$
simplify(L(umax(H), H))
つまり,高さ $H$ のときの最大水平到達距離は,
$$L_{\rm max} = \sqrt{1 + 2H}$$
となることがわかります。
Maxima で高さ $H$ からの斜方投射の最大水平到達距離を求める
水平到達距離 $L$
$u \equiv \tan\theta$ として規格化された水平到達距離 $L$ を $u$ で表すと
\begin{eqnarray}
L(u, H)
&=& \frac{1}{1+u^2} \left\{u + \sqrt{(1+2H) u^2 + 2H} \right\}
\end{eqnarray}
L(u, H):= 1/(1+u**2)*(u+sqrt((1+2*H)*u**2 + 2*H));
$L$ が最大となる $u$ を求める
$\displaystyle \frac{d L(u, H)}{du} = 0$ となる $u \equiv u_{\rm max}$ を solve()
で求めればいいのですが,Maxima は平方根のある方程式が苦手なので,Maxima のために解きやすい式になおしてあげます。
dL: diff(L(u, H), u), ratsimp;
dL
の分子がゼロとなる式にします。
eq: (num(dL) +(2*H+1)*u**3 + (2*H-1)*u)/(u**2-1) = (+(2*H+1)*u**3 + (2*H-1)*u)/(u**2-1);
さらに両辺を二乗して平方根をなくします。
eq2: lhs(eq)**2 = rhs(eq)**2;
ここまで簡単にすると,Maxima も solve()
で解いてくれます。
sols: solve(eq2, u);
もとの方程式 dL = 0
の解になっているか,確認します。虚数は問題外なのであとの2つ。
ev(dL, sols[3]), ratsimp;
ev(dL, sols[4]), ratsimp;
平方根を含む方程式の解を求めるときには,両辺を二乗したりするので,その際に本来の方程式の解ではない,うその解が紛れ込む可能性があります。
元の方程式 dL = 0
を確かに満たしている解かどうかを確認する必要があります。
最終的に,$L$ が最大となる $u$ の値 $u_{\rm max}$ は…
umax(H):= 1/sqrt(1 + 2*H);
最大水平到達距離 $L_{\rm max}$
L(umax(H), H), ratsimp;
つまり,高さ $H$ のときの最大水平到達距離は,
$$L_{\rm max} = \sqrt{1 + 2H}$$
となることがわかります。