我想知道是否有一个用于累积积分的Python函数,它的作用就像一个颂歌求解器,为你制作循环。
我正在尝试 scipy.integrate.cumtrapz 但它接受积分变量 y 的已定义数组作为输入。我想在积分的每次迭代时调用的函数内定义积分函数。有没有办法避免 for/while 循环?
提前谢谢您
我尝试解释我的需求。 我们以 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,然后给出相对于定义的时间轴的解决方案。