智能优化算法应用:基于模拟退火算法PID参数优化 - 附代码

智能优化算法应用:基于模拟退火算法PID参数优化 - 附代码


摘要:本文主要介绍如何用模拟退火算法进行PID参数的优化。

1.PID简介

PID(Proportion-Integration-Differentiation)控 制 器通过比例单元 P、积分单元 I和微分单元 D 的线性组合构成控制量来实现对被控对象的控制,主要适用于基本线性和动态特性不随时间变化的系统。不同的控制规律适用于不同的生产过程,必须合理选择相应的控制规律,否则PID控制器将达不到预期的控制效果当PID控制器采样周期较小时,可以将连续系统离散化,即以一阶差分代替微商,求和代替积分,矩形积分近似代替连续积分,得到如下差分方程:
Δ u ( t ) = K p Δ e ( k ) + K i Δ e ( k ) + K d Δ 2 e ( k ) (1) \Delta u(t)=K_p \Delta e(k) + K_i \Delta e(k) + K_d \Delta ^2e(k)\tag{1} Δu(t)=KpΔe(k)+KiΔe(k)+KdΔ2e(k)(1)
其中e为输入, K p K_p Kp 为比例系数, K i K_i Ki 为积分时间常数, K d K_d Kd 为微分时间常数。

2.模拟退火算法简介

模拟退火算法原理请参考:网络博客

3.适应度函数设计

在此算法中,目标函数设置如下:
F = ∫ 0 ∞ ( w 1 ∣ e ( t ) ∣ + w 2 u 2 ( t ) ) d t (2) F = \int_{0}^{\infty}(w_1|e(t)|+w_2u^2(t))dt \tag{2} F=0(w1e(t)+w2u2(t))dt(2)

其中, e ( t ) e(t) e(t) 为输入值与输出值之间的误差,考虑到迭代过程的动态特性,采取其绝对值的积分; u ( t ) u(t) u(t) 为控制值,加入此项是为了避免控制幅度过大; w 1 w_1 w1 ω 2 ω_2 ω2 为权重,取值范围[0,1]。

此外,还需采取限制措施防止超调,即当出现超调时,在目标函数中额外引入超调项,此时的设置如下:
F = ∫ 0 ∞ ( w 1 ∣ e ( t ) ∣ + w 2 u 2 ( t ) + w 3 ∣ e ( t ) ∣ ) d t , e ( t ) < 0 (3) F =\int_{0}^{\infty}(w_1|e(t)| + w_2u^2(t)+w_3|e(t)|)dt,e(t)<0 \tag{3} F=0(w1e(t)+w2u2(t)+w3e(t))dt,e(t)<0(3)
其中, w 3 w_3 w3为权值,且 w 3 > > w 1 w_3 >>w_1 w3>>w1 ,一般情况下, w 1 = 0.999 , w 2 = 0.001 , w 3 = 100 w_1 =0.999,w_2 =0.001 , w_3 =100 w1=0.999w2=0.001w3=100

所以模拟退火算法的目标就是找到一组pid值,使得F误差最小。

4.算法实验与结果

本文选择二阶系统的传递函数:
G ( s ) = 50 / ( 0.125 s 2 + 7 s ) (4) G(s) = 50/(0.125s^2+7s) \tag{4} G(s)=50/(0.125s2+7s)(4)
模拟退火算法参数设置如下:

SearchAgents_no=50; %  种群数量
Max_iteration=100; %  设定最大迭代次数
lb = -5; %下边界
ub = 5;  %上边界
dim = 3; %维度pid3个参数
S = 1;% 1为单位阶跃响应,其他为正弦输入
fobj = @(X) PID_controller(X,S);%适应度函数

单位阶跃响应寻优结果:

正弦函数输入结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从收敛曲线来看,单位阶跃和正弦输入,算法都在不断寻优。从单位阶跃响应来看,系统上升时间和超调均较小,控制效果明显。从正弦输入结果来看,输入与输出控制量误差较小。

5.参考文献:

[1] 贺圣彦, 曹中清, 余胜威. 基于花授粉算法的PID参数优化[J]. 计算机工程与应用, 2016.

6.Matlab 代码

### 使用模拟退火算法优化PID控制器 #### 方法概述 模拟退火算法作为一种全局优化技术,能够有效避免陷入局部最优解。对于PID控制器而言,其三个主要参数\( K_p \), \( K_i \),以及 \( K_d \) 的选取至关重要。通过引入模拟退火的思想,在一定范围内随机初始化这些参数,并按照一定的降温规律逐步调整它们的位置,从而实现对整个系统的性能改善。 #### 参数设置 在实际操作中,温度T作为控制变量用于决定接受新状态的概率大小;初始温度通常设定得较高以便于充分探索解空间,随着迭代次数增加逐渐降低直至接近零。此外还需要定义最大尝试次数、最小步长等超参以确保搜索过程既全面又高效[^1]。 #### 实现流程 - **初始化**:给定一组起始的PID增益值\[K_{p0}, K_{i0}, K_{d0}\], 设定较高的初始温度 T_max 和较低的目标终止温度 T_min。 - **评估当前配置下的系统响应质量**, 记录下此时的成本函数 J_0 (可以是误差平方积分ISE, 绝对误差总和IAE等形式)[^2]. - 进入循环直到满足停止条件为止: - 随机扰动现有方案得到新的候选解\[K'_p,K'_i,K'_d\]. - 测量并记录该状态下对应的代价J'. - 如果发现更优的选择则直接采纳; 否则依据Metropolis准则按概率接纳较差的结果. - 更新温度至下一阶段. ```python import numpy as np from scipy.optimize import minimize_scalar def pid_cost_function(Ks): """Cost function based on PID controller performance.""" kp, ki, kd = Ks # Simulate system response with given PID gains and calculate cost metric here... return calculated_cost_metric def simulated_annealing_optimization(initial_guesses=[1., 0.5, 0.]): best_solution = initial_guesses.copy() current_temperature = TEMPERATURE_MAX while current_temperature >= TEMPERATURE_MIN: new_candidate = [ max(min(best_solution[i]+np.random.normal(), UPPER_BOUNDS[i]), LOWER_BOUNDS[i]) for i in range(len(best_solution)) ] delta_energy = pid_cost_function(new_candidate)-pid_cost_function(best_solution) if delta_energy<0 or np.exp(-delta_energy/current_temperature)>np.random.rand(): best_solution=new_candidate current_temperature *= COOLING_RATE return best_solution if __name__=='__main__': optimized_gains=simulated_annealing_optimization([KP_INIT, KI_INIT, KD_INIT]) print(f'Optimized Gains: {optimized_gains}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

智能算法研学社(Jack旭)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值