资源描述
计算机仿真
可查询工作空间中有哪些变量。
who:只简单地列出工作空间中的变量名字;
whos:除变量名之外,还报告更详细的信息,与工作空间窗口显示类似。
形式:who
2. 装入与存储变量与数据的命令:load和save
load: 一般用于将MATLAB格式的数据文件装入工作空间;形式为load abc save:与load文件相对应,是将当前变量或某些指定变量存入MATLAB数据文 件。如工作空间中有一些变量,可用save abc保存,存为数据文件abc.mat。 如果要保存指定的变量X、Y、Z,那么可写为: save abc X Y Z。
3. 清除命令:3c或clear
clc:清除命令窗口的显示内容,但不清除工作空间。clc
clear:该命令用于清除工作空间中的全部或局部指定变量。
clear清除所有变量;
clearX YZ清除名为X、Y、Z的变量。
4. 命令窗口数据显示格式命令:format
format命令设置或改变数据的输出格式。如显示:x=[4/3 1.2345e-6]
format short:短格式,该格式显示5位有效数字。显示为:1.3333 0.0000
format short e:短格式e 方式。显示为:1.3333e+00 1.2345e-06
format long:长格式,显示15位有效数字。显示为:
1.33333333333333 0.00000123450000
format long e: 长格式e方式。显示为:
1.33333333333333e+00 1.2345000000000e-06
format hex: 16 进制格式。
format rat:分数格式。显示为:4/3 1/810045
5. help 命令:
在命令空间中输入help命令,可提供MATLAB的在线帮助。
help:列出主要的帮助主题;
help帮助主题:列出指定主题下的函数;
help函数名:对所选函数的功能、调用格式及相关函数给出说明。
6. lookfor 命令:
当需要查找具有某种功能的函数但却不知道该函数的准确名称时,可以
用lookfor命令。如:
lookfor Lyapunov
可列出与Lyapunov有关的所有函数。
7. which 命令:
用于显示指定的外部函数(M文件)所在的目录,如指定的是内部函数, 那么系统会显示该函数是内部函数,而不显示目录。如:which abc 那么系统会显示文件abc所在的目录。
8. what 命令:
列出当前路径下的M文件、MAT文件、MEX文件和Class
第二节MATLAB语言的基本语句结构
MATLAB语言的规那么十分简单,它是一种表达式语言,其语句类似于数学式子,非 常容易掌握。那么,怎样去写这些数学式子呢? MATLAB也有它的规那么。
2. 1 MATLAB的矩阵、变量与表达式
在MATLAB系统中,只管理着一种对象-一矩阵(包括复数矩阵),任何数量在 MATLAB中是作为1x1的矩阵来处理的。
一 .矩阵的创立:
在MATLAB中创立矩阵的原那么: 1)矩阵元素必须写在“口”内; 2)矩阵的同一行之间用空格或“,”分隔; 3)矩阵的行与行之间用分号或回车符分隔; 4)矩阵的尺寸不必预先定义;
5)矩阵元素可以是数值、变量、表达式或函数。
在MATLAB中矩阵的创立有四种方法。
1 .在命令窗口直接输入: 如输入:A=[l, 2, 3; 4, 5, 6; 7, 8, 9] A= 1 2 3 4 5 6 7 8 9
也可用空格代替逗号,用回车代替分号: 如上例:A=L1 2 3 4 5 6 7 8 9] 那么显示:A=
1 2 3
4 5 6
7 8 9
2 .由M文件创立矩阵:
当矩阵的尺寸较大时,可以按矩阵的输入方式编辑一个M文件(可用循环程序来 做),在命令窗口直接执行该文件,即可将矩阵调入工作空间。
3 .由函数创立矩阵:
对于一些特殊的矩阵,可以利用MATLAB的内部函数或用户自定义函数创立矩阵。 如diag()函数可生成对角阵。
4 .通过数据文件创立矩阵:
可用load命令调入数据文件,创立新矩阵。
复数矩阵的表示:
在MATLAB中,复数的虚根单位用i,j表示,即:z=3+4i或z=3+4j.
可用下面的语句输入复数矩阵:
》A=[l 2;3 4]+i*[5 6;7 8];或
》A=[l+5i 2+6i;3+7i 4+8i]
二 .MATLAB的变量和表达式:
1 .变量用变量名表示。
MATLAB变量名是由假设干个字符构成的字符串,构成变量名的字符可以是字母、数 字或下划线,但第一个字符必须是字母。
MATLAB6可分辨31个字符,超过31个那么不认。
MATLAB中的变量是分辨大小写的,M和m是两个变量。
因MATLAB的变量采用统一的数据类型--矩阵,所以无须对变量的类型进行说 明,当需要使用一个新变量时,只须直接对其赋值即可。
函数名可作为特殊的变量名看待,但要求是小写字母,如:求矩阵A的逆inv(A), 要是写为Inv (A)那么会出现未定义的警告。
2 .表达式那么是由运算符、函数调用、变量名以及特殊字符组成的式子。
3 . MATLAB中基本的赋值语句为:
》变量名=表达式 将表达式的结果赋给变量名(表达式的运算
结果都是一个矩阵)。
等号右边的表达式可以由分号“;”结束,也可以由逗号“,”或换行
号结束,但含义不同:
分号时,变量结果不显示;
逗号或换行号时,那么将结果显示出来。
》表达式 计算表达式的值,将其值赋给MATLAB的永久变
量 ans。
注:1) MATLAB中有几个不能被clear命令清除的变量,称永久变量。(其
他变量名最好不要与此同)。它们是:
ans:当不指明某一语句的计算结果赋给哪个变量时,系统自动
将该计算结果赋给变量ans;
eps:计算机能产生的绝对值最小的浮点数;
i, J:虚数单位,即-1的平方根;
inf, Inf:正无穷大;
nan, NaN:非数,常产生于0/0等运算;
Pi:圆周率。
2)如果表达式的值太复杂,一行写不下,可以加上三连点“…”回
车,然后接下去再写。如:
s=l-l/2+l/3-l/4+l/5-l/6+l/7-l/8 +•••
1/9-1/10+1/11-1/12;
3)在MATLAB函数调用时,MATLAB还允许有这样的形式,如:
》[m, p]=bode(n, d, w);
4.字符串与字符串变量:
MATLAB可将字符串当作数组或矩阵处理。在MATLAB中,字符串用单引号括起 来,如:
》S= 'Use Matlab'
输出结果是:
S=
Use Matlab
字符串存储在行向量中,每个元素对应一个字符,向量的值为字符对应的ASCII 码值。
2. 2 MATLAB的基本运算符
1 .矩阵运算符:
A' -一矩阵A的转置,如果A是复矩阵,那么其运算结果是共辗转置;
A+B-一矩阵的加运算,假设A和B的维数相同,那么会将A和B矩阵的相应元素相加; A-B-一矩阵的减运算,假设A和B的维数相同,那么会将A和B矩阵的相应元素相减; A*B―—矩阵相乘,A的列数与B的行数相等,即A和B矩阵维数相容,维数不相容 是不可乘的。如:
A n x m, B m x r, ^C=A*B, 那么:C n x r0
B/A-一方程X*A=B的解,即*=8*3。称矩阵的右除。
A\B-一方程A*X=B的解,即乂=3*8。称矩阵的左除。
矩阵的除法,其意义相当于矩阵的求逆运算。左除与右除的关系为: b/a=(a, \b')'。
A^B-一矩阵的乘方。
1) A为方阵,B为正整数时,表示矩阵A的B次乘积;
2) B为负整数时,表示矩阵A的逆阵的B次乘积;
3) B为非整数时,如8=”!!1,那么首先应该将A矩阵自乘n次,然后再对结果开m
次方;
4) A、B均为矩阵时无意义。
A.*B-—矩阵的点乘运算,表示A和B阵的对应元素直接相乘,A和B要有相同的 维数。
点运算在MATLAB中起重要的作用,如X是一个向量,那么求取X2时不能直接写成 X*X,而必须与成X. *x。
A. \B, A. /B-一矩阵的点除运算,表示A和B阵的对应元素直接相除,A和B要有相 同的维数。
A/B―—矩阵的点乘方,表示要对其元素逐一进行幕运算。与点乘相似。
2 .关系运算符:
MATLAB中提供了6种关系运算符,用于比拟两个同维数的矩阵:
> 小于
> -小于或等于
> 大于
> =大于或等于
==等于
~二不等于
关系运算符可以用于检查矩阵的元素是否满足某些条件。两个同维数的矩阵比拟 的结果是与它们同维数的0、1矩阵,1表示结果为真,0表示结果为假。
3 .逻辑运算符:
在MATLAB中,逻辑运算符有3种。
& 逻辑与。当运算双方对应元素都为非零时;结果为1,否那么,结果为0。
I 逻辑或。当运算双方对应元素有一个为非零时;结果为1,否那么,结果为0。
~ 逻辑非。当元素的值为0时,结果为1,否那么,结果为0。
例:a=[l 0 3;0 -1 6], b=[-l 0 0;0 5 0. 3],计算两矩阵对应元素 的逻辑关系。
» a&b
ans 二
1 0 0
0 1 1
>> a | b
ans =
1 0 1
0 1 1
» ~a
ans = 0 1 0 1 0 0
ans =
0 1 1
1 0 0
4 .特殊运算符:
在MATLAB中,有一些特殊的符号,具有特殊的意义。
1)在MATLAB的M文件中,可以加入解释行,解释行的标识符为:“#',该符号 后面的内容将作为注释内容。
2)行分隔符:“;”用在MATLAB语句后,用它时执行结果不显示,可防止显示 一些不感兴趣的结果。
3)冒号运算符“:”最主要的作用是生成向量。如:
j:k —生成向量[j, j+1, j+2, •••, k]
j:i:k - —生成向量[j, j+i, j+2i, j+3i,-,k] (j为起始值,i为步距,k为终 止值,在仿真中经常用于生成时间向量)
A(:, j) -一矩阵A的第j列
A(i,:) -一矩阵A的第i行
A(j:k) --生成向量A (A为向量时,为A的第j到第k个元素,当A为矩阵 时,为A的按列数的第j到第k个元素)
例:A =
1 2 3
4 5 6
7 8 9
» A(2:4) ans = 4 7 2
A(:, j:k)— 矩阵A的从第j列到第k列的矩阵子块
A(:, -一矩阵A的第j列和第k列
例:A = 1 2 3
4 5 6
7 8 9
» A(:, 1:2) ans 二 1 2
4 5
7 8
» A(:, [1,3]) ans = 1 3
4 6
7 9
4) MATLAB中允许对一个矩阵的单个元素进行赋值,如:
A = 1 2 3
4 5 6
7 8 9
当执行A(2, 3)=100,那么显示:
A = 1 2 3
4 5 100
7 8 9
注意:矩阵中元素按列存储,上例中对矩阵元素操作也可这样调用
A (8) =8
对于一个矩阵中0元素很多,而非0元素很少的情况,可以先形成0矩阵,然后 将非0元素输入。
如果给出的行数和列数大于原矩阵范围,那么将自动扩展原来的矩阵,并将扩展后 未赋值的矩阵元素置为0。如:
» A (4, 5)=8
A 二
1 2 3 0 0
4 5 6 0 0
7 8 9 0 0
0 0 0 0 8
2.3 MATLAB的常用函数
1. MATLAB通用函数:
包括数学函数和特殊函数。
数学函数有:三角函数、指数函数、复数函数、取整和求余函数。
三角函数:sin、cos> asin (反正弦)、acos (反余弦)、tan (正切)、atan (反正切)、cot (余切)、acot (反余切)等。
指数函数:exp (以e为底的指数)、log (自然对数)、loglO (以10为底的对 数)、log2 (以2为底的对数)、pow2 (2的幕次)、sqrt (开平方) 等。
复数函数:abs (绝对值或复数的模)、angle (相位角)、complex (由实部和虚 部构造复数)、conj (复数的共辗)、real (复数的实部)、imag (复数 的虚部)等。
取整和求余函数:fix (朝0方向取整)、floor (朝负无穷方向取整)、ceil (朝 正无穷方向取整)、rem (除后取余数)、sign (符号函数)、round (四 舍五入)到最近的整数)等。
特殊函数有:特殊数学函数、数理函数、坐标变换。
2 .矩阵和数组(向量)函数:
det (方阵的行列式)、inv (矩阵的逆)、norm (矩阵或矢量的范数)、normest
(矩阵的2范数)、rank (矩阵的秩)、svd (矩阵的奇异值分解)、trace
(矩阵的迹)、eig (矩阵的特征值和特征矢量)、expm (矩阵指数)、logm
(矩阵对数)、sqrtm (矩阵平方根)等。
3 .逻辑和关系函数:
all (x)检查x是否全为1 (true)
any(x)检查x是否有不为0的元素
exist (x)检查变量的存在性和类别
find(x)找出非0元素的位置标识
isempty (x)检查是否为空矩阵
isinf(x)检查是否为无穷大
isglobal (x)检查是否为全局变量
issparse(x)检查是否为稀疏矩阵
isstr(x)检查是否为字符串
and (a, b)逻辑与
or (a, b)逻辑或
not (a)逻辑非
xor (a, b)逻辑异或
4 .矩阵的特殊操作函数:
在计算机仿真的编程中,常常遇到一些特殊的矩阵,如零矩阵、单位阵、全1阵等 等。下面介绍有关的操作函数。
1)零矩阵 zeros(n) nxn的零阵
zeros(n,m) n行m列的零阵
2)全1阵 ones(n,m) n行m歹U的全1阵
3)单位阵 eye(n) nxn的单位阵
4)随机阵 randn(n,m)元素为正态分布随机阵
5)空矩阵x=□将一个0x0阶的空矩阵赋给变量x
MATLAB中定义了一个很特殊的矩阵,即空矩阵,它的作用是:利用空矩阵的特 性,可以进行从一个矩阵中消去局部行或列的运算。如:
A(:,[2,4])=□-——其运算结果是从矩阵A中削去第2列和第4列的矩阵子块。
空矩阵的作用与MATLAB中清除变量命令clear是不相同的。Clear x是从工作环境 中清除变量x,清除后再引用变量x是非法的,而空矩阵仍可引用。
6)大矩阵的构造方法:
与数学运算一样,MATLAB可以由小矩阵作为矩阵子块来构造大矩阵。
如:A是n阶方阵,那么C=[A K" ; ones (size (A)) A/2]可创立一个2n阶方阵。
在这样的运算中,注意一定要保持阶数的协调性,否那么会给出出错信息。
7)多项式的伴随矩阵:compan(x)是线性代数中讲过的重要矩阵。
8)对矩阵的特殊操作:
rot90(a)将a矩阵旋转90度
fliplr(a)将a矩阵的列反序
flipud(a)将a矩阵的行反序
diag(a,n)抽取矩阵a的第n条对角线上的所有元素,n大于0时,抽取矩阵上方的 第n条对角线,n小于0时,抽取矩阵下方的第n条对角线,n等于0或不 指定n时,抽取主对角线一a为矩阵diag(a)将向量a构成对角阵(元素放在 主对角线上)一a为向量
diag(a,n)将向量a构成对角阵(a元素放在第n条对角线上,n的情况与上同)一a为 向量
tril(a) 提取矩阵的下三角局部
triu(a) 提取矩阵的上三角局部
reshape改变矩阵的阶数,按列的顺序重排。如:
A =
1 47 10
25 8 11
3 69 12
» B=reshape(A,2,6)
B 二
1 3 5 79 11
2468 10 12
又如:>>tril(A)
ans =
1 000
25 00
3 690
2.4 MATLAB 语句
一.输入输出语句:
MATLAB提供了一些输入和输出语句,允许用户和计算机之间进行数据交换。
1. INPUT输入函数:
在编程时,如果想随时改变输入参数值,可采用input。函数来进行输入,它的调用格 式为:
A=input(提示信息,选项);
提示信息可以是字符串显示,用它来提示输入的是什么样的数据,如:
» A=input('Enter matrix A => ')
Enter matrix A => [ 1 2 3;4 5 6;7 8 9]
A =
1 23
456
789
如果在input。函数调用时采用了 ‘s'选项,那么允许用户输入字符串。
如: » A=input(fEnter matrix A => ?s')
Enter matrix A => matlab
A =
Matlab
2. DISP输出函数:
MATLAB提供的输出函数主要有disp()函数,它的调用格式为:
disp(A)
其中A既可以为字符串,也可以为矩阵
3. 将数值转换成字符串输出:
MATLAB还提供了较实用的字符串处理及转换函数,如:
int2str()函数可以方便地将一个整形数据转换成字符串形式,该函数的
调用格式为:
» cstr=int2str(i)
如:»Inum=15;
» disp([The value of Inum is * int2str(Inum),! ! ok'])
The value of Inum is 15 ! ok
注意:在矩阵中,每一个元素之间要有空格或逗号。
二.循环语句:
MATLAB提供了两种循环方式:for-end循环和while-end循环。
1. for循环语句:
for循环语句为计数循环语句。如果要反复执行的一组语句的循环次数是的或 预定义的,就可以使用for循环语句。它的基本格式为:
for循环变量=表达式1 :表达式2:表达式3
循环语句组
end
上面的表达式1表示循环初值,表达式3表示循环终值,表达式2是步长,该式相 当于冒号表达式。当步长为1时,表达式2可省略。如:
Sl=l;
S2=l;
S3=10;
for I=S1:S2:S3
X(I)=0
end
注:1)如果表达式3的值〈表达式1的值,语句仍是合法的,但MATLAB不执行循 环内的语句;
2) for和end必须配对使用;
3) for语句还可以嵌套,但每一个for必须与一个end配对使用。如:
m=3;
n=4;
目录 I
第一章 控制系统及仿真概述 1
第一节 控制系统仿真的基本概念 1
第二节系统仿真的目的和分类 2
第三节系统仿真软件的开展 5
第二章MATLAB语言的使用与程序设计 6
第一节MATLAB系统简介 6
第二节MATLAB语言的基本语句结构 11
第三章MATLAB的绘图功能 29
第一节 图形窗口与坐标系 29
第二节二维图形的绘制 30
第三节图形的修饰与标注 37
第四节MATLAB以下图形对象的修改 40
第四章MATLAB在控制系统仿真中的应用 43
第一节控制系统数学模型的基本描述方法 43
第二节控制系统的稳定性分析 49
第三节控制系统的根轨迹 50
第四节系统的频率响应 51
第五节线性系统时间响应分析 55
第六节延迟系统的仿真 56
第七节状态空间法仿真实现 56
第八节最优控制仿真 59
第五章动态系统建模仿真工具SIMULINK 61
第一节SIMULINK简介 61
第二节SIMULINK的建模与仿真方法 65
第三节SIMULINK仿真实例 71
第六章控制系统工具箱简介 77
第一节MATLAB工具箱简介 77
第二节控制系统工具箱使用 80
for i=l:m
for j=l:n
A(i,j)=l/(i+j-l)
end end
例题:求曲的值。程序为: f=i
mysum=0;
for i= 1:100
mysum=mysum+i;
end
disp(mysum)
2. while循环语句:
while循环语句是条件循环语句,它的作用是在一定的逻辑条件控制下,不断地循环执 行一条或一组语句,直到逻辑条件不再满足为止。适用于循环次数事先不知道的情 况。它的基本结构
while条件式
循环语句组
end
它的执行方式是:假设条件成立,那么执行循环体,再判断表达式是否仍然成立,如不成 立那么跳出循环,向下执行。
如将上例改用while循环,那么可写出以下程序:
sum=0;
i=l;
while i<= 100
sum=sum+i;
i=i+l;
end
注:1)允许多级嵌套;2) while和end必须配对使用;3) for形循环和while形循 环也允许相互嵌套。
三.条件控制语句:
1. if条件转移语句:
if条件转移语句的格式为:
if条件式
条件块语句组
end
成•
if条件式
条件块语句组1
else
条件块语句组2
end
成,
if条件式1
条件块语句组1 elseif条件式2
条件块语句组2
else
条件块语句组
end
2. break 语句:
break语句的作用一般是终止循环过程,退出循环体。常与if语句一起使用。
例:将上例中给出的问题变成:求出满足的最小m。那么程序为:
*=1
mysum=O;
for m=l :1000
if mysum> 10000,
break;
end
mysum=mysum+m;
end
disp(m)
四.分支语句:switch语句
switch语句可实现多分支的条件选择,在功能上与if-elseif-elseif-…else
结构相似。
它的语句格式为:
switch表达式
case表达式]
语句组1
case表达式2
语句组2
case表达式n
语句组n
otherwise
语句组
end
执行过程:switch后面表达式的值可以是数值变量或字符串变量,通过比拟该值 与case后面的值来决定执行哪局部。如与哪一个case的值相同就执行 哪一个下面的语句组,如果与所有case的值都不同,那么执行otherwise 下面的语句组。Otherwise语句可以省略,如果省略otherwise,所有 case都不满足时跳出分支结构。
Switch与end必须配对使用。
例:如下的程序可以生成一个三对角矩阵: m=10;
n=10;
for k=l :m for 1=1 :n switch abs(k-l) case 0
A(k,l>l; case 1 A(k,l)=2; otherwise A(k,l)=0; end end end A 程序运行结果为:
A 二
1 200000000
2 1 20000000 02 1 2000000 002 1 200000 0002120000 00002 1 2000 000002 1 200 0000002 1 20 00000002 1 2 0000000021
五.检测语句:try-catch语句
检测语句try-catch主要用于检测错误并改变流程,其一般形式为: try 语句组1 catch
语句组2 end
执行方式:检测语句首先执行try下面的语句组1,如果没有错误,执行完成后跳 出结构。如果执行语句组1时出现错误,那么执行catch下面的语句组2。
可以使用lasterr函数查询最后的错误信息,当查询结果为空字符串时, 表示语句组1成功执行。
例:使用try-catch语句,判断错误语句。
在编辑器中编辑以下命令,判断错误语句:
n=4;
a=magic(3) %产生3x3的魔方矩阵a
try
a_n=a(n,:) %MZa的第n行元素
catch
a_end=a(end,:) %如果取a的第n行出错,那么改取a的最后一行
end
lasterr %显示出错原因
该程序的执行结果为:
a 二
8 1 6
357
492
a_end =
492
ans 二
Index exceeds matrix dimensions
六.其它流程控制语句:
1. continue 语句:
continue语句用于在for循环和while循环中跳过某些执行语句。
在for循环和while循环中,如果出现continue语句,那么跳过循环体中所有剩余的语 句继续下一次循环,在嵌套循环中,continue控制执行本嵌套中的下一次循环。
例:使用continue语句,用于统计文件的行数。在编辑器中编辑以下命令:
fid=fopen('magic.m7r,) %翻开magic.m 文件
count=0; %计数器置零
while〜feof(fid); %判断是否是文件末尾
line=fgetl(fid); %从文件中读行
if isempty(line)|stmcmp(line/%\ 1) %判断是否是空行或注释行
continue %如是空行或注释行继续下一次循环
end
count=count+l; %计数器加 1
end
disp(sprintf(f%d lines*,count)); %显示行数(删除空行或注释行后)
2. return 语句:
return语句用于终止当前的命令序列,并返回到调用的函数或键盘,也用于终止 keyboard 方式。
在MATLAB中,被调用的函数运行结束后会自动返回到调用函数,使用return语 句时,将return插入被调函数的某一位置,根据某种条件迫使被调用函数提前结束并返 回调用函数。
例:在编辑器中编辑以下函数,运行文件:
function d=det(A)
%det(A)为计算矩阵A的行列式函数
if isempty(A)
d=l;
return %如果矩阵是空的那么返回调用函数 else
• • •
end
2.5程序M文件与函数M文件的编辑
在MATLAB中M文件有两种类型,即程序M文件和函数M文件。程序M 文件可以在命令窗口中直接执行,而函数M文件一般由其它语句来调用,用户 不能单独键入其文件名来运行一个函数M文件。函数M文件也称为M函数。
它们都是纯文本文件,可以用任何文本编辑器编辑,但MATLAB中包括了 专门的M文件编辑器,该编辑器不但提供了M文件的编辑功能,同时还与 MATLAB的环境一起实现了MATLAB命令和函数文件的运行和调试。
一.程序M文件的编辑:
翻开命令窗口中的File菜单,选择NewM-file可进入M文件编辑器,或点击快捷 键也可翻开M文件编辑器。M文件编辑器的菜单栏和工具栏下面有3个区域,右侧的 大块区域是程序窗口,用于编写程序;最左边的区域显示行号,每行都有数字,包括 空行,行号是自动出现的,随着行数的增加而增加;在行号和程序窗口之间的区域上 有一些小横线,这些横线只有在可执行行上才有,空行、注释行、函数定义行等前面 都没有,在进行程序调试时,可以直接在这些横线上点击鼠标以设置或去掉断点。
M文件编辑器窗口的编辑菜单Edit有一组特别的操作,用于程序行的查找,这对 程序开发过程中内容的查找和修改是非常有用的。
Go to Line... 找到指定行号处(将光标自动移到指定的行上)
Set/Clear Bookmark设置和清除书签(设置时首先将光标移到想要设置书签的行 上,然后选择该项;清除时只要再选择一次该项,书签标记 就消失了。)
Next Bookmark 找到下一个书签处(找到光标所在位置的后一个书签所在行)
Prev Bookmark 找到前一个书签处(找到光标所在位置的前一个书签所在行)
设置书签的目的是为了查找程序中某些内容所在的位置,书签只按程序内容标 识,不按行号标识,与是否加减行数无关。
在Text菜单中:
Comment该选项的功能可以将选定的行设置为注释行,即在所有选定的行前面加 上一个“%”
Uncomment在选定行中去掉"%”
下面是一个程序M文件的例子,它的文件名是fibno.m。
% A M-file to calculate Fibonacci numbers
f=[1 u;
i=l;
while f(i)+f(i+l)< 10000
f(i+2)=f(i)+f(i+l);
i=i+l;
end
plot ⑴
(注:Fibonacci numbers为斐波纳契数列,它是一种整数数列,其中每数等于前 面两数之和)
其中f和i变量为全局变量,该程序执行完后,仍保存在工作空间中。
二.函数M文件的编辑:
函数M文件的组成:
1)函数定义行:MATLAB函数的第一行必须以关键字function开始,并指定函数 名,函数名应尽可能与该M函数的文件名相同,与此同时,也定义函数的输入 输出参数。
2) H1行:是帮助文本的第一行,它紧跟在定义行之后,以“%”开始,用于从 总体上说明函数的功能。
3)帮助文本:也是以“%”开始,用于详细介绍函数的功能和用法以及其它的说 明,在使用:help函数名 命令时,将会把该段显示出来。
4)函数体:是函数的主体局部。
5)注释:除了帮助文本外,还可以在文件的任何位置添加注释语句,但必须以 “%”开始。
M函数编写的基本格式为:
function [返回变量列表]=函数名(输入变量列表)
%H1行
%帮助文本(注释说明语句段)
函数体语句
例:下面是一个求均值的函数,其文件名为:mean.mo
function y=mean (x)
% MEAN Average or Mean Value
% For vectors, MEAN(x) returns the mean value
% For matrices, MEAN(x) is a row vector
% containing the mean value of each column
%
|m,n]=size(x);
if m-l
m=n;%如果为向量,那么取元素个数
end
y=sum(x)/m;
该文件定义了一个新的函数mean,在命令窗口可以调用该函数。如:
26
z=l:99;
»mean(z);
ans=
50
在MATLAB函数中,输入变量和返回变量的个数分别用nargin和nargout两个 MATLAB保存参数来给出。
由于在函数体内使用的变量均为局部变量,在函数执行完后,这些变量会自动在 工作空间中被清除掉。如果想使这种变量变为在整个程序中都起作用的变量,那么可将 它设置成全局变量。方法是:global变量名。习惯上将全局变量定义为大写字母。 2.6程序的调试与优化
在程序设计中不可防止地会出现各种各样的错误,一般来说可以归纳为三种:语 法错误、运行错误和其它错误。
语法错误:通常在程序输入时产生,如函数名拼写错误、括号不匹配等问题。
程序运行时会显示出错误信息。
运行错误:通常是在算法上发生了错误,如错误地修改某个变量或完成一个不正 确的计算,当产生这些意想不到的错误结果时,就出现了运行错误。在程序运行时也 会显示出错误信息。
其它错误:还有一些错误可能是由于解题思路不正确或对问题的理解不准确而引 起,通常在运行时不会有错误信息输出,只有发现计算结果不符合要求时,才会注意 到。要分析这样的错误,可能是一个比拟复杂的过程。
这节我们只介绍语法错误和运行错误的调试方法。
一.程序的直接调试法:
直接调试法包括以下几个方面:
1)根据错误信息检查。程序在运行时,如发现错误会自动停止在出错的位置并给 出错误信息。在MATLAB6中,点击命令窗口中带有下划线的错误信息、,就可 以翻开出现错误的M文件,并找到相应的程序行,进行修改。(这中间的错误 包括:函数或命令拼写是否正确、括号是否配对、各种流程控制语句是否匹配 等)。
2)如出现第三类错误,那么可将有疑义的计算结果后的分号去掉,使结果显示出 来。
3)利用echo命令,可以在文件运行时将所运行的语句内容显示出来,echooff命 令那么可关掉显示状态。
4)在程序的适当位置添加keyboard命令,当程序运行中遇到keyboard命令时回暂 时停止运行,将控制权交给键盘。这时命令窗口的提示符变为:
K»,可以在命令窗口键入变量名,以检查各变量的内容是否正确,也可以键入 命令修改变量。当检查和修改完成后,键入return命令。将控制权交还给系统, 程序将继续运行。
5)如果怀疑某个函数文件有问题,可以在函数的定义行前加“%”,使之变成命 令文件进行调试。
6)直接在M文件编辑器界面的行号和程序窗口横线上点击鼠标来设置或去掉断 点。
二.调试器的使用:
如果文件规模较大,或文件嵌套复杂,可以借助专门的调试工具一程序
调试器。调试器位于编辑/调试窗口中,使用调试器调试的一般步骤如下:
1)在Debug菜单中选择Run开始运行;
2)出现错误时,运行自动停止,根据错误信息找到相应的程序位置;
3)在可能出现错误的程序行位置添加断点。如果错误在被调用的函数中,断点应 设置在被调用的函数前。设置断点是高级语言程序调试的重要手段之一;
4)重新运行后,程序会自动暂停在断点处,将鼠标指向感兴趣的变量名,可以看 到变量的内容,此时相当于处于keyboard状态;
5)如果希望进入被调用的函数内部进行观察,选择Stepin图标,直至查出错误, 进行修改;
6)重新运行,检查是否有新的错误。
注:Debug菜单说明:(有相应的快捷键)
Step
Step in
Step out
Save and Run
Go Until Cursor
三.程序设计的优化:
单步运行
单步运行,遇到函数时进入函数,仍单步运行
如果是在函数中,跳出函数;如果不在函数中,直接运行到下 一个断点处
存储文件并开始运行,如文件是已存储过的,那么该菜单变为 Run,当程序暂停在断点处时,该菜单项变为Continue 直接运行到光标所在位置Exit Debug Mode退出调试方式
通过对MATLAB程序的优化设计可以进一步提高MATLAB程序的运行效率。
1 .尽量用矩阵运算代替循环运算:
循环运算是MATLAB运算的一个弱点,在程序设计时,应尽量防止循环运 算,采用矩阵运算,以加快运行速度。
例如:为计算从1到10之间的1001个点的正弦数值,通常的方法是:
i=0;
for t=0:0.01:10
i=i+l;
Y(i)=sin(t) end
如果按照矩阵的方法,相同的结果可以由以下语句组得出:
t=0:0.01:10;
y=sin(t)
在一台PC386上执行前一组语句需要15秒,而后一组语句仅需大约0.6秒,可 见采用矩阵运算使程序得到了显著优化。
2 .数据的预定义:
虽然在MATLAB中没有规定变量使用时必须预先定义,但对于未定义的变量,如 果操作过程中出现越界赋值等问题,系统将不得不对变量进行扩充,这大大降低了运 行效率。所以对于可能出现变量维数不断扩大的问题时,应当预先估计变量可能出现 的最大维数,进行定义,预先分配内存空间。
如:y=zeros(l,100) %预先定义有100个元素的行
展开阅读全文