【发布时间】:2020-11-28 11:17:43
【问题描述】:
在我的 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 是如何实现的
【问题讨论】:
-
为了更清楚你想要实现的目标,正如我之前看到的那样:你想要解决一些隐式 ODE,比如
y'=v, F(t,y,v)=0。您已经有一些等价于这个方程v=g(t,y,v)的定点迭代,它收敛得相当快。剩下的就是为定点迭代找到一个好的初始猜测,并且您想使用最后一个值还是一个好的外推值? -
当然,如果 scipy.integrate 有 DAE 求解器,我建议将公式
y'=v, 0=F(t,y,v)视为半显式 index-1 微分代数方程组。然后自动/内部解决隐式解决方案和良好初始点的问题。 -
没错!该参数满足非线性代数方程。它的解对初始猜测很敏感,因此最好使用当前时间步的值作为初始猜测来开始下一个时间步的非线性求解器迭代。
-
我看到了使用 DAE 的意义。但我觉得更普遍的一点是,是否可以让 ODE 函数返回导数以外的值,以及求解器是否可以使用非导数的返回值。我之前使用过 R 和 Julia,它们都允许某种回调来让 ODE 函数返回不限于导数的值。
-
您描述的更专业的情况是
y'=a*y, 0=F(t,y,a)与适应参数a?a可以有多个根,但您希望a(t)的曲线是连续的。当活动根接近另一个根时,这会成为问题。有时它有助于强制a(t)的导数也是连续的。