gpt4 book ai didi

python - 如何监控SciPy.odeint的进程?

转载 作者:行者123 更新时间:2023-12-01 00:19:32 25 4
gpt4 key购买 nike

SciPy 可以通过 scipy.integrate.odeint 或其他包来求解 ode 方程,但它是在函数完全求解后才给出结果。但是,如果 ode 函数非常复杂,程序将花费大量时间(一两天)才能给出整个结果。那么我如何监控求解方程的步骤(当方程尚未完全求解时打印出结果)?

最佳答案

当我在谷歌上搜索答案时,我找不到满意的答案。所以我做了一个简单的gist使用 tqdm 进行概念验证解决方案项目。希望对您有帮助。

编辑:版主要求我对上面链接中发生的情况进行解释。

首先,我使用 scipy 的 OOP 版本的 odeint (solve_ivp),但您可以将其改回 odeint。假设您想要集成从时间 T0T1 的时间,并且希望显示每 0.1% 的进度。您可以修改 ode 函数以采用两个额外参数:pbar(进度条)和 state(当前集成状态)。就像这样:

def fun(t, y, omega, pbar, state):
# state is a list containing last updated time t:
# state = [last_t, dt]
# I used a list because its values can be carried between function
# calls throughout the ODE integration
last_t, dt = state

# let's subdivide t_span into 1000 parts
# call update(n) here where n = (t - last_t) / dt
time.sleep(0.1)
n = int((t - last_t)/dt)
pbar.update(n)

# we need this to take into account that n is a rounded number.
state[0] = last_t + dt * n

# YOUR CODE HERE
dydt = 1j * y * omega
return dydt

这是必要的,因为函数本身必须知道它所在的位置,但 scipy 的 odeint 并没有真正将此上下文提供给函数。然后,您可以将 fun 与以下代码集成:

T0 = 0
T1 = 1
t_span = (T0, T1)
omega = 20
y0 = np.array([1], dtype=np.complex)
t_eval = np.arange(*t_span, 0.25/omega)

with tqdm(total=1000, unit="‰") as pbar:
sol = solve_ivp(
fun,
t_span,
y0,
t_eval=t_eval,
args=[omega, pbar, [T0, (T1-T0)/1000]],
)

请注意,args 中的任何可变内容(例如列表)都会实例化一次,并且可以在函数内进行更改。我建议这样做而不是使用全局变量。

这将显示一个如下所示的进度条:

100%|█████████▉| 999/1000 [00:13<00:00, 71.69‰/s]

关于python - 如何监控SciPy.odeint的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59047892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com