提问人:ppinha 提问时间:11/6/2023 更新时间:11/6/2023 访问量:41
用作 ode 求解器 Python3 的集成方法
Integration method which works as ode solver Python3
问:
我想知道它是否有一个用于累积集成的 Python 函数,它就像一个 ode 求解器,为您制作循环。
我正在尝试 scipy.integrate.cumtrapz,但它将一个已经定义的数组作为积分变量 y 的输入。我想在积分的每次迭代时调用的函数中定义我的积分函数。有没有办法避免 for/while 循环?
先谢谢你
答:
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,然后给出与定义的时间轴相关的解决方案。
评论