ChatGPT实战之PID算法实现

让chatgpt写一段pid控制算法,看看效果如何。
可见效果还是不错的
通过调参也能实现收敛了。实际应用还是要看你具体的需求了。
话不多说上代码:
import matplotlib.pyplot as plt
import numpy as np
class PositionPID(object):
“”“位置式PID算法实现”“”

def __init__(self, target, cur_val, dt, max, min, p, i, d) -> None:
    self.dt = dt  # 循环时间间隔
    self._max = max  # 最大输出限制,规避过冲
    self._min = min  # 最小输出限制
    self.k_p = p  # 比例系数
    self.k_i = i  # 积分系数
    self.k_d = d  # 微分系数

    self.target = target  # 目标值
    self.cur_val = cur_val  # 算法当前PID位置值,第一次为设定的初始位置
    self._pre_error = 0  # t-1 时刻误差值
    self._integral = 0  # 误差积分值

def calculate(self):
    """
    计算t时刻PID输出值cur_val
    """
    error = self.target - self.cur_val  # 计算当前误差
    # 比例项
    p_out = self.k_p * error
    # 积分项
    self._integral += (error * self.dt)
    i_out = self.k_i * self._integral
    # 微分项
    derivative = (error - self._pre_error) / self.dt
    d_out = self.k_d * derivative

    # t 时刻pid输出
    output = p_out + i_out + d_out

    # 限制输出值
    if output > self._max:
        output = self._max
    elif output < self._min:
        output = self._min

    self._pre_error = error
    self.cur_val = output
    return self.cur_val

def fit_and_plot(self, count=200):
    """
    使用PID拟合setPoint
    """
    counts = np.arange(count)
    outputs = []
    disantce=self.calculate()


    for i in counts:
        outputs.append(self.calculate())
        print('Count %3d: output: %f' % (i, outputs[-1]))

    print('Done')
    print(outputs)

    plt.figure()
    plt.axhline(self.target, c='red')
    plt.plot(counts, np.array(outputs), 'b.')
    plt.ylim(min(outputs) - 0.1 * min(outputs), max(outputs) + 0.1 * max(outputs))
    plt.plot(outputs)
    plt.show()
def out_distance(self):
    disantce = self.calculate()
    return disantce

p,i,d=0.4, 0.4, 0.01
pid = PositionPID(2000, 300, 0.5, 8000, 0, p,i,d)##pid比例系数、积分、微分
pid.fit_and_plot(200)
distance=pid.out_distance()
print(distance)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白嫖怪阿七

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值