5.9.8 最优化控制初探——PID参数优化

总目录:http://t.csdnimg.cn/YDe8m

5.9.8 最优化控制初探------PID参数优化

   之前在"A_2_PID控制转速例程"例程中,PID参数是手动调节的。然而在已经获得系统完整数学模型的情况下,我们可以使用效率更高的方法,即最优化控制。先来看一下两者的对比:

(a)

(b)

图5.9.16

   图5.9.16(a)为手动调参的角速度控制效果,图5.9.16(b)是使用最优化控制算法调参后的角速度控制效果。可以发现,虽然稍有震荡,但图(b)角速度到达期望

   最优化控制的实现详看"2、飞控例程\Matlab\(2)飞行控制------四旋转子\A3_PID参数优化"中的"A3_PID参数优化"例程。该例程中的文件如图5.9.17所示:

图5.9.17

   该例程基于例程"A2_PID控制转速"进行编写主要添加了"A2_Pid_better_main.mlx"、"A3_Pid_better_run.m"、"A3_Pid_plot.m"这三个与PID参数优化的文件。例程的主要功能是:使用Matlab自带优化函数对PID参数进行优化。

   双击进入"A2_Pid_better_main.mlx"文件,点击上方"运行"按钮即可运行例程。例程会自动求解PID控制器的最优控制参数 K P 、 K I 、 K D K_P、K_I、K_D KP、KI、KD,并使用这些参数进行四旋转子角速度系统的控制仿真,仿真结果如图5.9.16(a)所示。而求解出的最优控制参数可以在Matlab右侧的"工作区"中进行查看,参数保存在"K_pid"数组中,双击该数组可在表格中显示,如图5.9.18:

图5.9.18 PID最优控制参数

   例程的具体原理如下:

(1)A2_Pid_better_main.mlx

   PID优化主运行文件。

matlab{.line-numbers} 复制代码
clear all;
close all;
clc;


%% PID参数优化


K_pid0=[0 0 0];
LB=[0 0 0];
UB=[1000 500 500];

K_pid=lsqnonlin('A3_Pid_better_run',K_pid0,LB,UB);

%% 使用优化后的PID参数 仿真并绘图
A3_Pid_plot(K_pid);         %优化PID参数 仿真并绘图
  • 行9~13
    • 运行Matlab自带的优化求解函数"lsqnonlin"对"A3_Pid_better_run.m"文件中的模型的参数进行优化求解。
      • lsqnonlin函数
        功能:求解非线性最小二乘(非线性数据拟合)问题
        语法:
            x = lsqnonlin(fun,x0,lb,ub),可以看到这个函数有三个输入,一个输出。其中"fun"可以是一个函数文件的文件名,要求这个函数的格式如代码5.9.1所示。x可以是一个数组或数值变量,但要求该函数的输出"Out"必须是一个超过两个元素的数组或矩阵。
            运行过程中,"lsqnonlin"函数会深度将x赋不同的值,然后运行"fun"函数,得到输出"Out"。最终"lsqnonlin"函数会返回"Out"中各元素值最小时,所输入的"x"。这里的多元素"最小"是按照"最小二乘法"的规则定义的。
            该函数其它输入参数:"x0"是第一次输入fun 函数的值,其与fun 函数的输入参数x要格式相同;lb、ub则分别是输入fun 函数x的下限与上限,也与x的格式相同。

代码5.9.1

matlab{.line-numbers} 复制代码
function [Out] = fun(x)

....

Out = ......;

end
  • 行15~16
    使用已经求得的最优化控制参数进行仿真与绘图。

(2)A3_Pid_better_run.m

   控制系统函数文件。该函数文件的格式符合"lsqnonlin"函数语法中对fun函数的要求。

   总体来看A3_Pid_better_run的输入:为PID控制器的三个参数;输出:为各个离散时间期望与实际状态的误差,为一个数组。

matlab{.line-numbers} 复制代码
function [Run_e] = A3_Pid_better_run(K_pid)
% PID控制系统运行函数

% 输入:
%   K_pid   使用的PID的参数
%
% 输出
%   Run_e   各时刻 期望与系统输出的误差

%% 初始化系统参数
init = 0;
A2_init;
s_pid.K_pid = K_pid; 

%% 仿真
init = 1;   %已初始化完毕
for i = 1:(Num)
    % 串级PID控制
    C_Cascade_PID;
    
    % 动态系统响应
    M_Motor;    %电机
    s_A.u = s_mot.M_xyz(1);   %赋值角度系统输入
    M_Four_turn_rotor;      %四旋转子
    
    
    %保存电机模型输入输出数据
    s_History.u_all(i, :) = s_mot.u_all';
    s_History.F_xyz(i, :) = s_mot.F_xyz';
    s_History.M_xyz(i, :) = s_mot.M_xyz';
    
    %保存角度系统输出数据
    s_History.ya(i, 1) = s_A.y(1, 1)*180/pi;  %角度,单位(deg) 
    s_History.ya(i, 2) = s_A.y(2, 1)*180/pi;  %角速度,单位(deg/s)
    
end

%% 函数输出
Run_e = abs(s_pid.d - s_History.ya(:, 2));    %获得各时刻, 期望与系统输出的误差

end
  • 行11~36
    与"A1_main.mlx"文件中的内容几乎一样,只有两处有所不同
    • 其一:
      在最后没有调用"P_plot_all"文件进行绘图。
    • 其二,行13:
      在调用"A2_init"后,又对"s_pid.K_pid"这个PID控制器的控制器参数进行了覆写,将默认值改为了"A3_Pid_better_run"函数的输入"K_pid"。
  • 行39
    函数的输出是各离散时刻,期望与实际状态(角速度)的误差,该误差是一个大于0的值,使用"abs"函数求绝对值。
相关推荐
Evand J7 小时前
【PMSM例程】(14)永磁同步电机无迹卡尔曼滤波(UKF)定子电阻在线辨识与补偿。电阻变化跟踪及预测误差对比仿真。附完整代码的下载链接
matlab·电机·滤波·卡尔曼滤波·永磁同步电机·无迹卡尔曼滤波·pmsm
爱喝雪碧的可乐8 小时前
MATLAB
开发语言·算法·matlab
严肃小白兔11 小时前
MATLAB 优秀开源项目与工具箱推荐:涵盖通信、图像处理、脑机接口等九大领域
图像处理·matlab·信息与通信·开源项目
亥时无人机管理系统1 天前
一网统飞低空管控平台源码 全域无人机集中管理系统功能与落地优势
私有化部署·无人机·低空经济·无人机管理系统·一网统飞·行业巡检
Evand J2 天前
【MATLAB例程12】永磁同步电机基于增广无迹卡尔曼滤波的未知负载转矩在线观测
开发语言·matlab
拓恒技术3 天前
从“可见光漏检”到“热异常锁定”:无人机河道排污口识别与溯源的技术链路
人工智能·视觉检测·无人机
分享资料3 天前
MATLAB 中分号 (;)的作用
matlab
QXWZ_IA3 天前
无人机自主巡检从半自动到全闭环的阶段划分与定位要求
人工智能·安全·无人机
AiNightVision3 天前
无人机夜视模块如何选择?——从参数指标到系统集成的完整选型指南
人工智能·算法·计算机视觉·车载系统·无人机·视频·智能硬件
Evand J3 天前
【PMSM例程11】永磁同步电机(PMSM)基于UKF的转速与转子位置估计。附下载链接
算法·matlab·卡尔曼滤波·永磁同步电机·ukf·pmsm·位置估计