作为ode求解器Python3的积分方法

问题描述 投票:0回答:1

我想知道是否有一个用于累积积分的Python函数,它的作用就像一个颂歌求解器,为你制作循环。

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

提前谢谢您

loops for-loop while-loop integration ode
1个回答
0
投票

我尝试解释我的需求。 我们以 PI 控制器积分部分的计算为例。 假设参考信号是:

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

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

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

重要的是,meas 是在计算 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,然后给出相对于定义的时间轴的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.