MIT自适应律MRAC的理解和MATLAB实现

什么是MIT自适应律?

之所以叫MIT自适应律,是因为起源于美国麻省理工大学MIT。

假定被控对象中有一种参数theta,当调节这个参数theta后,可以让系统输出和参考模型输出之差变为0,那么更新这种参数theta的公式,就叫做MIT自适应律。

在这里插入图片描述

什么是灵敏度导数?什么是调整率?

参考模型和实际模型输出误差的大小,相对于参数theta的变化率,就是灵敏度。

调整率就类似于梯度下降法里面的步长,该以多少的速度朝着这个梯度前进,这个速度就是调增率。

基于MIT律的可调增益MRAC计算过程

系统由最上面的参考模型,中间的控制器,plant模型,以及下面的自适应调整机构(即MIT律)组成。

在这里插入图片描述
参考模型和实际模型之间的误差为

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bKO7HfJG-1576054723973)(MIT自适应律MRAC的理解和MATLAB实现.assets/image-20191211165057812.png)]

进行求导,可以得到灵敏度导数

在这里插入图片描述

然后得到自适应律公式

在这里插入图片描述

其中,gamma就是自适应律

系统的控制律为

在这里插入图片描述

计算过程和伪代码如下

在这里插入图片描述

MATLAB仿真

被控对象参数

在这里插入图片描述
各个步骤MATLAB代码如下

在这里插入图片描述

仿真效果

r = 0.6时,闭环系统输出响应特别慢
在这里插入图片描述
r = 1.2时,输出性能响应良好
在这里插入图片描述
r = 3.2时,系统变得不稳定

在这里插入图片描述

改进的MIT归一化算法和仿真结果

可以看到上面的缺陷,就是当自适应增益gamma超出一定范围之后,输出将会变得不稳定。

为了克服这种缺陷,需要做一些修正,使得自适应增益与输入信号幅值无关,一种修正方案就是实现归一化,修正MIT自适应律。

在这里插入图片描述
alpha大于零,是为了防止出现零除现象。

同时还可以引入一种饱和特性,保证参数调整率总小于一定的临界值。

在这里插入图片描述
最终的归一化MIT适应律为

在这里插入图片描述
修正之后的代码体现

在这里插入图片描述
仿真效果对比

在这里插入图片描述

完整MATLAB代码附录

普通MIT适应律

clear all;
close all;
% clc;

% 数值积分的步长
h = 0.1;
% 仿真步数,相当于是100L = 100/h;

% 对象参数
num = [1]; den = [1 1 1]; n = length(den) - 1; 
% plant的传递函数形态转换成状态空间
kp = 1;
[Ap, Bp, Cp, Dp] = tf2ss(kp * num, den);
% model的传递函数形态转换成状态空间
km = 1;
[Am, Bm, Cm, Dm] = tf2ss(km * num, den);

% 自适应律的自适应增益
gamma = 0.1;
yr0 = 0
  • 26
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是 MATLAB 实现的李雅普诺夫-MRAC自适应控制代码,其中包括可调增益的实现: ```matlab % 李雅普诺夫-MRAC自适应控制 clear all; close all; % 系统模型 A = [0 1; -1 -1]; B = [0; 1]; C = [1 0]; D = 0; system = ss(A, B, C, D); % 可调增益 K0 = [1 0.5]; K1 = [1 0.5]; % 自适应增益初始值 theta0 = [1; 1]; % 系统参数 gamma = 1; delta = 1; % 控制器增益更新速度 epsilon = 0.1; % 仿真时间 t = 0:0.01:10; % 控制输入 u = zeros(size(t)); % 系统响应 y = lsim(system, u, t); % 初始化自适应增益 theta = theta0; % 初始化误差 e = zeros(size(t)); % 循环更新增益和控制输入 for i = 2:length(t) % 计算误差 e(i) = y(i-1) - gamma * C * (theta' * K0)' * y(i-1) - delta * C * (theta' * K1)' * u(i-1); % 更新增益 theta_dot = -epsilon * gamma * (theta' * K0) * C' * y(i-1) * e(i-1) - epsilon * delta * (theta' * K1) * C' * u(i-1) * e(i-1); theta = theta + theta_dot' * 0.01; % 计算控制输入 u(i) = -K0 * (theta' * K0)' * y(i-1) - K1 * (theta' * K1)' * u(i-1); % 更新系统响应 y(i) = lsim(system, u(i), t(i)); end % 绘图 subplot(2,1,1) plot(t, y) ylabel('y') subplot(2,1,2) plot(t, u) ylabel('u') xlabel('t') ``` 在代码中,首先定义了系统模型,包括状态空间矩阵 $A$,输入矩阵 $B$,输出矩阵 $C$ 和直流增益 $D$。然后定义了控制器的可调增益 $K_0$ 和 $K_1$,自适应增益的初始值 $\theta_0$,系统参数 $\gamma$ 和 $\delta$,控制器增益更新速度 $\epsilon$,以及仿真时间 $t$ 和控制输入 $u$。接下来,使用 MATLAB 的 `lsim` 函数计算系统响应,并初始化自适应增益和误差。然后,在循环中更新增益和控制输入,并计算系统响应。最后,使用 MATLAB 的绘图函数绘制系统响应和控制输入随时间的变化。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值