微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我正在尝试使用solve_ivp 求解一组六个方程代码需要永远运行,我不确定是否有更快的方法来做到这一点

如何解决我正在尝试使用solve_ivp 求解一组六个方程代码需要永远运行,我不确定是否有更快的方法来做到这一点

有问题的方程是:

enter image description here

我在以下函数中定义了它们:

def lorenz_coupled(sigma = 10,r = 28,b = 8/3,C1 = 1,C1x = 1,S = 0.5,O = -11,C2 = 1,C2x = 1,tau = 0.1):
    def rhs(t,X):
    [sigma * (X[1] - X[0]) - C1 * (S*X[3] - O),r*X[0] - X[1] - X[0]*X[2] + C1 * (S*X[4] - O),X[0]*X[1] - b*X[2] + C1x*S*X[5],(sigma * (X[4] - X[3]) - C2 * (X[0] + O)) * tau,(r*X[3] - X[4] - S*X[3]*X[5] + C2 * (X[1] + O)) * tau,(S*X[3]*X[5] - b*X[5] + C2x*X[2]) * tau]
return rhs

其中 X[0] 对应于 x_1、X1 = y_1、X[2] = z_1、X[3] = x_2、X[4] = y_2 和 X[5] = z_2。

然后尝试用solve_ivp求解方程组,方法如下:

#Initial conditions
X0 = np.array([1,1,1])

#maiximum time
t_max = 20
t = np.linspace(0,t_max,10*t_max + 1)
#solve function
rhs_fun = lorenz_coupled(sigma = 10,tau = 0.1)
sol6 = solve_ivp(rhs_fun,(0,t_max),X0,t_eval=t)

但这需要永远运行并且从未给我任何输出。还有其他更快的方法吗?

此外,理想情况下,我希望将其运行到 t_max = 5000 左右,但目前它甚至无法运行 20。

解决方法

您的问题可能过于复杂,以至于 RK45(默认求解器)遇到问题。您是否尝试过其他时间步进方案? scipy documentation 建议

如果它进行了异常多的迭代、发散或失败,则您的问题可能很僵硬,您应该使用“Radau”或“BDF”。 “LSODA”也可以是一个很好的通用选择,但它可能不太方便,因为它包装了旧的 Fortran 代码。 您还可以传递从实现求解器的 OdeSolver 派生的任意类。

您还可以尝试矢量化您的 rhs 评估函数并将 vectorized 标志设置为 True。这应该会提高性能。对于这个问题,提供一个精确的雅可比行列式也应该相当简单,并且会将对您的 rhs 函数的调用次数减少大约一个数量级。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。