您的当前位置:首页第一讲软件使用练习-MATLAB篇

第一讲软件使用练习-MATLAB篇

2020-08-12 来源:爱问旅游网
第一讲:软件使用练习-MATLAB篇

§1-3 MATLAB编程

1-3-1例子

例1-54通过M脚本文件,画出下列分段函数所表示的曲面。

0.5457e0.75x23.75x11.5x1x1x21x226x12p(x1,x2)0.7575e1x1x21

0.75x223.75x121.5x10.5457ex1x21(1) 编写M脚本文件的步骤

点击MATLAB指令窗工具条上的New File图标

,就可打开如图8.1-1-1所示

22的MATLAB文件编辑调试器MATLAB Editor/Debugger。其窗口名为untitled ,

用户即可在空白窗口中编写程序。

图 MATLAB Editor/Debugger 窗口

 比如输入如下一段程序 [zx81.m]

a=2;b=2; clf;

x=-a:0.2:a;y=-b:0.2:b; for i=1:length(y) for j=1:length(x) if x(j)+y(i)>1

z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2-1.5*x(j)); elseif x(j)+y(i)<=-1

z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2+1.5*x(j)); else z(i,j)=0.7575*exp(-y(i)^2-6.*x(j)^2); end end

end

axis([-a,a,-b,b,min(min(z)),max(max(z))]); colormap(flipud(winter));surf(x,y,z);  点击编辑调试器工具条图标

,在弹出的Windows标准风格的“保存为”

对话框中,选择保存文件夹,键入新编文件名(如zx81),点动【保存】键,就完成了文件保存。

(2)运行文件

 使zx81.m所在目录成为当前目录,或让该目录处在MATLAB的搜索路径上  然后运行以下指令,便可得到图形。 zx81

图 运行zx81.m得到的图形

例1-55通过M函数文件画出上例分段函数的曲面。

整个编程步骤和相同。在此演示,如何在zx81.m基础上产生函数文件zx82.m 。

 在编辑调试器中,选择【File:Save As】子菜单,把zx81.m文件“另存为”

zx82.m 。

 用下面指令代替原文件的第<1>条指令。

function zx82(a , b)

% a Define the limit of variable x . % b Define the limit of variable y .

 进行上述修改后,对zx82.m再次实施“保存”操作。

 在MATLAB指令窗中,运行以下指令,就能产生与图8.1-1-2完全相同的图

形。

zx82(2,2)

1-3-2关系和逻辑运算

除了传统的数学运算,MATLAB支持关系和逻辑运算。如果你已经有了一些编程经验,就会对这些运算熟悉。这些操作符和函数的目的是提供求解真/假命题

的答案。一个重要的应用是控制基于真/假命题的一系列MATLAB命令(通常在M文件中)的流程,或执行次序。

作为所有关系和逻辑表达式的输入,MATLAB把任何非零数值当作真,把零当作假。所有关系和逻辑表达式的输出,对于真,输出为1;对于假,输出为零。

1关系操作符

MATLAB关系操作符包括所有常用的比较。

关系操作符 说明 < 小于 < = 小于或等于 > 大于 > = 大于或等于 = = 等于 ~ = 不等于

MATLAB关系操作符能用来比较两个同样大小的数组(或矩阵),或用来比较一个数组和一个标量。在后一种情况,标量和数组中的每一个元素相比较,结果是与数组大小一样的0,1矩阵或数组。下面给出几个示例 例1-56: » A=1:9, B=9-A A =

1 2 3 4 5 6 7 8 9 B =

8 7 6 5 4 3 2 1 0 » tf=A>4 tf =

0 0 0 0 1 1 1 1 1

找出A中大于4的元素。0出现在A<=4的地方,1出现在A>4的地方。

» tf=(A= =B) tf =

0 0 0 0 0 0 0 0 0

找出A中的元素等于B中的元素。注意,=和= =意味着两种不同的事:= = 比较两个变量,当它们相等时返回1,当它们不相等时返回0;在另一方面, = 被用来将运算的结果赋给一个变量。

» tf=B-(A>2) tf =

8 7 5 4 3 2 1 0 -1

找出A>2,并从B中减去所求得的结果向量。这个例子说明,由于逻辑运算的输出是1和0的数组,它们也能用在数学运算中。

» B=B+(B= =0)*eps B =

Columns 1 through 7

8.0000 7.0000 6.0000 5.0000 4.0000 3.0000 2.0000

Columns 8 through 9 1.0000 0.0000

这是一个演示,表明如何用特殊的MATLAB数eps来代替在一个数组中的零元素,eps近似为2.2e-16。这种特殊的表达式在避免被0除时是很有用的。

» x=(-3:3)/3 x =

-1.0000 -0.6667 -0.3333 0 0.3333 0.6667 1.0000 » sin(x)./x

Warning: Divide by zero ans =

0.8415 0.9276 0.9816 NaN 0.9816 0.9276 0.8415

由于第四个数据是0 ,计算函数sin(x)/x时给出了一个警告。由于sin(0)/0是没定义的,在该处MATLAB结果返回NaN。用eps替代0以后,再试一次,

» x=x+(x= =0)*eps; » sin(x)./x ans =

0.8415 0.9276 0.9816 1.0000 0.9816 0.9276 0.8415

现在sin(x)/x在x=0处给出了正确的极限。

2 逻辑操作符

逻辑操作符提供了一种组合或否定关系表达式。MATLAB逻辑操作符包括:

逻辑操作符 说明 & 与 | 或 ~ 非

逻辑操作符用法的一些例子有: » A=1:9;B=9-A;

» tf=A>4 tf =

0 0 0 0 1 1 1 1 1

找出A大于4。

» tf=~(A>4) tf =

1 1 1 1 0 0 0 0 0

对上面的结果取非,也就是1替换0,0替换1。

» tf=(A>2)&(A<6) tf =

0 0 1 1 1 0 0 0 0

在A大于2‘与’A小于6处返回1。 最后,上面的功能易于产生数组来表示不连续信号,或由多段其他信号所组成的信号。基本想法是,把数组中要保持的那些值与1相乘,所有其他值与0相乘。例如, 例1-57: » x=linspace(0, 10, 100); % 产生0~10之间的100个数 y=sin(x) ; % 对每个数计算SIN值

z=(y>=0).*y ; % 对Y中>=0的数保持不变,其余取0 z=z+0.5*(y<0) ; % 继续对Y中<0的数加上0.5 z=(x<=8).*z ; % 继续对Z中坐标8以后的值取0 plot(x, z)

xlabel(' x '), ylabel(' z=f(x) '), title(' A Discontinuous Signal ')

A Discontinuous Signal10.90.80.70.6z=f(x)0.50.40.30.20.10024x6810 图1 不连续信号

3 关系与逻辑函数

除了上面的关系与逻辑操作符,MATLAB提供了大量的其他关系与逻辑函数,包括:

其 他 关 系 与 逻 辑 函 数

xor(x,y) 异或运算。x或y非零(真)返回1,x和y都是零(假)或都是非零(真)返

回0。

any(x) 如果在一个向量x中,任何元素是非零,返回1;矩阵x中的每一列有

非零

元素,返回1。

all(x) 如果在一个向量x中,所有元素非零,返回1;矩阵x中的每一列所有

元素

非零,返回1。

除了这些函数,MATLAB还提供了大量的函数,测试特殊值或条件的存在,返回逻辑值。

测 试 函 数

finite 元素有限,返回真值。 isempty 参量为空,返回真值。 isglobal 参量是一个全局变量,返回真值。 ishold 当前绘图保持状态是‘ON’,返回真值。

isieee isinf isletter isnan isreal isspace isstr isstudent isunix isvms

计算机执行IEEE算术运算,返回真值。 元素无穷大,返回真值。 元素为字母,返回真值。 元素为不定值,返回真值。 参量无虚部,返回真值。 元素为空格字符,返回真值。 参量为一个字符串,返回真值。 MATLAB为学生版,返回真值。 计算机为UNIX系统,返回真值。 计算机为VMS系统,返回真值。

1-3-3 MATLAB控制流 1.for循环结构

For循环允许一组命令以固定的和预定的次数重复。For循环的一般形式是: for 循环参数 = 初值:步长:终值 ( --数组) 语句 end

在for和end语句之间的语句按数组中的每一列执行一次。在每一次迭代中,循

环参数被指定为数组的下一列 例1-58:一个简单的for循环示例。 for i=1:10;

x(i)=i; end;

x

%要求显示运行后数组x的值。

%i依次取1,2,…10,.

%对每个i值,重复执行由该指令构成的循环体,

x =

1 2 3 4 5 6 7 8 9 10 For循环的其它重要方面是:

(1.) For循环不能用For循环内重新赋值循环变量n来终止。 » for n=1:10

x(n)=sin(n*pi/10); n=10; end » x

x =

Columns 1 through 7

0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090

Columns 8 through 10

0.5878 0.3090 0.0000

(2). 语句1 :10 是一个标准的MATLAB数组创建语句。在For循环内接受任何有效的MATLAB数组。 » data=[3 9 45 6; 7 16 data = 3 9 45 6 7 16 -1 5 for n=data x=n(1)-n(2) end x = -4 x = -7 x = 46 x = 1

(3). For循环可按需要嵌套。 for n=1:5 for m=5:-1:1 A(n,m)=n^2+m^2; end disp(n) end 1 2 3 4 5 » A A = 2 5 10 17 -1 5] 26

5 8 13 20 29 10 13 18 25 34 17 20 25 32 41 26 29 34 41 50

(4). 当有一个等效的数组方法来解给定的问题时,应避免用For循环。例如,上面的第一个例子可被重写为 » n=1:10; » x=sin(n*pi/10) x =

Columns 1 through 7

0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090

Columns 8 through 10

0.5878 0.3090 0.0000

两种方法得出同样的结果,而后者执行更快,更直观,要求较少的输入。

(5). 为了得到最大的速度,在For循环(While循环)被执行之前,应预先分配数组。例如,前面所考虑的第一种情况,在For循环内每执行一次命令,变量x的大小增加1。迫使MATLAB每通过一次循环要花费时间对x分配更多的内存。为了消去这个步骤,For循环的例子应重写为 »x=zeros(1,10); % preallocated memory for x » for n=1:10 x(n)=sin(n*pi/10); end

现在,只有x(n)的值需要改变。 2.while循环结构

与For循环以固定次数求一组命令的值相反,While 循环以不定的次数求一组语句的值。While循环的一般形式是:

while 关系表达式 语句 end

只要在表达式里的所有元素为真,就执行while和end 语句之间的{commands}。通常,表达式的求值给出一个标量值,但数组值也同样有效。在数组情况下,所得到数组的所有元素必须都为真。

ak2akak1 ,(k1,2,);例1-59:Fibonacci数组的元素满足Fibonacci 规则:

且a1a21。现要求该数组中第一个大于10000的元素。

a(1)=1;a(2)=1;i=2; while a(i)<=10000

a(i+1)=a(i-1)+a(i); %当现有的元素仍小于10000时,求解下一

个元素。

i=i+1; end;

i,a(i), i =

21 ans =

10946 3.if-else-end分支结构

很多情况下,命令的序列必须根据关系的检验有条件地执行。在编程语言里,这种逻辑由某种If-Else-End结构来提供。 最简单的If-Else-End结构是:

if 关系表达式 {commands} end

如果在表达式中的所有元素为真(非零),那么就执行if和end语言之间的{commands}。If-Else-End结构是:

if 关系表达式

commands evaluated if True else

commands evaluated if False end

在这里,如果表达式为真,则执行第一组命令;如果表达式是假,则执行第二组命令。

当有三个或更多的选择时,If-Else-End结构采用形式

if关系表达式1

commands evaluated if expression1 is True elseif关系表达式2

commands evaluated if expression2 is True elseif …… . . .

else

commands evaluated if no other expression is True end

最后的这种形式,只和所碰到的、与第一个真值表达式相关的命令被执行;接下来的关系表达式不检验,跳过其余的If-Else-End结构。而且,最后的else命令可有可无。

例1-60用for循环指令来寻求Fibonacc数组中第一个大于10000的元素。 n=100;a=ones(1,n); for i=3:n

a(i)=a(i-1)+a(i-2); if a(i)>=10000 a(i),

break; %跳出所在的一级循环。 end; end,i ans =

10946 i =

21 4.switch-case结构

例1-61学生的成绩管理,用来演示switch结构的应用。 clear;

%划分区域:满分(100),优秀(90-99),良好(80-89),及格(60-79),不及格(<60)。

for

i=1:10;a{i}=89+i;b{i}=79+i;c{i}=69+i;d{i}=59+i;end;c=[d,c];

Name={' Jack','Marry','Peter',' Rose',' Tom'}; %元胞数组 Mark={72,83,56,94,100};Rank=cell(1,5);

%创建一个含5个元素的构架数组S,它有三个域。

S=struct('Name',Name,'Marks',Mark,'Rank',Rank); %根据学生的分数,求出相应的等级。 for i=1:5

switch S(i).Marks

case 100 %得分为100时 S(i).Rank='满分'; %列为'满分'等级 case a %得分在90和99之间 S(i).Rank=' 优秀'; %列为'优秀'等级 case b %得分在80和89之间 S(i).Rank=' 良好'; %列为'良好'等级 case c %得分在60和79之间 S(i).Rank=' 及格'; %列为'及格'等级 otherwise %得分低于60。 S(i).Rank='不及格'; %列为'不及格'等级 end end

%将学生姓名,得分,登记等信息打印出来。

disp(['学生姓名 ',' 得分 ',' 等级']);disp(' ')

for i=1:5;

disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank]); end;

学生姓名 得分 等级

Jack 72 及格 Marry 83 良好

Peter 56 不及格 Rose 94 优秀 Tom 100 满分

1-3-4脚本文件和函数文件 1.脚本文件

由命令语句所构成的M-文件,具有以下特点:

(1)文件变量名必须以 .m作为扩展名;

(2)文件中所涉及变量都是全局变量,在运行过程中,可被当前工作区调用;

2.函数文件

函数文件具有以下特点:

(1)文件变量名必须与函数名相同;

(2)文件的第一行形式必须是: function 因变量 = 函数名(自变量) (3)文件中所涉及变量一般是局部变量;

(4)在函数M文件中,到第一个非注释行为止的注释行是帮助文本。当需要帮助时,返回该文本。

(5)第一行帮助行,名为H1 行,是由lookfor 命令搜索的行。

(6)函数可以有零个或更多个输入参量。函数可以有零个或更多个输出参量。 (7) 函数可以按少于函数M文件中所规定的输入和输出变量进行调用,但不能用多于函数M文件中所规定的输入和输出变量数目。如果输入和输出变量数目多于函数M文件中function 语句一开始所规定的数目,则调用时自动返回一个错误。

(8) 当函数有一个以上输出变量时,输出变量包含在括号内。例如,[V,D] = eig(A)。不要把这个句法与等号右边的[V,D] 相混淆。右边的[V,D] 是由数组V和D 所组成。

例1-62M函数文件示例。 [circle.m]

function sa = circle(r,s)

%CIRCLE plot a circle of radii r in the line specified by s. % r 指定半径的数值 % s 指定线色的字符串 % sa 圆面积 %

% circle(r) 利用蓝实线画半径为 r 的圆周线.

% circle(r,s) 利用串 s 指定的线色画半径为 r 的圆周线. % sa=circle(r) 计算圆面积,并画半径为 r 的蓝色圆面. % sa=circle(r,s) 计算圆面积,并画半径为 r 的 s 色圆面. if nargin>2

error('输入变量太多。'); end;

if nargin==1 s='b'; end; clf;

t=0:pi/100:2*pi; x=r*exp(i*t); if nargout==0 plot(x,s); else

sa=pi*r*r;

fill(real(x),imag(x),s) end

axis('square')

disp(q(ki,kj).value); fprintf('\\n'); end

例1-63 MATLAB函数fliplr。

function y = fliplr(x)

% FLIPLR Flip matrix in the left/right direction.

% FLIPLR(X) returns X with row preserved and columns flipped % in the left/right direction.

% X = 1 2 3 becomes 3 2 1 % 4 5 6 6 5 4 %

% See also FLIPUD, ROT90.

% Copyright (c) 1984-94 by The MathWorks, Inc.

[m, n] = size(x); y = x(: , n : -1 : 1);

MATLAB函数linspace :

function y = linspace(d1, d2, n)

% LINSPACE Linearly spaced vector.

% LINSPACE(x1, x2) generates a row vector of 100 linearly % equally spaced points between x1 and x2.

% LINSPACE(x1, x2, N) generates N points between x1 and x2. %

% See also LOGSPACE, :.

% Copyright (c) 1984-94 by The MathWorks, Inc.

if nargin = = 2 n = 100; end

y = [d1+(0:n-2)*(d2-d1)/(n-1) d2] ;

因篇幅问题不能全部显示,请点此查看更多更全内容