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

Posted

技术标签:

【中文标题】python中具有无限初始条件的ODE【英文标题】:ODEs with infinite initlal condition in python 【发布时间】:2013-01-03 18:56:45 【问题描述】:

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

方程:

需要根据时间找到 Theta。它的一阶导数在t=0 处为零。 t=0 不知道 theta,但它会在足够长的时间内变为零。其余的都是已知的。作为近似值I 可以设置为零,从而消除二阶导数,这应该会使问题更容易。

【问题讨论】:

你可以从这个问题***.com/questions/1824751/…找到答案 您不能在t 的两个不同值下给出scipy.integrate.odeint 条件。如果不是无穷大的第二个条件,而是在t = t1,您可以将您的解决方案与scipy.integrate.odeint 嵌套在对scipy.optimize.root 的调用中,以在t = 0 处找到tetha 的值,从而为您提供所需的行为t = t1。也许选择一个足够大的t1 可以让你使用这个想法。您可能还想尝试scicomp.stackexchange.com 寻求帮助,找出解决问题的正确策略。 @Jaime,您能否通过使用scipy.optimize.root 并预测t1 值来提供一个粗略的答案? 【参考方案1】:

这远不是一个完整的答案,而是应 OP 的要求发布在这里。

我在评论中描述的方法是所谓的shooting method,它允许将边界值问题转换为初始值问题。为方便起见,我将把你的函数 theta 重命名为 y。为了数值求解你的方程,你首先将它变成一个一阶系统,使用两个辅助函数,z1 = yz2 = 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 = 0t = 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 = 0t = 1000,我们可怜的人的无限,与

a = scipy.optimize.root(y_at_inf, [1])

【讨论】:

我没有详细阅读,但我通常对这样的方程做的是将它们从静止状态倒退到过去,运行时间倒退,即t --> - \infty

以上是关于python中具有无限初始条件的ODE的主要内容,如果未能解决你的问题,请参考以下文章

Matlab求解具有多个初始条件的 ODE 系统

在python中以复数矩阵为初始值求解ode

如何使用 scipy.integrate.odeint 求解具有时间相关变量的 ODE 系统

在Python中生成和解决同时的ODE

如何在无限行模型中设置初始起始页?

通过Scipy和Numpy使用Python将数据拟合到ODE系统