来自 scipy 的 solve_ivp 没有整合整个 tspan 范围

计算科学 Python scipy 微分方程 麻木的
2021-12-17 18:54:53

我正在尝试在 Python 中使用solve_ivpfromscipy来解决 IVP。我指定了to的tspan参数,如下所示。但是,由于某种原因,我得到的解决方案总是在 t=2.5 左右停止。solve_ivp(0,10)

from scipy.integrate import solve_ivp
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as optim

def dudt(t, u):
    return u*(1-u/12)-4*np.heaviside(-(t-5), 1)

ic = [2,4,6,8,10,12,14,16,18,20]

sol = solve_ivp(dudt, (0, 10), ic, t_eval=np.linspace(0, 10, 10000))

for solution in sol.y:
    y = [y for y in solution if y >= 0]
    t = sol.t[:len(y)]
    plt.plot(t, y)

在此处输入图像描述

1个回答

您可以检查sol对象以了解集成失败的原因。它提供消息“所需的步长小于数字之间的间距”。这通常表示右侧函数中的实现错误或 ODE 中的奇点。

您的 ODE 很简单,可以找到确切的解。我们可以考虑标量情况,因为每个组件都是完全独立的。对于初始条件u(0)=2, 精确解是

u(t)=623tan(t23+tan1(23)).
正切函数在π2t2.47. solve_ivp不能处理奇点(也不应该期望)。

你必须决定你的 ODE 是否正确以及它是否应该具有这个奇点。即使没有它,也需要注意处理不连续性t=5.