python中具有无限初始条件的ODE

row*_*man 5 python scipy ode

我有一个二阶微分方程,我想在 python 中解决它。问题是,对于其中一个变量,我没有初始条件,0而只有无穷大的值。谁能告诉我应该提供哪些参数scipy.integrate.odeint?能解决吗?

方程: 在此处输入图片说明

需要在时间方面找到 Theta。它的一阶导数在 处为零t=0。theta 未知,t=0但它在足够长的时间内变为零。其余的都是已知的。由于近似值I可以设置为零,因此消除了二阶导数,这将使问题更容易。

Jai*_*ime 4

这远不是一个完整的答案,但根据OP的要求发布在此处。

我在评论中描述的方法就是所谓的射击方法,它允许将边值问题转换为初始值问题。为了方便起见,我将把你的函数重命名thetay. 要以数值方式求解方程,您首先需要使用两个辅助函数z1 = y和,将其转换为一阶系统z2 = y',因此您当前的方程

I y'' + g y' + k y = f(y, t)
Run Code Online (Sandbox Code Playgroud)

将被重写为系统

z1' = z2
z2' = f(z1, t) - g z2 - k z1
Run Code Online (Sandbox Code Playgroud)

你的边界条件是

z1(inf) = 0
z2(0) = 0
Run Code Online (Sandbox Code Playgroud)

因此,首先我们设置函数来计算新向量函数的导数:

def deriv(z, t) :
    return np.array([z[1],
                     f(z[0], t) - g * z[1] - k * z[0]])
Run Code Online (Sandbox Code Playgroud)

如果我们有一个条件,我们可以在和z1[0] = a之间进行数值求解,并得到最后一次的值,如下所示t = 0t = 1000y

def y_at_inf(a) :
    return scipy.integrate.odeint(deriv, np.array([a, 0]),
                                  np.linspace(0, 1000, 10000))[0][-1, 0]
Run Code Online (Sandbox Code Playgroud)

所以现在我们需要知道的是 的价值是什么,a我们可怜的人的无限,y = 0t = 1000

a = scipy.optimize.root(y_at_inf, [1])
Run Code Online (Sandbox Code Playgroud)