用作 ode 求解器 Python3 的集成方法

Integration method which works as ode solver Python3

提问人:ppinha 提问时间:11/6/2023 更新时间:11/6/2023 访问量:41

问:

我想知道它是否有一个用于累积集成的 Python 函数,它就像一个 ode 求解器,为您制作循环。

我正在尝试 scipy.integrate.cumtrapz,但它将一个已经定义的数组作为积分变量 y 的输入。我想在积分的每次迭代时调用的函数中定义我的积分函数。有没有办法避免 for/while 循环?

先谢谢你

循环 for while 循环 集成 ode

评论

0赞 Wrzlprmft 11/6/2023
编辑您的问题以阐明您的问题是什么以及您希望解决方案是什么样子,最好使用一些说明性的输入和输出。另外,请说明现有 ODE 求解器(毕竟存在于 SciPy 中)有什么问题。

答:

0赞 ppinha 11/6/2023 #1

我试着解释我需要什么。 我们以 PI 控制器的积分部分的计算为例。 假设参考信号为:

ref = amp*np.sin(2*np.pi*freq*time)

测量信号是物理模型(微分方程的解)的输出。为了保持代码简单,我们假设:

meas = amp/2*np.sin(2*np.pi*freq*time)

重要的是,测量是在计算PI控制器的输出之后,即在找到积分部分之后,在逻辑上定义的。

我正在尝试这样做:

from scipy import integrate
amp = 1
freq = 100
setpoint = [amp*np.sin(2*np.pi*freq*0)]
meas = [0]
err = [0]

def integral():
    global setpoint, meas, err
    setpoint.append(amp*np.sin(2*np.pi*freq*time))
    print(meas[-1])
    e = setpoint[-1] - meas[-1]
    err.append(e)
    meas.append(amp*np.sin(2*np.pi*freq*time))
    return e

intg = integrate.cumtrapz(integral(), time, initial=0)

但我在输出中得到的只是 ref 的积分。 如果我在函数中打印 meas[-1],它会检索 [0],因此函数 integrate.cumtrapz 只调用 integral() 一次。

我想避免 for 循环,并找到一种使用优化函数进行积分的方法,从而为我制作循环。 这样的函数应该像颂歌求解器一样工作,例如:

def dydt(t,y): return 2*y
time = np.arange(0,1,1e-3)
sol = solve_ivp(dydt, [0,1], [1], t_eval = time)
y = sol.y[0]

在这种情况下,solve_ivp每次需要时都会调用函数 dydt,然后给出与定义的时间轴相关的解决方案。