MATLAB程序设计.docx
《MATLAB程序设计.docx》由会员分享,可在线阅读,更多相关《MATLAB程序设计.docx(18页珍藏版)》请在冰豆网上搜索。
MATLAB程序设计
MATLAB程序设计
MATLAB提供了一个完善的程序设计语言环境,使用户能够方便地编制复杂的程序,完成各种计算。
本节先介绍关系运算、逻辑运算,再介绍M-文件(即程序文件)的结构及MATLAB的程序控制流语句。
一、关系运算和逻辑运算
1.关系运算
(1)关系运算符:
<;<=;>;>=;==;~=
(2)关系表达式:
用关系运算符将两个同类型的量(表达式)连接起来的式子。
【注】①关系运算本质上是标量运算,关系表达式的值是逻辑值(0-假1-真);
②当作用于两个同样大小矩阵时,则分别对两个矩阵的对应元素运算,结果是一个0-1矩阵。
例1.对向量进行关系运算。
>>A=1:
5,B=5:
-1:
1%输入向量
A=12345B=54321
>>C=(A>=4)%对向量进行关系运算
C=00011
>>D=(A==B)%对向量进行关系运算
D=00100
2.逻辑运算
(1)逻辑运算符:
&(and,与)、|(or,或)、~(not,非)
(2)逻辑表达式:
用逻辑将两个逻辑量连接起来的式子。
【注】①逻辑运算本质上是标量运算,它将任何非零元素视为1(真);
②当作用于两个同样大小矩阵时,则分别对两个矩阵的对应元素运算,结果是一个0-1矩阵。
(真值表见P27)
例2.对向量进行逻辑运算。
>>a=1:
9,b=9-a
a=123456789b=876543210
>>c=~(a>4)%非运算
c=111100000
>>d=(a>=3)&(b<6)%与运算
d=000111111
3.逻辑函数
any(x)向量x中有非零元返回1,否则返回0。
(向量函数)
all(x)向量x中所有元素非零返回1,否则返回0。
(向量函数)
isempty(x)矩阵x为空矩阵返回1,否则返回0。
find(x)返回向量x中非零元下标,若x是矩阵,则视其为一长列向量。
例3.对向量或矩阵进行逻辑运算,或调用逻辑函数。
>>a=[10-50;-3082]
a=10-50
-3082
>>b=all(a),c=any(a)
b=1010
c=1011
>>x=isempty(a)%判定矩阵a是否为空,不能用关系式”a==[]”!
x=0
>>y=find(c)%返回向量c中非零元下标
y=134
>>z=find(a)%1个输出参数
z=[12568]’
>>[m,n]=find(a)%2个输出参数
二、M-文件的结构
M-文件就是MATLAB程序文件,它是一个包含MATLAB语句组(命令序列)的普通ASCII文本文件,其扩展名为“.m”。
M-文件有两类:
脚本文件和函数文件。
1.脚本文件(亦称命令M-文件)
脚本文件的结构比较简单,它没有输入参数和输出参数,只是一些MATLAB命令行的组合。
脚本文件中定义的变量都是全局变量。
例4.给定矩阵
编写命令文件,输入矩阵A、B,并计算输出它们的和与差。
解:
建立如下M-文件SY00504.m
A=[123;456];%输入矩阵A
B=[401;012];%输入矩阵B
C=A+B%计算输出A与B的和
D=A-B%计算输出A与B的差
将上述文件以SY00504.m为名存盘,然后在命令窗口调用此M-文件,则有
>>SY00504
C=524D=-322
468444
2.函数文件(亦称函数M-文件)
和命令文件相比,函数文件稍微复杂一些。
通常函数文件包含以下几个部分:
(1)函数定义行位于文件首行,以function开头,说明函数名、输入/输出参数.
(2)帮助信息紧跟函数定义行后面,以%开头的注释行,给出该函数的在线帮助.
(3)函数体函数的执行语句部分,是函数文件的核心部分。
(4)注释部分命令行中以符号“%”开始直到该行结束部分的注释语句。
例5.编写函数文件,计算任意两个同维数矩阵的和与差。
(L000402.m)
解:
建立如下函数文件SY00505.m
function[C,D]=SY00405(A,B)
%给定矩阵A和B,计算输出其矩阵和C和矩阵差D
C=A+B;%计算矩阵和
D=A-B;%计算矩阵差
将上述文件以SY00405.m为名存盘,然后在命令窗口调用函数文件,则有
>>A=[123;456];B=[401;012];
>>[C,D]=SY00505(A,B)
C=524D=-322
468444
【注】
函数文件的第一行必须是函数说明语句;输入参量用圆括号括起,输出参量多于1个时用方括号括起;多个输入/输出参量时,参量之间用逗号隔开。
函数文件的变量一般是局部变量,可以用global命令将某些变量说明为全局变量。
函数文件的文件名一般应与函数说明语句中定义的函数名相一致。
函数文件可以递归调用。
三、M-文件的建立、编辑与调用
1.M-文件的建立与编辑
方法1:
在命令窗口输入命令:
edit[M-文件名],即可打开相应M-文件编辑器。
方法2:
单击菜单“File”->“New”->“M-file”,打开空白M-文件编辑器;
方法3:
单击菜单“File”->“Open”->输入文件名,打开相应M-文件编辑器;
方法4:
在当前目录窗口中选择某M-文件,双击则可打开该M-文件编辑器;
2.M-文件的调用
方法1:
在MATLAB命令窗口中直接键入M-文件名,然后回车;
方法2:
在当前目录窗口选择某M-文件,击右键选择命令RUN,即可运行该M-文件;
方法3:
在M-文件编辑窗口中,单击工具钮RUN或菜单Debug/RUN,即可运行该M-文件。
【注】
M被调用的M-文件必须位于当前目录或文件搜索路径范围内。
调用函数文件时,须事先对输入参量赋值,然后按照以下格式调用
输出参量=函数名(输入参量)(回车)
其中,实际参数和形式参数可以不同;输入参数要用小括号将其括起,输出参数多于一个时,要用中括号“[]”将其括起;参数间用逗号隔开。
四、MATLAB的控制流语句
MATLAB与其它计算机高级语言一样,有它自己的控制流语句,用户使用它们可以方便地编写出各种M-文件(应用程序)。
1.选择结构
(1)if语句
一般格式:
if<关系表达式1>
<语句体1>
elseif<关系表达式2>
<语句体2>
…
elseif<关系表达式n>
<语句体n>
else
<语句体n+1>
end
基本功能:
若表达式j(j=1,2,…,n)的值为真,则执行语句体j,然后执行end的后续命令;否则,则执行语句体n+1,然后执行end的后续命令。
【注】if语句结构中,关键字“else”和“elseif”所在语句行以及其后的语句体都不是必需的,但是关键字“end”不能省略。
例6.编写函数文件,计算分段函数
解:
编写函数文件(fenduan.m)如下:
functiony=fenduan(x)%计算分段函数
ifx<=0
>>x=-5:
0.1:
10;
>>n=length(x);
>>fork=1:
ny(k)=fenduan(x(k));end
>>plot(x,y)
y=0;
elseifx<=2*pi
y=sin(x);
else
y=x-2*pi;
end
(2)switch语句
一般格式:
switch<表达式>
case值1
<语句体1>
…
case值n
<语句体n>
otherwise
<语句体n+1>
end
基本功能:
首先计算表达式的值,若该值与值j(j=1,2,…,n)相等,则执行语句体j,然后执行end的后续命令;否则,则执行语句体n+1,然后执行end的后续命令。
例7.编写命令文件,从键盘输入某学生成绩(5分制),计算机判断并输出该生成绩的优良等级。
解:
编写命令文件(SY00507.m)如下:
x=input('请输入您的分数:
x=');
switchx
case5
disp('优秀!
');
case4
disp('良好!
');
case3>>SY00507%运行程序
disp('及格!
');请输入您的分数:
x=4
otherwise良好!
disp('不及格!
')
end
2.循环结构
(1)for语句
一般格式:
for循环变量=矩阵
{语句体}
end
基本功能:
循环循环变量依次取矩阵的每一列,然后执行一次语句体;遍历矩阵的各列后,然后执行end的后续命令。
【注】
for语句有简化格式:
for<循环参数>=<初值>:
<步长>:
<终值>
<语句体>
end
其中步长省略时,则默认步长为1.
for循环不能由循环体内给循环变量重新赋值来终止;
for循环可以按需要进行嵌套;
例8.编写函数文件,产生m×n阶Hilber矩阵。
解:
编写函数文件(hhilb.m)如下:
functionH=hhilb(m,n)%H的i,j处元素H(i,j)=1/(i+j-1)
>>h=hhilb(3,4)%调用函数
h=11/21/31/4
1/21/31/41/5
1/31/41/51/6
H=zeros(m,n);%预先分配数组
fori=1:
m
forj=1:
n
H(i,j)=1/(i+j-1);
end
end
formatrat,H=H;%取有理数表示。
例_8.编写函数令文件,计算并输出A的各行向量的元素和(hanghe.m)。
>>A=[1234;5678]
A=1234
5678
>>X=hanghe(A)
X=10
26
解:
functionX=hanghe(A)
[m,n]=size(A);%计算A维数
X=zeros(m,1);%零初始化
fory=A
X=X+y;
end
(2)while语句
一般格式:
while<关系表达式>
<语句体>
end
基本功能:
若关系表达式值为真
(1),则反复执行语句体,直至关系表达式值为假(0),则终止循环,转而执行end的后续命令。
【注】
若关系表达式计算对象为矩阵时,则只有当结果矩阵的所有元素均为真时,才执行循环体;否则(或结果矩阵为空矩阵时),不执行循环体。
用break命令可强行中止循环,转而执行该循环end的后续命令;用continue命令可中止循环中的当前迭代,转而执行该循环的下一次迭代。
for循环用于循环次数确定,而while循环用于循环次数事先不能确定。
例9.编写M-文件,计算eps的值。
解:
编写命令文件(eeps.m)如下:
(使用大写变量EPS,以便与常量eps相区别)
EPS=1;n=0;%赋初值,n用以累计循环次数
>>eeps%运行程序
n=53
EPS=2.2204e-016
while(1+EPS)>1%进行循环
EPS=EPS/2;%EPS的值减半
n=n+1;%n累计加1
end
EPS=EPS*2;%恢复EPS最小有效值
n%输出n
formatshorte%短格式科学记数法输出EPS的值
EPS
3.其它控制流语句
(1)try语句
一般格式:
try
<语句体1>
catch
<语句体2>
end
基本功能:
正常情况下只执行<语句体1>;当执行语<句体1>出现错误时,则将错误信息写入系统变量lasterr,并转向执行<语句体2>。
例10.计算两个矩阵积(SY00510.m)。
>>A=[123;456];B=[21;43];C=[21;43;02];
functionX=SY00510(A,B)>>X=SY00510(A,B)
try**错误乘法:
A*B**
X=A*B;ans=Errorusing==>*
catchInnermatrixdimensionsmustagree.
disp('**错误乘法:
A*B**')X=[]
lasterr>>X=SY00510(A,C)
X=[];X=1013
end2831
(2)人机交互命令
return结束return所在函数的执行,返回到主调函数或命令窗口。
input('提示信息')屏幕显示提示信息,等待用户由键盘输入数据;
input('提示信息','s')同上,等待用户由键盘输入字符串(不用带单引号)。
keyboard将程序交由键盘控制,键入return即可恢复程序控制。
pause/pause(n)暂停程序执行(n秒),按任意键继续;
练习.编写函数文件求任意两个矩阵的和,当其维数不一致时,进行必要的剪裁。
functionX=anysum(A,B)
try
X=A+B;
catch
k=min([size(A);size(B)]);
X=A(1:
k
(1),1:
k
(2))+B(1:
k
(1),1:
k
(2));
end
>>A=[1234;4321],B=[214;357;142]
A=1234B=214
4321357
142
>>X=anysum(A,B)
X=337
789
MATLAB练习
1.设有分块矩阵,,其中E,R,O,S分别为单位阵、随机阵、零阵和对
角阵,试通过数值计算验证。
解:
>>E=eye(3);O=zeros(2,3);
>>S=diag([12]);R=rand(3,2);
>>A=[E,R;O,S];
>>X=A^2;Y=[E,R+R*S;O,S*S];
>>X==Y
3.用作图法求x2=8lnx和4sinx-x-2=0的根的近似值。
解:
>>x=0.5:
0.1:
4;
>>y1=x.^2;y2=8*log(x);
>>plot(x,y1,x,y2),grid%1.2,2.9
>>x=-4:
0.1:
4;y=4*sin(x)-x-2;
>>n=length(x);y0=zeros(1,n);
>>plot(x,y1,x,y0),grid%-2.9,0.7,1.8
4.作曲面
的3维图形。
(-7.5
x
7.5,-7.5
y
7.5)
解:
运行以下命令:
x=-7.5:
0.5:
7.5;y=x;
[X,Y]=meshgrid(x,y);
Z=X.*X-Y.*Y;
mesh(X,Y,Z);
5.编写函数zuhe.m,求m中取n个的组合数。
解:
编写函数zuhe.m下:
functiony=zuhe(m,n)%m>=n
y=1;
fork=1:
n
y=y*(m-k+1)/k;
end
6.建立一个命令M-文件:
求所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身。
例如,153是一个水仙花数,因为153=13+53+33。
解:
编程如下:
shuixianhua.m
y=[];
forx=100:
999
a=fix(x/100);b=fix((x-a*100)/10);c=x-a*100-b*10;
ifx==(a^3+b^3+c^3)
disp(x);
end
end
%运行结果:
y=153370371407
7.编写函数M-文件ssqrt.m:
用迭代法求
的值。
求平方根的迭代公式为
,迭代的终止条件为前后两次求出的x的差的绝对值小于10-5。
解:
编写函数文件ssqrt.m:
functiony=ssqrt(a)
tol=10^(-6);
b=1;
x1=a;
whileb>=tol
x2=(x1+a/x1)/2;
b=abs(x2-x1);
x1=x2;
end
y=x2;C:
\work\wincode\data\188414330\MATLAB上机练习
(1).doc
8.初等行变换化矩阵为行简化阶梯型矩阵(函数)
functionA=mhjh(A)
[m,n]=size(A);
i=1;j=1;
while(i<=m)&(j<=n)
[p,k]=max(abs(A(i:
m,j)));
k=k+i-1;
if(p<=1e-6)%默认误差
A(i:
m,j)=zeros(m-i+1,1);
j=j+1;
else
A([ik],:
)=A([ki],:
);
A(i,:
)=A(i,:
)/A(i,j);
fork=[1:
i-1,i+1:
m]
A(k,:
)=A(k,:
)-A(k,j)*A(i,:
);
end
i=i+1;
j=j+1;
end
end
例1求解线性方程组
解对增广矩阵B=(A,b)进行初等行变换:
>>formatrat;
>>B=[11-3-11;3-1-344;15-9-80];
>>BB=mhjh(B)
运行结果:
BB=10-3/23/45/4
01-3/2-7/4-1/4
00000
即
故方程组有解,其一般解为
例2求解线性方程组
解对增广矩阵B=(A,b)进行初等行变换:
:
>>formatrat;
>>B=[1-23-11;3-15-32;212-23];
>>BB=mhjh(B)
BB=107/5-10
01-4/500
00001
R(A)=2,R(B)=3,故方程组无解.
-----------------------------------------------
functionA=mhjh(A)
[m,n]=size(A);
tol=max(m,n)*eps*norm(A,'inf');%计算默认误差
i=1;j=1;
while(i<=m)&(j<=n)
[p,k]=max(abs(A(i:
m,j)));k=k+i-1;
if(p<=tol)
A(i:
m,j)=zeros(m-i+1,1);%Thecolumnisnegligible,zeroitout.
j=j+1;
else
A([ik],j:
n)=A([ki],j:
n);
A(i,j:
n)=A(i,j:
n)/A(i,j);
fork=[1:
i-1i+1:
m]
A(k,j:
n)=A(k,j:
n)-A(k,j)*A(i,j:
n);
end
i=i+1;
j=j+1;
end
end