即时访问“solve_ivp”状态

accessing `solve_ivp` state on-the-fly

有没有办法在集成期间访问 Scipy 的 solve_ivp 的状态?例如,要访问求解器选择的时间步长、错误等?我问的是好奇心。一个类似的未回答问题 has been asked before

一个不那么well-documented的选项是直接调用集成器。以 RK45 为例。

这是一个如何使用它的例子:

import matplotlib.pyplot as plt
from scipy import integrate

def fun(t, y):
    return -y
  
time_bound = 20.
# max_step used to make sure this actually takes multiple steps
max_step = 0.0001
y0 = [5]

rk45 = integrate.RK45(fun, 0, y0, time_bound, max_step=max_step)

# need to manually keep track of solution
t = []
y = []

while rk45.status == "running" and rk45.y[0] < 200:
    t.append(rk45.t)
    y.append(rk45.y)
    # do some additional stuff

    rk45.step()

plt.plot(t, y)
plt.show()

不过,额外信息的数量有点有限。您可以访问步长,但不能访问错误估计。我不建议在求解器之外手动修改解决方案,因为大多数(全部?)求解器不适应此类更改。