在我的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
的可能性
答案 0 :(得分:1)
目前尚不清楚要执行的操作:要在一系列参数值上获得ODE的解决方案(即,对于求解完整ODE的参数的每个值)还是要更改参数 以及ODE迭代(IOW,您需要内部或外部迭代)。
如果是前者,则只需对参数进行for循环。如果是后者,则使用实现特定求解器(DOPRI,Radau,RK,BDF等)的求解器类可能会更容易,更简洁,其中solve_ivp将工作委托给该求解器。他们提供了step
方法,该方法执行一个步骤。这样您就可以以与这种特定情况最相关的方式调整参数,控制收敛等。
答案 1 :(得分:0)
我认为您要寻找的是以下形式的东西:
class test:
a = 1e-8
def f(self, t, y):
## do iter on self.a
return self.a*y
t = test()
# solve_ivp(t.f, .....)
这样,您始终可以使用a
的最后一个值,因为它是test
类实例的一部分。这并不是您所要的,因为每次solve_ivp
评估f
时都会调用该迭代,每个时间步将重复多次。但是,我认为这是您可以获得的最接近的方法,因为solve_ivp
似乎没有在每个时间步之后调用的callback
函数