Matlab 70 Simulink 60应用实例仿真与高效算法开发第一章.docx
《Matlab 70 Simulink 60应用实例仿真与高效算法开发第一章.docx》由会员分享,可在线阅读,更多相关《Matlab 70 Simulink 60应用实例仿真与高效算法开发第一章.docx(69页珍藏版)》请在冰豆网上搜索。
Matlab70Simulink60应用实例仿真与高效算法开发第一章
第一章MATLAB语言程序基础
本章旨在介绍关于MATLAB的基本知识,使读者可以更好的理解后续章节中的内容。
其实,对于MATLAB的基本知识的介绍可以在市面是流行的各类MATLAB书籍中看到,那么本书中对于此部分的介绍又有哪些自己的特点呢?
首先,省去了MATLAB中一些与高效率计算编程无关的赘述,使读者在能力理解和运用本书中心部分对于高效算法的介绍前提下,用最少的时间获得必须的预备知识;其次是对于一些后续章节中经常用到的基本概念和方法作了更为详细的介绍,这样读者在阅读完本章节以后可以更轻松的理解本章中对于算法介绍的内容。
本章主要内容包括:
◆MATLAB的数据类型
◆基本数学运算
◆基本符号运算
◆基本的流程结构
◆函数编写与调试
◆图形的绘制
1.1MATLAB的数据类型
本节主要介绍MATLAB中的数据类型。
不同类型的对象在计算机语言中可用不同类型的变量来描述。
为使读者能够更好的理解后续章节的算法程序,本节专门对MATLAB的数据类型进行介绍。
1.1.1常量与变量
1.1.1.1.常量
MATLAB中,常量和变量是基本的语言元素。
MATLAB的数值采用传统的十进制表示,可带负号或小数点。
举例如下:
5-870.0013.14151.05457e-346..02e23
MATLAB还提供了一些内部常量,也可以理解为MATLAB默认的预定义变量。
这些常量定义了编程和应用中经常用到的数据,如,圆周率、虚数单位等。
随着MATLAB启动,这些常数就被产生。
表1-1MATLAB中的一些内部常量
内部常量
基本意义
ans
默认变量名或缺省变量名,MATLAB会自动将无指定输出变量的计算结果默认保存到ans变量中
eps
机器零阀值
Inf或inf
表示无穷大的结算结果,如1/0
i或j
虚数单位,有i=j=
pi
圆周率
NaN或nan
非数值,通常表示不合法数值的值。
如,0/0或inf/inf所得到的结果
realmax(realmin)
最大(小)正实数
nargin(nargout)
函数输入(输出)宗量数目
computer
计算机类型
version
MATLAB版本字符串
表1-1中所列常量可不必声明,直接调用。
这里值得指出的是表1.1中所列常量的意义是在表中变量名未被用户赋值的情况下才成立的。
假如用户对表中任何一个内部常量的字符串进行了赋值,那么该常量的默认意义或者默认值已被用户的新赋值所覆盖,只不过这种“覆盖”是临时的,如果用户运行了clear指令将MATLAB内存清空,或者MATLAB指令窗被重新启动,那么所有的内部常量又会恢复到系统默认的意义。
【例1-1】系统内部常量的调用和赋值
pi%察看系统的默认值
ans=
3.1416
pi=ans+1%pi被重新赋值,不再是原系统默认值
pi=
5.1416
clear%清空内存中的变量
pi%重新察看pi的值
ans=
3.1416
可见,在无指定输出变量时候,系统自动把值赋给了ans。
通过对pi进行重新赋值,原先默认值(圆周率)被覆盖,清空内存之后,pi又恢复到系统默认值。
1.1.1.2.变量
所有MATLAB中定义的变量都以数组或者矩阵形式保存,他提供的数据类型多达十余种,如逻辑型、字符型、数值型、单元数组、结构数组、函数句柄等。
下面简单介绍一下几种数据类型。
●逻辑型此类数据类型只能包含1,0或者true,false。
举例:
A=[135;417;269];
B=A>2
B=
011
101
011
●字符型又称字符串数组,如果没有串数组及其相应的操作,数据的可视化和构作MATLAB的宏指令都会遇到困难。
字符串的创建也有值得注意的地方,就是必须首先将待建的字符置于英文状态下的“单引号对”中。
例:
clear%清除所有内存变量
A=’Hello,everyone!
’%对A进行赋值
A=
Hello,everyone!
●数值型数值数组及其运算始终是MATLAB的核心内容。
数值型又可分为单精度数值型数组(single)、双精度数值型数组(double)和整型数组。
MATLAB进行数值计算时,默认所有变量都为double型。
使用format命令可以设置变量的输出格式,例如:
a=2.3609%系统默认为double型
a=
2.3609
formatlong%设置系统为15位定点格式输出
a
a=
2.36090000000000
formatlonge%设置系统为15位浮点格式输出
a
a=
2.360900000000000e+000
在MATLAB中,变量的命名是要遵守一定规则的。
首先,对变量命名要注意区分大小写,比如,Myname和myname表示两个不同的变量。
pi代表系统默认的圆周率,但Pi、PI和pI都不是;其次,在MATLAB中对变量进行命名时,第一个字符必须时英文字母,如0abc、_abc等都不是合法的;另外,MATLAB中在变量名的中间不能包含空格(backspace)、标点和括号等,不过可以包含下划线,比如,ab_c是可以的,abc或者ab,c等都不是合法的。
1.1.2运算符
运算符从其功能来分大致有三种:
算术运算符、比较运算符和逻辑运算符。
现在分别介绍一下它们的构成和使用。
1.1.2.1算术运算符
MATLAB中的运算符不只是完成传统意义上的算术所需的四则运算,另外还有幂、转置等运算。
由于MATLAB具有强大的矩阵运算功能,所以它的很多运算符都是针对矩阵操作的。
表达式所采用的运算符见表1-2。
表1-2算术运算符及其功能
运算符
功能
运算符
功能
+
加
-
减
.*
乘
./
右除
.\
左除
.^
幂
.'
转置
'
复数共轭转置
*
矩阵乘法
/
矩阵除法
^
矩阵的幂
:
冒号操作符
要说明的是,一维的运算可以看作是矩阵运算的一种特殊形式,其运算符是一样的,例如一维运算中没有的转置,也可以看作是一维矩阵的转置,只是它转置后的结果不变罢了。
此外,MATLAB中针对向量的算术操作专门设计了一类近似的运算符号,就是在一般的矩阵运算符前加“.”,它代表所参与运算的向量对应元素之间的运算。
1.1.2.2比较运算符
比较运算符的作用主要是用来比较两个数值的大小,它的写法与一般的手写比较运算符有所区别。
具体见表1.3所示。
表1.3比较运算符
指令
功能
指令
功能
<
大于
>=
大于等于
>
小于
<=
小于等于
==
等于
~=
不等于
值得指出的是一般的表示等于的运算符在MATLAB中写为“==”,传统意义上的等号“=”在MATLAB运算中用于赋值运算。
此外,进行比较操作时注意以下两点:
(1),标量可与任何维数组进行比较。
比较在此标量与数组每个元素之间进行,比较结果与参与比较的数组同维;
(2),参与比较的没有标量时,比较运算符两端的数组必须维数相同,比较在两数组对应位置上的元素间进行,因此比较结果将与参与比较的数组相同。
举例说明:
【例1-2】比较运算
A=[12345];
B=[54321];
C=(A<3)
C=
11000
D=(A==B)
D=
00100
1.1.2.3逻辑运算符
逻辑运算符的主要功能是判断参与比较的对象之间的某种逻辑关系。
表1-4列出了各种逻辑运算符及其对应的功能。
表1-4逻辑运算符及其对应功能
指令
函数
含义
举例
&
and
与、和
A=[1,1,1,0,0]
B=[0,0,1,1,1]
A&B[0,0,1,0,0]
|
or
或
A|B[1,1,1,1,1]
~
not
否、非
~A=[0,0,0,1,1]
xor
元素相异返回1,元素相同返回0
xor(A,B)=[0,0,1,0,0]
bitand
二进数位逻辑操作符,表示与、和
A=20=10100
B=12=1100
bitand(A,B)=0100=4
bitor
二进数位逻辑操作符,表示或
bitor(A,B)=11100=28
bitcmp
二进数位逻辑操作符,表示否、非
~B=0011=3
bitxor
二进数位逻辑操作符,相异数返回1,相同数返回0
bitor(A,B)=11000=24
&&
如符号两端表达式皆为真,返回true
(1),否则返回0。
(a~=0)&&(a/b>3)
||
如符号两端表达式有一式为真,返回true
(1),否则返回0。
(a==0)||(a/b>0)
这里说明一下,二进数位逻辑操作时,往往首先把运算量转换为二进制表示,然后逻辑运算在两个二进制数的自右到左相应数位间进行,输出的结果为运算所得的二进制数所对应的十进制数。
当逻辑运算中没有标量时,参与运算的数组必须维数相同,运算在两数组的对应位置元素间进行。
此外,“&&”和“||”操作都有其特殊的性质,两者都属于先决逻辑操作符。
“&&”操作时,先观察运算符左侧的参与运算的表达式是否为“假”;若是,则马上给出运算结果为“假”,而不必再观察运算符右侧的参与运算量。
当左侧的运算量为“真”时,才接着对右侧运算量进行计算或者判断,进而执行“与”逻辑运算。
“||”操作时,首先判断左侧的运算量是否为“真”;若是,立即给出计算结果“真”,而不必观察右侧参与运算量;若不是,则对右侧运算量进行观察,进而执行“与”操作。
1.1.3结构数组
结构数组(也有人称为构架数组)能在一个数组里存放任何类型的数据。
结构数组的基本单元(elment)是结构。
数组中的每个单元以下标区分,他们之间是平等的。
结构数组维数不受限制,可以为一维、二维或更高维。
结构数组的创建有两种方式,下面我们就看一个例子:
【例1-3】下面创建一个my_software结构数组,里面存储的是一个软件系统的信息。
首先看第一种方法,直接使用赋值语句构造结构数组
(1)直接对域进行赋值
my_software.name='MATLAB';
%可以直接将字符串赋值给结构数组的域
my_software.version='7.0.0.19920(R14)';
my_puter='PCWIN';
my_software.testdata.test1=[3.743.27;3.563.41];
%可以直接将数组赋值给结构数组的域
my_software.testdata.test2=[65.2368.75;63.0661.18];
(2)查看结果
my_software%显示结构数组的内容
my_software=
name:
'MATLAB'
version:
'7.0.0.19920(R14)'
system:
'PCWIN'
computer:
'PCWIN'
testdata:
[1x1struct]
my_software.testdata%显示testdata域中的内容
ans=
test1:
[2x2double]
test2:
[2x2double]
my_software.testdata.test1%显示test1域中的内容,系统默认为double型
ans=
3.74003.2700
3.56003.4100
另外,还可通过MATLAB的一个专门的构造函数struct来创建结构数组。
(1)使用struct函数构造结构数组
my_software=struct('name','MATLAB','version','7.0.0.19920(R14)','computer','PCWIN','testdata',[]);%用‘[]’来预定义空域‘testdata’
my_software.testdata=struct('test1',[3.743.27;3.563.41],'test2',[65.2368.75;63.0661.18]);%再次调用‘struct’命令来对‘testdata’进行赋值
(2)查看结果
my_software%显示结构数组的内容
my_software=
name:
'MATLAB'
version:
'7.0.0.19920(R14)'
system:
'PCWIN'
computer:
'PCWIN'
testdata:
[1x1struct]
事实上结构数组内的其他内容也是一样的,本例就是简单介绍了两种不同的创建方法。
这里还要说明几点,
(1)struct函数指令中的输入参数,第2、4、6等偶数项如为字符串需用单引号,或者为数组,数值数组或者字符数组均可;
(2)空数组‘[]’可以用来创建新的空域,并且可以在接下来的语句中直接对其进行赋值操作。
(3)struct命令不能创建多重的结构数组,如有需要可以多次调用struct命令或者嵌套调用struct函数。
接下来介绍结构数组中内容的提取和编辑。
【例1-4】结构数组内容的提取和编辑
首先建立一个简单的统计个人计算机信息的结构数组,
mycomputer.manufacturer='Lenovo';
mycomputer.type='补天系列商用机';
mycomputer.cpu='Pentium(R)43.000GHz';
mycomputer.system='windowXPEnglishversion';
mycomputer
mycomputer=
manufacturer:
'Lenovo'
type:
'补天系列商用机'
cpu:
'Pentium(R)43.000GHz'
system:
'windowXPEnglishversion'
如果要获得电脑是何系列的信息,并且将该信息单独另外存储,可以在结构名mycomputer后面跟一个小数点,接下来是要获取信息的字段名。
如用MATLAB语句来表达,如下:
Pctype_informations={mycomputer.manufacturer,mycomputer.type};
%将电脑的部分信息存入一个数组中
Pctype_informations%查看新的数组
Pctype_informations=
'Lenovo''补天系列商用机'
下面给读者演示如何在结构数组mycomputer上进行域的增添和删除操作。
【例1-5】对结构数据进行域的增添和删除
继续对例【1-4】中的结构数组进行操作。
mycomputer
(2).user.usertype='administrator';
mycompute%查看mycomputer信息
mycomputer=
1x2structarraywithfields:
manufacturer
type
cpu
system
user
可见,对mycomputer
(2)的赋值操作会影响到整个结构数组mycomputer的总体结构。
在此类数组中任何一个结构上的域增添操作,都会对整个结构产生影响。
再查看结构数组mycomputer
(1).user的内容。
mycomputer
(1).user
ans=
[]
当我们再查看mycomputer
(1).user的结构时,它并没有usertype这一项子域。
可见对mycomputer
(2)中的域user的子域usertype的赋值操作并没有对mycomputer
(1).user子域产生影响,所以在结构数组中任何一个结构上的子域增添操作,对整个结构中的同级别的域并没有影响。
下面通过实例来总结结构数组的删除操作规律,
mycomputer
(1).user.username='Guest';
mycomputer
(1).user.usertype='guest';
mycomputer
(2).user.username='admin'
mycomputer
(2).user=rmfield(mycomputer
(2).user,'usertype');
%删除usertype子域
mycomputer
(2).user%查看mycomputer
(2).user的内容
ans=
username:
'admin'
mycomputer
(1).user%查看mycomputer
(1).user的内容
ans=
username:
'Guest'
usertype:
'guest'
通过以上操作可以看出来删除子域的操作也只是影响到被操作的那个具体结构。
1.1.4数组与矩阵的生成
MATLAB中,数值数组(NumericArray)和数组运算(ArrayOperation)构成了其核心内容。
本节主要介绍数组和矩阵的生成。
这里主要介绍一维数组的创建。
大致可以分三种方法,直接构造法、增量法、函数构造法。
1.直接构造法
又称逐个元素输入法,这种方法最直接也最简单。
下面举例说明。
【例1-6】数组元素的直接构造法
a=[406.31/21e-2sqrt(5)]%采用逐个元素输入法构造数组
a=
40.00006.30000.50000.01002.2361
这就构造了有五个元素的一维数组元素a。
2.增量法
部分参考书称此方法为冒号生成法。
它主要是利用MATLAB中提供的冒号运算符来实现赋值运算。
举例说明入下:
【例1-7】数组元素构造的增量法
A=1:
9
A=
123456789
系统默认的增量为1,以上就生成了19的数组。
也可以设置增量的步长,举例如下:
A=10.5:
-1.5:
3
A=
10.50009.00007.50006.00004.50003.0000
这样就生成了一组以-1.5为步长的递减数组。
另外有一点值得说明,看下面一个数组:
b=2;
A=10.5:
-1.5:
b
A=
10.50009.00007.50006.00004.50003.0000
可见本例中后面的终止值发生变化时并没有影响到A的生成,当b的范围在1.5b3之间变化时,所生成数组A的值并不会发生变化。
从严格意义上讲,如二维数组带有线形变换含义时,该二维数组就是矩阵。
矩阵的创建通常有两种方法,直接输入法和利用M文件创建。
值得注意的是,首先输入数组时整个数组必须以方括号“[]”为其首尾;其次数组的行与行之间必须用分号或者回车键Enter隔离;另外数组元素由“,”或空格分隔。
1.2基本数学运算..
1.2.1向量及其运算
如果一个向量A有1行,n列元素,那么称该向量为n阶行向量;如果向量A有1列,n行元素,那么该向量就为n阶列向量。
MATLAB语言中定义了下面各种矩阵的基本代数运算:
(1)向量转置。
在数学公式中一般把一个矩阵的转置记作
,如果矩阵
为n阶行向量,那么转置后为n阶列向量。
转置的举例如下:
【例1-8】向量转置
>>A=[123]
A=
123
>>B=A'
B=
1
2
3
(2)向量的加减法运算。
存在两个向量A和B,可由
和
命令执行向量的加减法。
通常如A和B向量维数相同,它会自动地将A和B向量的相应元素相加减。
举例如下:
【例1-9】向量的加减运算
>>A=[234];
>>B=[123];
>>C=A+B
C=
357
还有一种情况是,参与加减操作的其中一个为标量结果会是什么结果呢?
>>D=5-A
D=
321
(3)向量乘法。
存在两个向量A和B,如果两者分别为n维列向量和行向量,那么该操作可表达为
,举例如下:
【例1-10】向量乘法
>>A=[123];
>>B=[234]';
>>C=A*B
C=
20
>>D=B*A
D=
246
369
4812
(4)点运算。
该运算是MATLAB定义的一类特殊的操作。
两个向量之间的点运算式他们对应元素的直接运算。
【例1-11】MATLAB中的点运算
>>A.*B'
ans=
2612
>>A./B'
ans=
0.50000.66670.7500
向量的乘方运算,举例
>>A.^2
ans=
149
除了代数运算,还有逻辑运算、比较运算等。
1.2.2矩阵及其运算
如果一个矩阵有n行、m列元素,称该矩阵为
矩阵。
倘若
,则该矩阵又称为方阵。
矩阵的基本数学运算包括代数运算、矩阵的逻辑运算和矩阵的比较运算。
其中矩阵代数运算包括矩阵转置、加减法、矩阵乘法、矩阵左(右)除、矩阵翻转和矩阵乘方运算。
1.2.2.1矩阵的基本代数运算
这里只简单介绍几类运算,矩阵的左(右)除和矩阵翻转。
(1)矩阵的左除。
MATLAB中表示两个矩阵左除所用的运算符为‘\’,方程
的解
可用
与
的左除表示
。
倘若
为非奇异的方阵,那么方程
的解可以表示为
。
(2)矩阵的右除。
MATLAB中表示矩阵右除的符号为‘/’,相当于求方程
的解。
当
为非奇异方阵时
。
(3)矩阵翻转。
MATLAB提供了一些矩阵翻转的特殊命令,下面通过实例来查看:
【例1-12】通过实例演示矩阵翻转
>>A=[123;456;789]
A=
123
456
789
>>B=fliplr(A)
B=
321
654
987
可见,fliplr命令是完成的矩阵A的左右翻转操作。
>>C=flipud(A)
C=
789
456
123
明显,flipud命令执行的是矩阵A的上下翻转操作。
此外,MATLAB中还有其他一些对矩阵执行翻转操作的命令,如命令rot90为将矩阵逆时针旋转90o。
>>D=rot90(A)
D=
369
258
147
1.2.2.2矩阵的逻辑运算
一个数的值为0,则可认为它为逻辑0,否则为逻辑1。
如果
和
均为
矩阵,则MATLAB中定义了如下的逻辑运算:
1.矩阵的“与”运算。
通常用表示矩阵的与运算。
如用
表示两个矩阵的与运算,如果两矩阵对应元素处均非0,那么结果元素为1,否则的话结果为0。
【例1-13】矩阵的“与”运算
>>A=[0000;0110;0110;0000]
A=
0000
0110
0110
0000
>>B=eye(4)
B