用Scipy的solve\u ivp()在Python中模拟PID控制有更好的方法吗?

2024-09-27 23:23:34 发布

您现在位置:Python中文网/ 问答频道 /正文

试着做一个家庭作业问题,可能需要一些帮助。我试图用Scipy的integrate.solve_ivp()函数在Python中模拟PID控制。你知道吗

我的方法是在函数的右侧运行PID代码,使用全局变量并在每个时间步结束时将它们附加到全局矩阵,如下所示:

solution = integrate.solve_ivp(rhs, tspan, init, t_eval=teval)
def rhs(dt, init):

    global old_time, omega0dot, rhs_t, omega0dotmat
    timestep = dt - old_time
    old_time = dt

    # UNPACK INITIAL
    x = init[0]
    y = init[1]
    z = init[2]
    xdot = init[3]
    ydot = init[4]
    zdot = init[5]
    alpha = init[6]
    beta = init[7]
    gamma = init[8]
    alphadot = init[9]
    betadot = init[10]
    gammadot = init[11]

    # SOLVE EQUATIONS
    (xddot, yddot, zddot, alphaddot, betaddot, gammaddot) = dynamics(k_d, k_m, x, y, z, xdot, ydot, zdot, alpha, beta, gamma, alphadot, betadot, gammadot, omega0dot)

    # CONTROL SYSTEMS
    z_des = 10

    err_z = z_des - z

    zPID = (1*err_z) + hover

    omega0dot = zPID

    rhs_t.append(dt)
    omega0dotmat.append(omega0dot)

    return [xdot, ydot, zdot, xddot, yddot, zddot, alphadot, betadot, gammadot, alphaddot, betaddot, gammaddot]

全局变量在此函数外部初始化。你可能注意到,我特别尝试模拟一个四旋翼直升机,其中四旋翼的线性和角运动依赖于omega0dot,它代表旋翼速度,我尝试用PID控制。你知道吗

我的困难在于integrate.solve_ivp()时间步。PID控制的积分和微分部分都依赖于时间步长,但是solve_ivp()函数有一个可变的时间步长,有时甚至在时间上向后,有时没有时间步长(即dt<;=0)。你知道吗

我想知道是否有更好的方法来实现这个PID控制,或者我是否把dt这个术语解释错了。感谢您的帮助!你知道吗

谢谢你


Tags: 函数timeinit时间dtpidoldintegrate

热门问题