这远不是一个完整的答案,但根据OP的要求发布在此处。
我在评论中描述的方法就是所谓的拍摄方法 http://en.wikipedia.org/wiki/Shooting_method,允许将边值问题转换为初始值问题。为了方便起见,我将重命名您的函数theta
as y
。要以数值方式求解方程,您首先需要使用两个辅助函数将其转换为一阶系统,z1 = y
and 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
and 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
makes y = 0
at t = 1000
,我们可怜人的无限,与
a = scipy.optimize.root(y_at_inf, [1])