我有一个二阶微分方程,我想在 python 中求解它。问题是对于其中一个变量,我没有初始条件,0
而只有无穷大的值。谁能告诉我应该提供哪些参数scipy.integrate.odeint
?能解决吗?
方程:
需要根据时间找到 Theta。它的一阶导数在 处等于 0 t=0
。theta 是未知的,t=0
但它会在足够长的时间变为零。其余的都是已知的。作为一个近似值I
可以设置为零,从而消除二阶导数,这应该会使问题更容易。
这远不是一个完整的答案,而是根据 OP 的要求发布在这里。
我在评论中描述的方法是所谓的射击方法,它允许将边界值问题转换为初始值问题。为方便起见,我将把你的函数重命名theta
为y
. 要以数值方式求解您的方程,您首先将其转换为一阶系统,使用两个辅助函数z1 = y
和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])