Python中如何更新参数和传递来解决_ivp

2024-03-28 11:41:21 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的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如何实现这一点


Tags: 函数代码fromimport参数时间nnscipy
2条回答

我想你要找的是以下形式的东西:

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函数在每个时间步之后调用

现在还不清楚您想要的是什么:您是想在一系列参数值上获得ODE的解决方案(即,对于求解完整ODE的每个参数值),还是想在ODE迭代中沿更改参数(当然,您想要内部或外部迭代)

如果是前者,则只需在参数上执行for循环。如果是后者,那么使用实现特定解算器(DOPRI、Radau、RK、BDF等)的解算器类(solver class)可能会更容易、更干净,这些解算器类会将工作委托给ivp。它们提供了一个step方法,该方法只执行一个步骤。这样你就可以调整你的参数,控制收敛,以一种与这个特殊情况最相关的方式

相关问题 更多 >