【问题标题】:Python solve_ivp [scipy.integrate]: how to set the number of output points of your integration process?Python solve_ivp [scipy.integrate]:如何设置你的集成过程的输出点数?
【发布时间】:2021-05-10 21:56:11
【问题描述】:

我想对具有不同初始条件的相同微分方程进行积分,并且我想比较我获得的每个点。不幸的是,如果我这样做:

sol = solve_ivp(my_model, [0, leng], [1,1,1], method="LSODA", args=(rho, sigma, beta), dense_output=False)

sol_2 = solve_ivp(my_model, [0, leng], [1+0.001,1+0.001, 1-0.001], method="LSODA", args=(rho, sigma, beta), dense_output=False)

这两个积分过程中得到的点数不同

我不想使用插值程序,因为我想使用真实数据

我可以设置解的点数吗?

【问题讨论】:

  • 我可以问一下“my_model”和leng吗?
  • 您对与stackoverflow.com/questions/21859870/… 中观察到的行为相关的插值有疑问吗?
  • 您可以将系统的两个实例放入同一个 ODE 函数中,这样您就可以集成一个 6 维状态。然后,您可以在实例中最小化步长,但同时获得值。因此,总体误差比单独集成略少。
  • @RafaelValero :根据参数名称和维度,测试模型很可能是 Lorenz 吸引子。有了给定的差异,解决方案应该很快就会明显地分开,最迟在 leng=20 时,可能已经在 leng=5 时。因此,要观察非混乱的常规错误行为,必须设置leng=2
  • @RafaelValero 是的,分离没问题,但我想要两条具有相同点数的轨迹。得到大致等于 10^4 的点数差异并不奇怪。

标签: python scipy differential-equations numerical-integration


【解决方案1】:

比较初始条件不同的实例的一种变体是将它们全部整理到一个大系统中,在这个系统中,它们都以相同的步骤顺序同时求解

def multi_Lorenz(t,u):
    return np.concatenate([Lorenz(t,uu) for uu in u.reshape([-1,3])])

u0 = np.concatenate([[1+k*1e-5,1+k*1e-5,1-k*1e-5] for k in range(11)])
res = solve_ivp(multi_Lorenz,[1,25],u0, method="LSODA")

plt.figure(figsize=(14,6))
plt.plot(res.t, res.y[::3].T)
plt.grid(); plt.show()

解决方案系列的可见拆分位于t=22,但在与作为参考的k=0 图表的差异中,初始差异的十倍增加几乎立即发生在t=1 附近的峰值中,并且仍然存在在该范围内高达t=12

N = max(k for k,t in enumerate(res.t) if t<12)
plt.figure(figsize=(14,6))
plt.plot(res.t[:N], (res.y[3::3,:N]-res.y[0,:N]).T)
plt.grid(); plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2014-06-02
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    相关资源
    最近更新 更多