我正在使用
solve_ivp
和 BDF
方法来求解复杂的 ODE 系统。
我在不同的系统参数下进行了测试。通常需要几秒钟才能得到结果。但是,对于其中一种情况,它会以超小的步长(小于 1e-8)继续运行。这可能会导致采取无限的步骤,并且可能需要几天到几周的时间才能得到结果。 (
t
在大约 20 分钟内从 0.00017 增加到 0.00020,而 t_end=100
)
为了避免这种情况下无休止的运行,我尝试使用
multiprocessing
的超时功能。它适用于其他示例,但未能终止solve_ivp
。
是否有任何其他解决方案可以终止 ODE 积分(在给定时间或步骤数下)?如果有任何方面没有明确提出,请告诉我。非常感谢:-)
您可以使用带有
events
参数的回调函数来在一定时间或步骤数后停止积分:
from scipy.integrate import solve_ivp
import time
def system(t, y):
dydt = [y[1], -y[0]]
return dydt
y0 =[0, 0]
t_span = [0, 100]
start_time = time.time()
def stop_event(t, y):
return min(time.time() - start_time - 10, len(y) - 1000)
stop_event.terminal = True
solution = solve_ivp(system, t_span, y0, method='BDF', events=stop_event)
如果这对你有帮助,不客气😉,如果没有......那就好了😘。