在我的ODE函数中,我需要迭代求解一个参数方程,直到在每个时间步收敛。我想传递最新的参数值作为下一个时间步的初始值,这样当函数迭代更新参数时,所需的时间会更少。但我不知道该怎么做。ODE函数的代码结构如下所示:
from scipy.integrate import solve_ivp
def run(t, y):
if t==0:
a = 1e-8
nn = 0
while nn<=100:
nn = nn +1
#update a until convergence
return a*y
在某种语言中,我可以返回更新后的参数供积分器使用,但我不知道solve_ivp
如何实现这一点
我想你要找的是以下形式的东西:
这样,您就可以始终使用
a
的最后一个值,因为它是test
类实例的一部分。这并不完全是您所要求的,因为每次solve_ivp
计算f
时都会调用迭代,这将是每个时间步的多次。但是,我认为这是最接近的,因为solve_ivp
似乎没有callback
函数在每个时间步之后调用现在还不清楚您想要的是什么:您是想在一系列参数值上获得ODE的解决方案(即,对于求解完整ODE的每个参数值),还是想在ODE迭代中沿更改参数(当然,您想要内部或外部迭代)
如果是前者,则只需在参数上执行for循环。如果是后者,那么使用实现特定解算器(DOPRI、Radau、RK、BDF等)的解算器类(solver class)可能会更容易、更干净,这些解算器类会将工作委托给ivp。它们提供了一个
step
方法,该方法只执行一个步骤。这样你就可以调整你的参数,控制收敛,以一种与这个特殊情况最相关的方式相关问题 更多 >
编程相关推荐