【控制】粒子群算法优化SO 调谐 PI 控制器,用于可变惯量 BLDC 电机的速度控制附matlab代码

简介: 【控制】粒子群算法优化SO 调谐 PI 控制器,用于可变惯量 BLDC 电机的速度控制附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法  神经网络预测雷达通信 无线传感器

信号处理图像处理路径规划元胞自动机无人机 电力系统

⛄ 内容介绍

针对工业对永磁同步电机调速系统的更高调速精度,更快响应速度这些要求,该文提出了一种新的永磁同步电机控制策略,即利用粒子群算法对模糊PI控制器(Fuzzy PI)的2个参数因子kp,ki进行全局优化,充分发挥了粒子群算法的快速性.利用Matlab工具进行仿真验证,观察控制系统的一阶动态响应.结果表明,系统具有很强的鲁棒性,能够很好地跟踪负载变化,动态响应快,速度跟随准确.

⛄ 部分代码

% PSO Algorithm Radoslaw Wierzbowski

%%

%Motor parameters initialization

clear;

clc;

Pn=4e3;                     %Nominal power

Un=280;                     %Nominal voltage

In=17.5;                    %Nominal current

wn=1980*pi/30;              %Angular velocity

Rn=1.69;                    %Armatures resistance

Ln=6.6e-3;                  %Armature inductance

J=0.02*2;                   %Inertia (double catalogue value)

Tn=19.3;                    %Nominal torque


%Fluxes calculated from diffrent equations basing on nominal values:

psi_E=(Un-Rn*In)/wn;        %from armature equation (Un=Rn*In+wn*psi_E)        

psi_M=Tn/In;                %from torque equation (Tn=psi_M*In)


f_sw=4000;                  %Converters switching frequency

T_sw=1/f_sw;

Tdelay=0.5*T_sw;            %Approximated delay

V_dc=1.2*Un;

Kconv=V_dc;                 %Converters amp

c=0.1*Tn/wn;                %friction coefficient


ki=1/In;                    %Measuring amp - current

kw=1/wn;                    %Measuring amp - velocity

ku=1/Un;                    %Measuring amp - voltage

Tsim=1e-4;                  %Simulation max step size


%Calculation of parameters for PI current controller (modulus optimum)

Ks=Kconv/Rn/In;            

T1=Ln/Rn;                   %Dominant time constant

Tsum=Tdelay;                %Sum of small time constants

Kri=1/(2*Ks*Tsum);          

Tr=T1;    

%Upper boundaries calculation (symmetrical optimum)

Jprop=10*J;        

Tr2=8*Tsum;

Kr2=Jprop/(8*psi_M*kw*(1/ki)*(2*Tsum)^2);

Kpmax=Tr2*Kr2;

Kimax=Kr2;

%%

%Swarm initialization:

n = 20;                %Number of particles

dim =2;                %Dimensions

steps=120;             %Number of steps

c1=2.05;               %Cognitive factor

c2=2.05;               %Exploration factor

fi=c1+c2;                                            

X=2/abs((2-fi-((fi^2)-(4*fi))^(1/2)));     %Constriction factor

rng('shuffle');                            %Seed initialization

Evap=1.5;                                  %Evaporation factor

velocity_clamping = 10;                    %Velocity clamping

diversity_limit = 1;                       %Diversity limit


psi1=rand(2,1);                                    

psi2=rand(2,1);                            %Initial random coefficients

swarmdir(1)=1;                            

swarmdir(2)=1;                             %Initial directions


position=(50*rand(dim,n));                 %Position initialization

speed=10*rand(dim,n);                      %Velocity initialization

change1=35;                                %Step of first inertia change

change2=80;                               %Step of second inertia change


%%

%Initial values

Pbest=position;                            %Matrix of personal best positions

ObjFun=0*rand(n,1);                        %Matrix of objective function values

step=1;  

%Calculation of initial Kp and Ki and ObjFun values:

for i=1:n

   Kp=Pbest(1,i);

   Ki=Pbest(2,i);

   ObjFun(i)=optimize(Kp,Ki);             %Optimize functions is in another file

end

bestlocalObjFun=ObjFun;                    %Matrix of best local objective function values

[globalObjFun,g]=min(bestlocalObjFun);     %Best global objective function value

Gbest = Pbest(:,g) ;                       %Best global position



speed(:,i)=X*(speed(:,i)+(fi/2)*swarmdir'.*(psi1.*(Pbest(:,i)-position(:,i)))+(fi/2)*swarmdir'.*(psi2.*(Gbest-position(:,i)))); %tablica predkosci

position(:,i)=position(:,i)+speed(:,i);

%

%%

%Initialization done

%Main loop:


for step=1:steps

fprintf('Step %i \n', step);  

fprintf('Found optimum: \n Kp= %0.3f \n Ki= %0.3f \n', Gbest(1,1),Gbest(2,1));    

 

   %Inertia change conditions

   if step==change1      

       J=J*5;

   end

   if step==change2      

       J=J*0.2;

   end

   

   %Asynchronous update rule

   for i=1:n                                                              

       

        %Kp and Ki assignment and simulation

        Kp=position(1,i);

        Ki=position(2,i);

        ObjFun(i)=optimize(Kp,Ki);

       

       %Evaporation conditions

       if 0.01+ObjFun(i)>=bestlocalObjFun(i)*Evap              

           bestlocalObjFun(i)=Evap*bestlocalObjFun(i);

        else

          bestlocalObjFun(i)=ObjFun(i)+0.01;

          Pbest(:,i)=position(:,i);                      

       end

   

       %Gbest calculation

       [globalObjFun,g]=min(bestlocalObjFun);

       Gbest=Pbest(:,g);                                      

       

       %Swarm diversity calculation

       swarm_div(1) = 0.5*(max(position(1,:))-min(position(1,:)));  

       swarm_div(2) = 0.5*(max(position(2,:))-min(position(2,:)));

   

       %Direction change in case of too high diversity

       for d=1:2,                                                    

               if swarm_div(d) < diversity_limit,

                   swarmdir(d) = -1;

               else

                   swarmdir(d) = 1;

               end

       end

           

       %Position and speed calculation

       psi1=rand(2,1);                                                                                                            

       psi2=rand(2,1);

       speed(:,i)=X*(speed(:,i)+(fi/2)*swarmdir'.*(psi1.*(Pbest(:,i)-position(:,i)))+(fi/2)*swarmdir'.*(psi2.*(Gbest-position(:,i))));

       speed(1,i)= min(max(-velocity_clamping,speed(1,i)),velocity_clamping);

       speed(2,i)= min(max(-velocity_clamping,speed(2,i)),velocity_clamping);

       position(:,i)=position(:,i)+speed(:,i);



   

       %Walls on Kp=0, Ki=0, Kpmax and Kimax

       if position(1,i)<0

        position(1,i) =  abs(position(1,i));

        speed(1,i)=abs(speed(1,i));

       end

       if position(2,i)<0

          position(2,i) = abs(position(2,i));

          speed(2,i) = abs(speed(2,i));

       end

       if position(1,i)>Kpmax

        position(1,i) = position(1,i)-(2*(position(1,i)-Kpmax));

        speed(1,i)=-speed(1,i);

       end

       if position(2,i)>Kimax

        position(2,i) =  position(2,i)-(2*(position(2,i)-Kimax));

        speed(2,i)=-speed(2,i);

       end

   

   %History logging for plotting purposes

   History(1,step,:)=position(1,:);

   History(2,step,:)=position(2,:);

   speedHistory(1,step,:)=speed(1,:);

   speedHistory(2,step,:)=speed(2,:);

   GbestHistory(step,:)=Gbest;

   Gbestvalue(step,:)=globalObjFun;

   %figure(1);

   %for i=1:n                                              

   %  subplot(2,1,1);

   %   scatter(log10(position(2,i)),log10(position(1,i)));

   %    title('Pozycje czastek');

   %    xlabel('log10(Ki)'); ylabel('log10(Kp)');

   %    axis([0 3 0 3]);

   %    hold on

   %end


 %  hold off;

   end

end


   

Kp=Gbest(1,1);

Ki=Gbest(2,1);

fprintf('Optimum found: \n Kp= %0.3f \n Ki= %0.3f \n', Gbest(1,1),Gbest(2,1));


figure();

subplot(3,1,1);

scatter(1:steps, GbestHistory(:,1));

hold;

plot([change1-1, change1-1], [1, max(GbestHistory(:,1))], 'LineWidth', 1, 'Color', 'blue');

plot([change2-1, change2-1], [1, max(GbestHistory(:,1))], 'LineWidth', 1, 'Color', 'blue');

xlabel('iteration');

ylabel('Kp');

grid;

subplot(3,1,2);

scatter(1:steps, GbestHistory(:,2));

hold;

plot([change1-1, change1-1], [1, max(GbestHistory(:,2))], 'LineWidth', 1, 'Color', 'blue');

plot([change2-1, change2-1], [1, max(GbestHistory(:,2))], 'LineWidth', 1, 'Color', 'blue');

xlabel('iteration');

ylabel('Ki');

grid;

subplot(3,1,3);

scatter(1:steps, Gbestvalue);

hold;

plot([change1-1, change1-1], [1, max(Gbestvalue)], 'LineWidth', 1, 'Color', 'blue');

plot([change2-1, change2-1], [1, max(Gbestvalue)], 'LineWidth', 1, 'Color', 'blue');

xlabel('iteration');

ylabel('Gbest Value');

grid;

⛄ 运行结果

⛄ 参考文献

[1]陈旭, 宋正强. 基于粒子群优化的永磁同步电机PI控制[J]. 中国高新技术企业, 2008(22):2.

⛄ 完整代码

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料


相关文章
|
5月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
240 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
5月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
113 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
|
9天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
139 80
|
2天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
5天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
1天前
|
算法
基于梯度流的扩散映射卡尔曼滤波算法的信号预处理matlab仿真
本项目基于梯度流的扩散映射卡尔曼滤波算法(GFDMKF),用于信号预处理的MATLAB仿真。通过设置不同噪声大小,测试滤波效果。核心代码实现数据加载、含噪信号生成、扩散映射构建及DMK滤波器应用,并展示含噪与无噪信号及滤波结果的对比图。GFDMKF结合非线性流形学习与经典卡尔曼滤波,提高对非线性高维信号的滤波和跟踪性能。 **主要步骤:** 1. 加载数据并生成含噪测量值。 2. 使用扩散映射捕捉低维流形结构。 3. 应用DMK滤波器进行状态估计。 4. 绘制不同SNR下的轨迹示例。
|
6天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。
|
28天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
14天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。
|
21天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。