高さ h からの斜方投射の最大水平到達距離を求める

高さ h からの斜方投射の最大到達距離を求める準備」のページを参照。

最大水平到達距離となる打ち出し角度 $\theta$ を求めるには,平方根を含む非線形方程式を解く必要がるので,SymPy や Maxima でやってみた。

SymPy で高さ $H$ からの斜方投射の最大水平到達距離を求める

必要なモジュールの import

In [1]:
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}

In [2]:
def L(u, H):
    return (u+sqrt((1+2*H)*u**2 + 2*H))/(1 + u**2)
L(u, H)
Out[2]:
$\displaystyle \frac{u + \sqrt{2 H + u^{2} \cdot \left(2 H + 1\right)}}{u^{2} + 1}$

$L$ が最大となる $u$ を求める

$\displaystyle \frac{d L(u, H)}{du} = 0$ となる $u \equiv u_{\rm max}$ を solve() で求めます。

In [3]:
dL = diff(L(u, H), u)
sols = solve(dL, u)
sols
Out[3]:
[-sqrt(1/(2*H + 1)), sqrt(1/(2*H + 1))]

さすが SymPy! あっさりと答えを出してくれましたねぇ… などと安易に信じてはいけません!(私も最初はすっかり騙されました。)

一つめ(Python では [0] 番め)が解になっていないことは,実際に dL に代入してみればわかります。

In [4]:
factor(dL.subs(u, sols[0]))
Out[4]:
$\displaystyle – \frac{\left(2 H + 1\right) \left(- H \sqrt{2 H + 1} \sqrt{\frac{1}{2 H + 1}} – H + \frac{2 H}{2 H + 1} – 1 + \frac{1}{2 H + 1}\right)}{2 \left(H + 1\right)^{2}}$
In [5]:
simplify(
    factor(dL.subs(u, sols[0])*2*(1+H)**2/(1+2*H))
)
Out[5]:
$\displaystyle H \left(\sqrt{2 H + 1} \sqrt{\frac{1}{2 H + 1}} + 1\right)$

SymPy はなかなか気がきかなくて,平方根の項を簡単化してくれませんが,これがゼロにならないのは明らかです。

一方で,二つめ(Python では [1] 番め)のほうは代入すると,確かに解になっているようです。

In [6]:
simplify(
    factor(dL.subs(u, sols[1])*2*(1+H)**2/(1+2*H))
)
Out[6]:
$\displaystyle H \left(- \sqrt{2 H + 1} \sqrt{\frac{1}{2 H + 1}} + 1\right)$

SymPy はなかなか気がきかなくて,平方根の項を簡単化してくれませんが,これがゼロになるのは明らかです。

平方根を含む方程式の解を求めるときには,こっそり両辺を二乗したりするので,その際に本来の方程式の解ではない,うその解が紛れ込む可能性があります。

元の方程式 dL = 0 を確かに満たしている解かどうかを確認する必要があります。

最終的に,$L$ が最大となる $u$ の値 $u_{\rm max}$ は…

In [7]:
def umax(H):
    return 1/sqrt(1 + 2*H)

最大水平到達距離 $L_{\rm max}$

In [8]:
simplify(L(umax(H), H))
Out[8]:
$\displaystyle \sqrt{2 H + 1}$

つまり,高さ $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}

In [1]:
L(u, H):= 1/(1+u**2)*(u+sqrt((1+2*H)*u**2 + 2*H));
Out[1]:
\[\tag{${\it \%o}_{1}$}L\left(u , H\right):=\frac{1}{1+u^2}\,\left(u+\sqrt{\left(1+2\,H\right)\,u^2+2\,H}\right)\]

$L$ が最大となる $u$ を求める

$\displaystyle \frac{d L(u, H)}{du} = 0$ となる $u \equiv u_{\rm max}$ を solve() で求めればいいのですが,Maxima は平方根のある方程式が苦手なので,Maxima のために解きやすい式になおしてあげます。

In [2]:
dL: diff(L(u, H), u), ratsimp;
Out[2]:
\[\tag{${\it \%o}_{2}$}-\frac{\left(u^2-1\right)\,\sqrt{\left(2\,H+1\right)\,u^2+2\,H}+\left(2\,H+1\right)\,u^3+\left(2\,H-1\right)\,u}{\sqrt{\left(2\,H+1\right)\,u^2+2\,H}\,\left(u^4+2\,u^2+1\right)}\]

dL の分子がゼロとなる式にします。

In [3]:
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);
Out[3]:
\[\tag{${\it \%o}_{3}$}-\sqrt{\left(2\,H+1\right)\,u^2+2\,H}=\frac{\left(2\,H+1\right)\,u^3+\left(2\,H-1\right)\,u}{u^2-1}\]

さらに両辺を二乗して平方根をなくします。

In [4]:
eq2: lhs(eq)**2 = rhs(eq)**2;
Out[4]:
\[\tag{${\it \%o}_{4}$}\left(2\,H+1\right)\,u^2+2\,H=\frac{\left(\left(2\,H+1\right)\,u^3+\left(2\,H-1\right)\,u\right)^2}{\left(u^2-1\right)^2}\]

ここまで簡単にすると,Maxima も solve() で解いてくれます。

In [5]:
sols: solve(eq2, u);
Out[5]:
\[\tag{${\it \%o}_{5}$}\left[ u=-i , u=i , u=-\frac{1}{\sqrt{2\,H+1}} , u=\frac{1}{\sqrt{2\,H+1}} \right] \]

もとの方程式 dL = 0 の解になっているか,確認します。虚数は問題外なのであとの2つ。

In [6]:
ev(dL, sols[3]), ratsimp;
ev(dL, sols[4]), ratsimp;
Out[6]:
\[\tag{${\it \%o}_{6}$}\frac{2\,H^2+H}{H^2+2\,H+1}\]
Out[6]:
\[\tag{${\it \%o}_{7}$}0\]

平方根を含む方程式の解を求めるときには,両辺を二乗したりするので,その際に本来の方程式の解ではない,うその解が紛れ込む可能性があります。

元の方程式 dL = 0 を確かに満たしている解かどうかを確認する必要があります。

最終的に,$L$ が最大となる $u$ の値 $u_{\rm max}$ は…

In [7]:
umax(H):= 1/sqrt(1 + 2*H);
Out[7]:
\[\tag{${\it \%o}_{8}$}{\it umax}\left(H\right):=\frac{1}{\sqrt{1+2\,H}}\]

最大水平到達距離 $L_{\rm max}$

In [8]:
L(umax(H), H), ratsimp;
Out[8]:
\[\tag{${\it \%o}_{9}$}\sqrt{2\,H+1}\]

つまり,高さ $H$ のときの最大水平到達距離は,

$$L_{\rm max} = \sqrt{1 + 2H}$$

となることがわかります。