Transcript 第二章
控制系统仿真与辅助设计
自动化工程系 刘继伟
第二章 Matlab语言基础知识
Matlab 数据结构与语句结构
语言基
础
基本控制流程结构
M函数设计
图形可视化
图形用户界面设计
数学问题求解
一点点说明
一点点建议
程序的管理
◦ 大程序按照功能块划分;
◦ 功能块间相对独立;
◦ 全局变量的隶属
隶属关系明确—放在对应模块
隶属关系不明—单独放在一个global文件中;
一点点建议
编程的风格
◦ 变量命名规则
避免使用无意义的字母组合
命名:多个名词,首字母大写,结合下划线
Temperature
Degree_C/ Degree_F
◦ 函数命名规则
模块名_功能名
Key_GetKey()
一点点建议
编程的风格
◦ 书写风格及注释
◦ 版本管理
MATLAB工作界面
当前路径
工作空间
命令窗口
历史命令
MATLAB编辑窗口
设置
断点
取消
断点
单步
运行
进入
函数
继续
运行
跳出
函数
退出
调试
MATLAB快捷键
↑ 回调上一行命令
↓ 回调下一行命令
← 左移一个字符
→ 右移一个字符
Delet Backspace 删除字符
Ctrl+C 中断MATLAB任务
通用命令
help
◦ 查看当前路径下的m
文件
◦ 帮助
clear
◦ 清除变量
clc
◦ 清屏
what
who, whos
◦ 查看workspace变量
load, save
◦ 储存、读取mat文件
2.1 MATALB语言的数据结构
变量命名规则
◦ 必须以字母开头;
◦ 可以由字母、数字和下划线混合组成;
◦ 变量长度应不大于31个;
◦ 字母区分大小写。
2.1 MATALB语言的数据结构
特殊变量—尽量避免重新赋值
变量名称
功能
变量名称
功能
ans
用于结果的
缺省变量值
pi
圆周率
realmax
最大浮点数
值
realmin
最小浮点数
值
i
虚数单位
j
虚数单位
NaN
不定式
(0/0,inf/i
nf)
nargin
函数的输入
变量数目
inf
正无穷大
eps
机器浮点运
算误差限
2.1 MATALB语言的数据结构
数据类型
◦ 在MATLAB里共有六种数据类型,每一种类型
可以是一维、二维和多维的。
双精度型
字符串型—单引号扩起来
多维数组
单元数组
类与对象
符号变量
2.1 MATALB语言的数据结构
基本语句结构--直接赋值语句
◦ 变量名列表=表达式
等号左边的变量名列表为MATLAB语句的返回值,
若一次返回多个结果,则变量列表用[
]括起来,
各变量间用逗号分隔;
等号右边为表达式,可以是矩阵运算或函数调用,
可以由分号(;)、逗号(,)或回车结束。
2.1 MATALB语言的数据结构
基本语句结构--函数调用语句
◦ [返回变量列表]=函数名(输入变量列表)
函数应位于Matlab路径下;
返回变量列表和输入变量列表可以有若干变量,
变量间用“,”分隔,此外,返回变量还允许用“空
格”分隔
2.1 MATALB语言的数据结构
矩阵的赋值
◦ 矩阵用“[ ]”扩起来
◦ “分号”标示换行
◦ “,”或“空格”表示同一行元素分隔
数据的存储与读取
◦ save filename A1 A2 … An
空格分隔变量
◦ load filename
2.1 MATALB语言的数据结构
基本运算
◦ 字符型
所有字符串都用单引号括起来;
字符串中的每一个字符都是该字符串变量中的一
个元素;
字符串中的字符以ASCⅡ码形式存储,因而区分
大小写。
2.1 MATALB语言的数据结构
基本运算
◦ 字符型
建立:常用函数有char、int2str、num2str等。
连接:
水平连接通过函数strcat或在中括号内用逗号连接;
垂直连接通过函数strvcat或在中括号内用分号连接。
比较:常用函数strcmp,相同则返回1,否则为0。
查找:常用函数findstr。
2.1 MATALB语言的数据结构
基本运算
结构型
直接建立结构和各个域,同时给各域赋值,结构和域之
间用点“.”连接。同样,访问结构的各个域时,其格式
为:结构名.域名
用函数struct建立结构,其用法为:
s=struct(‘field1’,values1,‘field2’,values2,┅)
例1
s = struct('type',{'big', 'little'},'color','red’, ‘x',{3 1})
1×2 struct
Field values1 values2
Type
big
little
Color red
red
X
3
1
s(1).type; s(2).type
s(1).color; s(2).color
s(1).x;
s(2).x
2.1 MATALB语言的数据结构
基本运算
◦ 矩阵
直接输入:>>A=[1 2, 3; 4 5 6;7, 8 9]
冒号操作符:
>>a=0:1:10
>>a=linspace(0,1,10)
>>a=logspace(1,2,10)
2.1 MATALB语言的数据结构
基本运算
◦ 矩阵
转置
B=A’
加减乘 A+B
A-B
A*B
左除 A\B 即AX=B的解X=A-1B
右除 A/B 即XB=A的解X=AB-1
翻转 fliplr flipud
rot90
乘方 A^B
点运算
A.*B
A./B A.\B A.^B A.’
2.1 MATALB语言的数据结构
基本运算
◦ 逻辑运算
& (与)
|(或)
~(非)
结果是一个0-1矩阵。当逻辑表达式的值为真时,赋值1,否则为0
◦ 逻辑函数
all :当某列的元素都为真时,返回值为1,否则返回0。最
终运算结果为一个0-1行向量
any :当向量中至少有一个元素为真时,返回值为1,否则
返回0。最终运算结果为一个0-1行向量
find:用于查找向量中的真元素的下标,返回由所有真元
素下标构成的列向量。
2.1 MATALB语言的数据结构
矩阵逻辑运算
◦ < 小于
◦ > 大于
◦ <= 小于等于
◦ >=大于等于
◦ == 等于
◦ ~=不等于
◦ 关系运算符将生成一个0-1矩阵,当运算数相应元
素为真时,对应位置上生成1,否则为0。
2.1 MATALB语言的数据结构
矩阵数据变换
◦ floor(A)
不大于A的最大整数
◦ ceil(A)
不小于A的最小取整
◦ round(A)
四舍五入取整
2.1 MATALB语言的数据结构
矩阵下标操作
◦ 用两个下标来表示。第i行j列的元素用A(i,j)
来表示;
◦ 用一个下标来表示。对于矩阵按列操作,
可用单下标引用A(i) ;
◦ 在下标的表达式中使用冒号表示矩阵的一
部分;
◦ 下标引用从序号1开始。
例
A=
1 2 3
4 5 6
7 8 9
>>A(4)+A(8)
2.1 MATALB语言的数据结构
矩阵行列删除
◦ >>B=[1 2 3;4 5 6; 7 8 9];
◦ >>B(2,: )=[]
◦ >>B=
123
789
2.1 MATALB语言的数据结构
矩阵尺寸
◦ >>B=[1 2 3;4 5 6; 7 8 9];
◦ [m,n]=size(A) %返回矩阵的行数m和列数n
◦ M=size(A) %在矩阵M中返回矩阵的行数、
列数
◦ len=length(A) %返回矩阵A行数和列数中的
最大值
2.1 MATALB语言的数据结构
特殊矩阵
◦ 单位矩阵
eye(n) %生成n维单位阵
eye(m,n) %生成m×n的单位阵
eye([m,n]) %生成m×n的单位阵
eye(size(A)) %生成与A矩阵同样大小的单位矩阵
2.1 MATALB语言的数据结构
特殊矩阵
◦ 全1矩阵 ones(n) ones(m,n)
ones([m,n]) ones(size(A))
◦ 全零矩阵 zeros(n) zeros(m,n) zeros([m,n])
zeros(size(A))
◦ 随机矩阵 rand(n) rand(m,n) rand([m,n])
rand(size(A))
生成的随机矩阵的各个元素值在0和1之间。
◦ 对角阵 diag(n)
◦ 魔术矩阵 magic(n)
魔术矩阵的所有行元素和、列元素和、对角线元素和均相等
2.2 MATALB基本控制流程结构
循环结构
◦ for
◦ while
2.1 MATALB基本控制流程结构
循环结构
◦ for循环基本格式:
for 循环变量=起始值:步长:终止值
循环体
end
◦ 步长的缺省值是1。
步长可以在正实数或负实数范围内任意指
定;
对于正数,循环变量的值大于终止值时,
循环结束;
对于负数,循环变量的值小于终止值时,
循环结束。
2.1 MATALB基本控制流程结构
循环结构
◦ While循环基本格式
while 表达式
循环体
end
◦ 若表达式为真,则执行循环体的内容,执行后
再判断表达式是否为真,若为假则跳出循环体,
向下继续执行,否则继续执行循环体。
◦ break:从循环体中跳出,并使循环结束
例
2.1 MATALB基本控制流程结构
转移结构
◦ if-else-elseif语句
if 逻辑表达式
执行语句
end
◦ 当逻辑表达式的值为真,则执行该结构中
的执行语句内容,执行完后向下继续执行,
若逻辑表达式的值为假,跳过结构中的执
行语句继续向下执行。
例
2.1 MATALB基本控制流程结构
转移结构
◦ if-else格式
if 逻辑表达式
执行语句1
else
执行语句2
end
◦ 如果逻辑表达式的值为真,则执行语句1,然后跳
过语句2向下执行;若逻辑表达式的值为假,则跳
过执行语句1而执行语句2,然后向下执行。
2.1 MATALB基本控制流程结构
转移结构
◦ if-elseif格式
◦ 如果逻辑表达式的值
◦ if 逻辑表达式1
执行语句1
◦ elseif 逻辑表达式2
为真,则执行语句1,
执行语句2
若逻辑表达式的值为
……
假,则判断逻辑表达
式2的值,若为真,则
执行语句2,否则向下
执行,若所有表达式均
为假,执行语句el 。
◦ elseif 逻辑表达式n
执行语句n
◦ else
执行语句el
◦ end
2.1 MATALB基本控制流程结构
开关结构
◦ 表达式的值和
哪种情况的值
相同,就执行
哪种情况中的
语句,如果都
不同,则执行
otherwise中的
语句。
switch 表达式(标量或字符
串)
◦ case 值1
语句1
◦ case 值2
语句2
◦ ┅
◦ case 值n
语句n
◦ otherwise
语句ow
◦ end
3.5 MATLAB程序编写及调试
MATLBA程序设计基本原则:
%后面的内容是程序的注解,要善于运用注解使程序更具可读
性。
养成在主程序开头用clear指令清除变量的习惯,以消除工作空
间中其他变量对程序运行的影响。但注意在子程序中不要用
clear。
参数值要集中放在程序的开始部分,以便维护。要充分利用
MATLAB工具箱提供的指令来执行所要进行的运算,在语句行
之后输入分号使其及中间结果不在屏幕上显示,以提高执行速
度。
MATLBA程序设计基本原则
程序尽量模块化,也就是采用主程序调用
子程序的方法,将所有子程序合并在一起
来执行全部的操作。
充分利用Debugger来进行程序的调试(设
置断点、单步执行、连续执行)
设置好MATLAB的工作路径,以便程序运
行。
MATLAB程序的基本组成结构
%说明
清除命令:清除workspace中的变量和图形(clear,close)
定义变量:包括全局变量的声明及参数值的设定
逐行执行命令:指MATLAB提供的运算指令或工具箱提供
的专用命令
控制循环:包含for,if…then,switch,while等语句
逐行执行命令
绘图命令:将运算结果绘制出来
M文件的编辑及MATLAB工作路径的设置
进入MATLAB的Editor/Debugger窗口来编辑程
序
在运行程序之前,必须设置好MATLAB的工作
路径,使得所要运行的程序及运行程序所需要
的其他文件处在当前目录之下,只有这样,才
可以使程序得以正常运行。否则可能导致无法
读取某些系统文件或数据,从而程序无法执行。
MATLAB程序类型
脚本文件
函数文件
函数定义行
H1行
函数帮助文件
函数体
function y=mean(x)
% MEAN Average or mean Value
% For vectors,Mean(x) is the mean value of X
% For matrices, Mean(x) is a row vector containing
% the mean value of each column
[m,n]=size(x)
if m==1
m=n;
end
y=sum(x)/m;
3.6 图形绘制
图形绘制
图形标注
plot(y)
plot(x,y)
图形控制
plot(x1,y1,option1,x2,y2,option2,…)
plot控制
功能:在调用函数plot时,可以指定线型,
颜色,和数据点的图标。
格
式
:
plot
(
x
,
y
,
‘color_linestyle_marker’)
说明:参数color_linestyle_marker 为一个
字符串,由颜色、线型、数据点的图标组
成。
线性和颜色字符定义表
字符定义
线型
字符定义
线型
-
实线(默认)
--
虚线
:
点划线
-.
点连线
none
无线
字符定义
颜色
字符定义
颜色
y
yellow(黄)
m
magenta(洋红)
c
cyan(青)
r
red(红)
g
green(绿)
b
blue(兰)默认
w
white(白)
k
black(黑)
3.6 图形绘制
图形绘制
图形标注
图形控制
text(x,y,’字符串’)
gtext(‘字符串’)
title(‘字符串’)
xlabel(‘字符串’)
ylabel(‘字符串’)
3.6 图形绘制
图形绘制
图形标注
图形控制
figure(1);figure(2);…;figure(n)
grid on; grid off
hold on; hold off
axis([xmin xmax ymin ymax])
subplot(mnk)
semilogx;semilogy
绘图一般步骤
准备绘图需要的数据;
指定绘图的窗口或者区域;
调用基本绘图命令;
选择线型、颜色、数据点形状;
坐标轴控制,包括显示范围、刻度线、比例、
网格线;
标注控制,包括坐标轴名称、标题、相应文本
等。
3.7 数据处理
矩阵分解
三角分解
[L,U]=lu(A)
X=inv(A)
d=det(A)
%求矩阵A的LU分解
%求矩阵A的逆矩阵
%求矩阵A的行列式
d=eig(A);
[V,D]=eig(A);
特征值分解
[V,D]=eig(A,'nobalance')
3.7 数据处理
多项式
多项式创建
直接输入法
poly(A)
poly(a)
例如: P=[1,2,3,4]
%创建方阵A的特征多项式
%如果a为向量[bn bn-1…b1 b0],则创建
(x-b0 )( x-b1) … (x-bn-1 )(x- bn )生成的多项式的系数向量
roots ( )
%求多项式的根
p=poly(A)
%求矩阵的特征多项式
多项式常用函数
polyval( p,x)
%求当多项式p的参数为某个特定值x时的多项式的值
polyvalm(p,A)
%和polyval作用相同,输入参数值也可为方阵A
3.7 数据处理
卷积和解卷积
c=conv(A,B)
[Q,R]=deconv (A,B)
%卷积函数 ,多项式乘法函数
%解卷积函数,多项式除法函数
Pd=polyder(P)
%求多项式P的导数
导数
Pm=polyder(P1,P2)
%求多项式P1和多项式P2乘积的导
数
[Q,D]=polyder(P1,P2) %求多项式P1除以多项式P2商的导
数
3.7 数据处理
多项式拟合
从最小二乘的意义上,polyfit函数将拟合出所给数
据的多项式系数,其调用格式为:
p=polyfit(x,y,n)
其中,x和y为已知数据的横坐标和纵坐标向量,n为
多项式的次数。
常微分方程数值解
[t, x]=ode23(‘xfun’, [t0, tf] x0, tol, trace)
[t, x]=ode23(‘xfun’, [t0, tf] x0, tol, trace)
范得蒙方程求解
2
d x
2 dx
(1 x ) x 0
2
dt
dt
求解M-文件
function yp=vdp(t,x)
yp(1)=x(2);
yp(2)=2*(1-x(1)^2)*x(2)-x(1); %令u=2
在命令行求解这个方程:
[t,x]=ode45(‘vdp’,0,20,[1 ;1]);
plot(t,x(:,1),t,x(:,2));
%画出x和dx/dt的时域波形
Simulink的操作
数值仿真
系统分析
已知某控制系统的动态结构图如下图所示,
0.8s 1
D( s)
试利用MATLAB/Simulink工具分析C值与输入
s
幅值对系统输出性能的影响。
u (t )
D( s)
-
10
0.1s 2 s
y
x(t )
..
-c1
c1
x
模型
系统分析
M-文件
plot (time, output)
grid on
%绘制曲线
%显示格栅线
xlabel (‘time/s’)
%标记横坐标轴
ylabel (‘output’)
%标记纵坐标轴
title(‘Simulation result’)
%加图名
分析结果
1.6
1.6
1.4
1.4
1.2
1.2
1
output
1
output
c1=2
c2=1
c3=0.5
0.8
0.8
0.6
0.6
0.4
0.4
0.2
0.2
0
0
0
0.5
1
1.5
2
2.5
time/s
3
3.5
a) C1=1时
4
4.5
5
0
0.5
1
1.5
2
2.5
time/s
3
3.5
4
(b) 不同的C1
磁滞回环系统的阶跃响应
4.5
5
4.5
幅值为1
幅值为3
4
3.5
output
3
2.5
2
1.5
1
0.5
0
0
0.5
1
1.5
2
2.5
time/s
3
3.5
4
4.5
5
图3-16输入幅值改变后仿真结果
本章小结
MATLAB是居于矩阵的工具包,注意应用MATLAB
时思路的转换。
使用MATLAB编写算法时注意最好不超过50行,且
尽量少用for、while的语句。
MATLAB里有充分的资源用来分析数据,在应用的
同时注意数据分析的基本原理。
MATLA有丰富的工具箱可以对许多的系统进行建模、
仿真、 分析。在使用smulink时注意合理选择步长。
MATLAB有许多的“帮助”资源,对学习和掌握
MATLAB很重要,应该在自学中广为利用。