MATLAB程序设计.docx

上传人:b****5 文档编号:3867111 上传时间:2022-11-26 格式:DOCX 页数:18 大小:124.75KB
下载 相关 举报
MATLAB程序设计.docx_第1页
第1页 / 共18页
MATLAB程序设计.docx_第2页
第2页 / 共18页
MATLAB程序设计.docx_第3页
第3页 / 共18页
MATLAB程序设计.docx_第4页
第4页 / 共18页
MATLAB程序设计.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

MATLAB程序设计.docx

《MATLAB程序设计.docx》由会员分享,可在线阅读,更多相关《MATLAB程序设计.docx(18页珍藏版)》请在冰豆网上搜索。

MATLAB程序设计.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1