これは完全な答えにはほど遠いですが、OPのリクエストに応じてここに投稿されています。
コメントで説明した方法は、いわゆるシューティング法であり、境界値問題を初期値問題に変換できます。便宜上、関数の名前theta
をy
. z1 = y
方程式を数値的に解くには、まず、2 つの補助関数とを使用して、それを一次系に変換しz2 = y'
ます。したがって、現在の方程式
I y'' + g y' + k y = f(y, t)
システムとして書き直されます
z1' = z2
z2' = f(z1, t) - g z2 - k z1
そしてあなたの境界条件は
z1(inf) = 0
z2(0) = 0
最初に、新しいベクトル関数の導関数を計算する関数を設定します。
def deriv(z, t) :
return np.array([z[1],
f(z[0], t) - g * z[1] - k * z[0]])
条件があれば、 と の間でz1[0] = a
これを数値的に解くことができ、最後の時間のの値を次のように取得できます。t = 0
t = 1000
y
def y_at_inf(a) :
return scipy.integrate.odeint(deriv, np.array([a, 0]),
np.linspace(0, 1000, 10000))[0][-1, 0]
だから今、私たちが知る必要があるのは、私たちのかわいそうな人の無限大であるの値a
が、y = 0
t = 1000
a = scipy.optimize.root(y_at_inf, [1])