模糊自适应PID

目录

一·传统PID

二·模糊PID控制原理

三·模糊自适应PID工作机制

四·代码实例

五·代码解释

一·传统PID

PID(比例 - 积分 - 微分)控制器是一种广泛应用的反馈控制算法,其控制规律可以表示为:
u(t)=K p ​ e(t)+K i ​ ∫ 0 t ​ e(τ)dτ+K d ​ dt de(t) ​
其中,u(t)是控制器的输出,e(t)是设定值与实际输出的偏差,Kp是比例系数,Ki是积分系数,Kd是微分系数。传统 PID 控制器的参数是固定的,对于具有时变、非线性等特性的系统,控制效果可能不佳。

二·模糊PID控制原理

模糊控制是基于模糊集合理论和模糊逻辑推理的一种智能控制方法。它模仿人类的思维方式,将输入变量(如偏差 e 和偏差变化率 Delta e进行模糊化处理,根据预先制定的模糊规则进行推理,然后将推理结果进行解模糊处理得到精确的控制输出。

三·模糊自适应PID工作机制

模糊自适应 PID 结合了传统 PID 控制和模糊控制的优点。它以偏差 e 和偏差变化率 Delta e 作为模糊控制器的输入,通过模糊推理在线调整 PID 控制器的三个参数 Kp、Ki 和 Kd,以适应系统的动态变化。具体步骤如下:

  1. 输入模糊化:将精确的输入变量 e 和 Delta e转换为模糊集合,例如将其划分为 “负大(NB)”、“负中(NM)”、“负小(NS)”、“零(ZO)”、“正小(PS)”、“正中(PM)”、“正大(PB)” 等模糊子集,并确定它们的隶属度函数。
  2. 模糊规则制定:根据专家经验和系统特性,制定一系列模糊规则。例如:“如果 e 为负大且Delta e为负大,则Kp取正大,Ki取负小,Kd 取正小”。
  3. 模糊推理:根据输入的模糊集合和模糊规则,采用合适的推理方法(如 Mamdani 推理法)得到模糊输出。
  4. 解模糊:将模糊输出转换为精确的参数调整量,常用的解模糊方法有重心法、最大隶属度法等。
  5. 参数调整:根据解模糊得到的调整量,对 PID 控制器的参数 Kp、Ki 和 Kd 进行实时调整。

四·代码实例

import numpy as np

# 定义模糊集合和隶属度函数
class FuzzySet:
    def __init__(self, name, params):
        self.name = name
        self.params = params

    def membership(self, x):
        a, b, c, d = self.params
        if x <= a or x >= d:
            return 0
        elif a < x <= b:
            return (x - a) / (b - a)
        elif b < x <= c:
            return 1
        elif c < x < d:
            return (d - x) / (d - c)

# 定义模糊控制器
class FuzzyController:
    def __init__(self):
        # 定义输入变量的模糊集合
        self.e_fuzzy_sets = [
            FuzzySet("NB", [-np.inf, -3, -2, -1]),
            FuzzySet("NM", [-2, -1.5, -1, -0.5]),
            FuzzySet("NS", [-1, -0.5, 0, 0.5]),
            FuzzySet("ZO", [-0.5, 0, 0, 0.5]),
            FuzzySet("PS", [0, 0.5, 1, 1.5]),
            FuzzySet("PM", [0.5, 1, 1.5, 2]),
            FuzzySet("PB", [1, 2, 3, np.inf])
        ]
        self.de_fuzzy_sets = self.e_fuzzy_sets.copy()

        # 定义输出变量(Kp, Ki, Kd)的模糊集合
        self.Kp_fuzzy_sets = self.e_fuzzy_sets.copy()
        self.Ki_fuzzy_sets = self.e_fuzzy_sets.copy()
        self.Kd_fuzzy_sets = self.e_fuzzy_sets.copy()

        # 模糊规则表(简化示例)
        self.Kp_rules = [
            [3, 3, 2, 2, 1, 0, 0],
            [3, 3, 2, 1, 1, 0, -1],
            [2, 2, 2, 1, 0, -1, -1],
            [2, 2, 1, 0, -1, -1, -2],
            [1, 1, 0, -1, -1, -2, -2],
            [0, 0, -1, -1, -2, -2, -3],
            [0, -1, -1, -2, -2, -3, -3]
        ]
        self.Ki_rules = [
            [-3, -3, -2, -2, -1, 0, 0],
            [-3, -3, -2, -1, -1, 0, 1],
            [-2, -2, -2, -1, 0, 1, 1],
            [-2, -2, -1, 0, 1, 1, 2],
            [-1, -1, 0, 1, 1, 2, 2],
            [0, 0, 1, 1, 2, 2, 3],
            [0, 1, 1, 2, 2, 3, 3]
        ]
        self.Kd_rules = [
            [0, 0, 1, 1, 1, 2, 2],
            [0, 1, 1, 1, 2, 2, 3],
            [1, 1, 1, 2, 2, 3, 3],
            [1, 1, 2, 2, 3, 3, 3],
            [1, 2, 2, 3, 3, 3, 3],
            [2, 2, 3, 3, 3, 3, 3],
            [2, 3, 3, 3, 3, 3, 3]
        ]

    def fuzzy_inference(self, e, de):
        # 输入模糊化
        e_memberships = [fs.membership(e) for fs in self.e_fuzzy_sets]
        de_memberships = [fs.membership(de) for fs in self.de_fuzzy_sets]

        # 模糊推理
        Kp_agg = np.zeros(len(self.Kp_fuzzy_sets))
        Ki_agg = np.zeros(len(self.Ki_fuzzy_sets))
        Kd_agg = np.zeros(len(self.Kd_fuzzy_sets))

        for i in range(len(self.e_fuzzy_sets)):
            for j in range(len(self.de_fuzzy_sets)):
                firing_strength = min(e_memberships[i], de_memberships[j])
                Kp_agg[self.Kp_rules[i][j]] = max(Kp_agg[self.Kp_rules[i][j]], firing_strength)
                Ki_agg[self.Ki_rules[i][j]] = max(Ki_agg[self.Ki_rules[i][j]], firing_strength)
                Kd_agg[self.Kd_rules[i][j]] = max(Kd_agg[self.Kd_rules[i][j]], firing_strength)

        # 解模糊(重心法)
        def defuzzify(agg, sets):
            numerator = 0
            denominator = 0
            for i in range(len(sets)):
                # 这里简单取隶属度函数的中心值
                center = (sets[i].params[1] + sets[i].params[2]) / 2
                numerator += agg[i] * center
                denominator += agg[i]
            if denominator == 0:
                return 0
            return numerator / denominator

        delta_Kp = defuzzify(Kp_agg, self.Kp_fuzzy_sets)
        delta_Ki = defuzzify(Ki_agg, self.Ki_fuzzy_sets)
        delta_Kd = defuzzify(Kd_agg, self.Kd_fuzzy_sets)

        return delta_Kp, delta_Ki, delta_Kd

# 定义PID控制器
class PIDController:
    def __init__(self, Kp, Ki, Kd):
        self.Kp = Kp
        self.Ki = Ki
        self.Kd = Kd
        self.prev_error = 0
        self.integral = 0

    def update(self, setpoint, current_value, delta_t):
        error = setpoint - current_value
        self.integral += error * delta_t
        derivative = (error - self.prev_error) / delta_t
        output = self.Kp * error + self.Ki * self.integral + self.Kd * derivative
        self.prev_error = error
        return output

# 模糊自适应PID控制器
class FuzzyAdaptivePID:
    def __init__(self, Kp, Ki, Kd):
        self.pid = PIDController(Kp, Ki, Kd)
        self.fuzzy_controller = FuzzyController()

    def update(self, setpoint, current_value, delta_t):
        error = setpoint - current_value
        delta_error = error - self.pid.prev_error

        # 模糊推理得到参数调整量
        delta_Kp, delta_Ki, delta_Kd = self.fuzzy_controller.fuzzy_inference(error, delta_error)

        # 更新PID参数
        self.pid.Kp += delta_Kp
        self.pid.Ki += delta_Ki
        self.pid.Kd += delta_Kd

        # 计算PID输出
        output = self.pid.update(setpoint, current_value, delta_t)
        return output


# 示例使用
if __name__ == "__main__":
    # 初始PID参数
    Kp = 1.0
    Ki = 0.1
    Kd = 0.01
    # 设定值
    setpoint = 50
    # 初始输出值
    current_value = 0
    # 时间步长
    delta_t = 0.1
    # 模拟时间
    total_time = 10
    # 迭代次数
    num_steps = int(total_time / delta_t)

    fuzzy_pid = FuzzyAdaptivePID(Kp, Ki, Kd)

    for _ in range(num_steps):
        output = fuzzy_pid.update(setpoint, current_value, delta_t)
        # 这里简单假设系统的响应是线性的
        current_value += output * delta_t
        print(f"Output: {output}, Current Value: {current_value}")

五·代码解释

  1. FuzzySet 类:定义了模糊集合及其隶属度函数。
  2. FuzzyController 类:实现了模糊控制器的主要功能,包括输入模糊化、模糊推理和解模糊。
  3. PIDController 类:实现了传统 PID 控制器的基本功能。
  4. FuzzyAdaptivePID 类:将模糊控制器和 PID 控制器结合起来,实现了模糊自适应 PID 控制。
  5. 示例使用部分:模拟了一个简单的控制系统,展示了模糊自适应 PID 控制器的使用方法。

需要注意的是,这只是一个简化的示例,实际应用中可能需要根据具体的系统特性和要求对模糊规则、隶属度函数等进行调整。

PID代码请看:PID控制器简述(附代码)-CSDN博客

### 模糊PID控制原理 模糊PID控制器通过引入模糊逻辑来动态调整比例(P)、积分(I)和微分(D)三个参数,从而实现更优的过程控制性能[^1]。具体而言,在面对复杂工况变化时,能够依据预设的模糊规则库自动修正这些参数。 对于输入偏差e(t)=r(t)-y(t),以及其变化率de/dt作为两个主要变量参与决策过程;其中r(t)代表设定目标值而y(t)表示实际测量输出量。基于上述两者的组合情况匹配相应的隶属度函数,并经过推理机制得出最终用于调节P-I-D系数的具体数值。 这种设计思路有效地解决了经典PID因固定不变而导致响应迟缓或者超调过大的缺陷,提高了系统的鲁棒性和适应能力。 ```python def fuzzy_pid_controller(e, de_dt): """ 实现简单的模糊PID控制器 参数: e (float): 当前时刻误差 de_dt (float): 误差的变化率 返回: float: 调整后的控制信号u """ # 定义模糊集合及其对应的范围 error_set = {"NB": (-np.inf,-3), "NM":(-3,-1),"NS":(-1,0), "ZO":(0,0), "PS":(0,1), "PM":(1,3), "PB":(3,np.inf)} delta_error_set={"NB": (-np.inf,-2), "NM":(-2,-1),"NS":(-1,0), "ZO":(0,0), "PS":(0,1), "PM":(1,2), "PB":(2,np.inf)} # 计算各模糊集中的隶属度 mu_e = {key:fuzz.trimf(error_range,[error_range]) for key,error_range in error_set.items()} mu_de= {key:fuzz.trimf(delta_error_range,[delta_error_range])for key,delta_error_range in delta_error_set.items()} # 构建模糊规则表 rule_table={ ("NB","NB"):"NB",("NB","NM"):"NB",..., ... ("PB","PM"):"PB",("PB","PB"):"PB" } # 执行最大最小合成运算得到总的输出隶属度分布 output_distribution={output_class:max([min(mu_e[input_1],mu_de[input_2]) for input_1,input_2 in rules.keys() if rules[(input_1,input_2)]==output_class]) for output_class in ["NB","NM","NS","ZO","PS","PM","PB"]} # 解模糊化处理获得实际控制增量Δu u_increment=sum([(center_of_gravity[cls]*value)/sum(output_distribution.values()) for cls,value in output_distribution.items()]) return current_u + u_increment ``` 此段伪代码展示了如何构建一个基础版本的模糊PID控制系统框架,包括定义模糊集合、计算隶属度、建立规则表格、执行模糊推理以及解模糊化获取最终控制动作等环节。 ### 应用实例 在工业自动化领域中,模糊PID已被广泛应用于各种场合下提高生产效率与产品质量。例如: - **温度控制**:当环境条件波动较大时,传统的温控方法难以维持稳定状态。采用模糊PID可以灵活应对不同场景下的需求,确保加热/制冷设备始终处于最佳工作区间内。 - **电机驱动**:为了使电动机能够在负载突变的情况下快速恢复到预期转速而不发生振荡现象,利用该技术可实现实时在线调整PI D增益因子,进而增强整个传动链路的动力学特性。 - **化工流程管理**:针对化学反应釜内的物料浓度监控难题,借助于自适应性强的特点,模糊PID有助于精确保持理想的混合比例,减少副产物生成几率的同时加快工艺进程速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

J-TS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值