gpt4 book ai didi

python - scipy ode 更新函数内的 set_f_params 设置为 set_solout

转载 作者:行者123 更新时间:2023-11-28 22:25:11 36 4
gpt4 key购买 nike

将 ode 与 scipy 集成时,ode 接受参数多于 t 和 y 的函数。例如:

def fun(t, y, param1, param2):

并且可以使用 set_f_params 方法设置这些参数的值。

但是,当还使用 set_solout 方法并尝试使用此函数内的 set_f_params 更新参数时,集成保持不变,就好像参数没有被修改一样。

您将如何使用 sol_out 修改参数? 我想从 dopri5 密集输出中受益,但我需要在每个时间步更新非齐次项。

下面显示了一个最小示例。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import ode

def fun(t, x, param):
return x - param

def f_param(t):
return t

ode1 = ode(fun).set_integrator('dopri5').set_initial_value([10.0])
ode1.set_f_params(f_param(0))
results1 = ([], [])

ode2 = ode(fun).set_integrator('dopri5').set_initial_value([10.0])
ode2.set_f_params(f_param(0))
results2 = ([], [])

def callback1(t, x):
results1[0].append(t)
results1[1].append(x.copy())

def callback2(t, x):
results2[0].append(t)
results2[1].append(x.copy())
ode2.set_f_params(f_param(t))

ode1.set_solout(callback1)
ode2.set_solout(callback2)

ode1.integrate(3)
ode2.integrate(3)

plt.plot(results1[0], results1[1], 'o-', alpha=0.7, label='ode1')
plt.plot(results2[0], results2[1], '.--', label='ode2')
plt.legend()

结果如下所示:

image

最佳答案

这就是使用 the new ODE solvers 的方式将在 SciPy 1.0 中发布:

from functools import partial

import numpy as np
from scipy.integrate import solve_ivp

import matplotlib.pyplot as plt


def fun_fixed(t, x, param):
return x - param

sol_fixed = solve_ivp(
partial(fun_fixed, param=0), (0, 3), [10.0], dense_output=True)

def fun_param(t, x, fun):
return -x + fun(t)

def f_param(t):
return t

sol_param = solve_ivp(
partial(fun_param, fun=f_param), (0, 3), [10.0], dense_output=True)

t = np.linspace(0, 3, num=16)

plt.figure(figsize=(8, 5))
plt.plot(t, sol_fixed.sol(t)[0], 'o-', alpha=0.7, label='ode1')
plt.plot(t, sol_param.sol(t)[0], 's-.', label='ode3')
plt.legend()

Two solutions

关于python - scipy ode 更新函数内的 set_f_params 设置为 set_solout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45693274/

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