如何更新参数并传递给Python中的solve_ivp

时间:2020-08-08 08:29:17

标签: python scipy ode

在我的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的可能性

2 个答案:

答案 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函数