第一节:MATLAB基础运算(矩阵运算,方程求解,积分变换,画图)

第一节:MATLAB基础运算(矩阵运算,方程求解,画图,积分变换)

MATLAB是控制系统设计的一个重要工具,本系列文章将matlab中和控制系统相关的内容罗列出来,上半部分的内容如下:
第一节主要介绍MATLAB中一些基础的应用,包括矩阵运算,方程求解,画图,积分变换等。
第二节介绍系统的模型建立,包括传递函数模型,状态方程模型,离散模型,框图模型,以及系统辨识。
第三节介绍系统的性能分析,包括稳定性分析,动态性能分析,不同域的解析解,根轨迹,频率分析等。
第四节为simulink仿真练习。

矩阵运算

特征值的求解

控制系统稳定性的条件是所有闭环极点在复平面的左边,也就意味着系统矩阵所有的特征值为负数,所以特征值的求解尤其重要。
采用eig(A)可以得到特征值:

A = [0, 1; -2, -3];
R = eig(A);

得到结果:

    -1
    -2

同时也可以得到对角矩阵和右特征向量:

[V, D] = eig(A);
%其中 AV = VD

poly()函数求特征多项式:

p = poly(A);
disp(p);
%输出特征多项式的系数:
     1     3     2

矩阵的秩

控制系统中我们会讨论系统的能控性和能观性,要求出能控性矩阵和能观性矩阵的秩。
用rank()函数,返回矩阵的秩:

r = rank(A);
%输出 2

矩阵的逆

线性变换会用到逆矩阵,通过inv()函数:

inv_A = inv(A);
disp(inv_A);
%输出
-1.5000   -0.5000
 1.0000         0

矩阵指数

在求解状态方程的解析解时,先求出零输入响应。零输入响应由状态转移矩阵和初始状态相乘得到,而状态转移矩阵是矩阵指数函数。
矩阵指数函数可以直接由expm()函数求得:

e = expm(A*t);

方程求解

Lyapunov方程的求解

对于线性定常系统,其稳定的充要条件是李雅普诺夫方程有一个正定解矩阵p,从而p可作为李雅普诺夫函数的正定二次型矩阵。
定理:对于任意给定的正定矩阵-Q,若存在正定矩阵P满足李雅普诺夫方程,则系统渐进稳定。
AP + PAT = -Q
求解方法:

%连续域
P = lyap(A, Q);
%离散域
P = dlyap(A, Q);

Riccati方程的求解

对于线性时变系统,其稳定性通过求解Riccati方程中的P矩阵得到,要求是P矩阵必须是正定矩阵。
ATP + PA - PBP+ C = 0

P = are(A, B, C)

一阶常系数微分方程求解

  • 数值解

第一种方法是求解数值解(也就是画出解的图像),用得最多的函数是ode45()函数,可以直接通过函数调用,效果比较理想。ode45属于变步长方法的一种,采用龙格-库塔算法(Runge-Kutta),同样的还有ode23等。

[t, x] = ode45(fun, span, x0, options);

其中:
左边[t, x],t是时间点的列向量,x是求解的列向量,两者可画出解的图像。
参数fun是函数文件名,在函数文件中将微分方程进行变量替换(变换类似于状态空间模型)。
参数span接收时间的区间,是由一个个离散的时间点组成的向量。
参数x0接收初始条件

接下来给出一个例子:

%函数文件的定义
function dtheta = odefun(t, theta)
%......省略,用于得到一个和theta有关的函数f_theta%
dtheta = (5 - 5*exp(-t/10))/f_theta;
end

调用ode函数求解

tspan = 0 : 0.1: 100; %时间区间
theta0 = 0; %初始条件
[t, theta] = ode45('odefun', tspan, theta0); %调用函数
plot(t, y); %作图
  • 解析解

dsolve()函数用于求常微分方程的精确解。

y = dsolve('eq1, eq2', 'cond1, cond2', 'name')

第一个参数是微分方程(组)。
第二个参数是边界条件。
第三个参数是变量的名称。

例:求解: 10U’ + U = 5。

y = dsolve('10*DU + U = 5', 'U(0) = 0', 't');
disp(y);
%输出:5 - 5*exp(-t/10)

积分变换

积分变换是控制理论中非常重要的概念,主要的变化有拉普拉斯变换和z变换。

Laplace变换

拉普拉斯变换是傅立叶变换的普遍形式,将时间域中的函数表达转换成复域表达,传递函数模型就是微分方程通过拉普拉斯变换得来的。

  • 正变换

用laplace()函数实现:

f = 1 - (1 + a*t)*exp(-a*t);
laplace(f);
%输出:1/s - 1/(a + s) - a/(a + s)^2
  • 反变换

采用ilaplace()函数实现。

syms s;
G = 1/s - 1/(a + s) - a/(a + s)^2;
y = ilaplace(G);
disp(y);
%输出:1 - a*t*exp(-a*t) - exp(-a*t)

z变换

z变换是对于离散系统采用的积分变换,通过差分方程的z变换可以的到离散系统的传递函数。

  • 正变换

采用ztrans()函数。

syms n z;
gn = 6*(1 - (1/2)^n); %需要变换的序列
G = simplify(ztrans(gn));
disp(G);
%输出:(6*z)/(z - 1) - (6*z)/(z - 1/2)
  • 反变换

采用iztrans()函数。

syms n z;
gz = (6*z)/(z - 1) - (6*z)/(z - 1/2);
inv_gz = iztrans(gz);
disp(inv_gz);
%输出:6 - 6*(1/2)^n

画图

画图分为二维图形和三维图形。

  • 二维图形的绘制

绘图:
plot(x1, y1, linespec1…)
其中:
x1, y1为横纵坐标。
linespec是这条曲线的特点,比如颜色,线形,标记符号。
线形包括:’-’, ‘–’, ‘-.’。
颜色包括:‘b’, ‘g’, ‘m’, ‘w’, ‘c’, ‘k’…
点的标记符号:‘
’,‘.’,‘x’,‘o’…
*

图形修饰:
title(’***** ’),定义标题。
xlabel(’******’),定义横坐标名称。
ylabel(’******’),定义纵坐标名称。

创建子图:
subplot(221),2乘2的子图中的第一个图。

  • 三维图形的绘制

三维曲线的绘制:
用plot3()函数绘制三维曲线,可用于描述空间质点的运动轨迹。

plot3(x1, y1, z1, option1.....);

三维曲面的绘制:
对于二元函数z = f(x, y),它的图像是空间坐标系下的三维曲面,绘制曲面必须先用meshgrid()函数生成网格,网格内所有的点代入函数中才能得到图形,类似于等高线图,采用surf()函数绘制。

[x, y] = meshgrid(-5:0.1:5); %生成网格
z = (x.^2 - 2*x).*exp(-x.^2 - y.^2 - x.*y);
surf(x, y, z);

你可能感兴趣的:(MATLAB控制系统仿真)