MATLAB应用第3章第2版 MATLAB程序设计.docx

上传人:b****1 文档编号:2605375 上传时间:2023-05-04 格式:DOCX 页数:30 大小:150.06KB
下载 相关 举报
MATLAB应用第3章第2版 MATLAB程序设计.docx_第1页
第1页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第2页
第2页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第3页
第3页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第4页
第4页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第5页
第5页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第6页
第6页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第7页
第7页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第8页
第8页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第9页
第9页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第10页
第10页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第11页
第11页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第12页
第12页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第13页
第13页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第14页
第14页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第15页
第15页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第16页
第16页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第17页
第17页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第18页
第18页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第19页
第19页 / 共30页
MATLAB应用第3章第2版 MATLAB程序设计.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

MATLAB应用第3章第2版 MATLAB程序设计.docx

《MATLAB应用第3章第2版 MATLAB程序设计.docx》由会员分享,可在线阅读,更多相关《MATLAB应用第3章第2版 MATLAB程序设计.docx(30页珍藏版)》请在冰点文库上搜索。

MATLAB应用第3章第2版 MATLAB程序设计.docx

MATLAB应用第3章第2版MATLAB程序设计

第3章MATLAB程序设计

在以前所介绍的各种运算中,命令或函数的输入都是在命令窗口下进行的,这是一种计算器输入方式,其命令的执行属于交互式的,即:

在命令窗口逐条输入命令,MATLAB就逐条解释执行。

这种命令输入方式操作简单、直观,但随着指令数的增加,或程序复杂程度的增加,这种命令输入方式就显得繁琐(因为输入过程也伴随执行过程)、而且执行程序不能保留,不能反复使用。

为了解决这些问题,必须将程序保存在一个文件中。

在MATLAB中,这种文件是以.m为扩展名的,称为m文件。

3.1m文件

m文件是文本文件,它可以用任何文本编辑器编辑,如用记事本、word等编辑。

但是通常用MATLAB提供的文本编辑器编辑。

启动MATLAB文本编辑器编辑的方法有3种

1.菜单操作:

“file”菜单“new”“M-file”

2.命令按钮操作:

点击MATLAB主窗口工具栏上的“newM-file”按钮

3.命令操作:

在MATLAB命令窗口输入命令:

edit

打开的编辑器后,输入程序后,可以以m为扩展名保存在某一个目录中。

matlab的.m文件保存的命名规则:

1.文件名命名要用英文字符,第一个字符不能是数字

2.文件名不要取为matlab的一个固有函数,m文件名的命名尽量不要是简单的英文单词,最好是由大小写英文/数字/下划线等组成。

原因是简单的单词命名容易与matlab内部函数名同名,结果会出现一些莫名其妙的错误。

3、文件存储路径一定为英文

4、m文件起名不能有空格,如threephase,应该写成three_phase或者ThreePhase

如果要打开已有的m文件,方法也有3种

1.菜单操作:

“file”菜单“open…”,这时出现“open”对话框。

在“文件类型”下拉栏中选“M-files(.m)”,再在某一个目录中选择所需要的m文件

2.命令按钮操作:

点击MATLAB主窗口工具栏上的“openfile”按钮

3.命令操作:

在MATLAB命令窗口输入命令:

edit文件名

m文件分为两种,一种是脚本文件(命令文件),另一种是函数文件。

一、脚本文件

脚本文件就是以前在命令窗口输入的诸多命令的简单迭加,但是在输入过程中,并不伴随执行,而是全部输入完后保存下来,什么时候想执行就什么时候执行,命令完全按编写顺序执行。

这就解决了在命令窗口运行多条命令的麻烦,同时也可以使保存的程序反复使用。

例1用图形表示连续调制波形

及其包络线。

clearworkspace和clearcommandwindow

在MATLAB文本编辑器编辑

t=(0:

pi/100:

pi)';%<1>

y1=sin(t)*[1,-1];%<2>

y2=sin(t).*sin(9*t);%<3>

figure,plot(t,y1,'r:

',t,y2,'b');%<5>

axis([0,pi,-1,1]);title('连续调制波形');legend('包络线1','包络线2','调制波')

“debug(调试)”菜单“saveandrun”生成test1.m脚本文件,并运行它

注意workspace中的变量变化

如果workspace中原来没有储存变量,这时,m脚本文件中有几个变量,workspace中就会生成几个变量

而且,这些变量可以被其它命令或函数调用

例2在命令窗口输入

figure,plot(t,y2,'b')

在本例中,在命令窗口中,并没有给t,y2赋值,它们的数据都取自运行test1.m脚本文件时在workspace中生成的变量

同样,在workspace中的变量也可以被m文件调用

例3MATLAB文本编辑器编辑

y1=sin(t)*[1,-1];%<2>

y2=sin(t).*sin(9*t);%<3>

figure,plot(t,y1,'r:

',t,y2,'b');%<5>

axis([0,pi,-1,1]);title('连续调制波形');legend('包络线1','包络线2','调制波')

点击“file”菜单“saveas…”,生成test2.m脚本文件

在这个文件中,没有给变量t赋值

clearworkspace和clearcommandwindow

在命令窗口输入

t=(0:

pi/100:

pi)';

这时在workspace中生成t变量

在MATLAB文本编辑器中,“debug(调试)”菜单“run”

在本例中,m脚本文件中的程序是借助workspace中的t变量运行

以上所介绍的变量,无论是在命令窗口中赋值的,还是在m脚本文件中赋值的,只要能储存在workspace中,都称为全局变量

例10建立命令文件,将华氏温度f转换为摄氏温度c。

首先建立命令文件并以文件名f2c.m存盘。

clear;%清除工作空间中的变量

f=input('InputFahrenheittemperature:

');

c=5*(f-32)/9

然后在MATLAB的命令窗口中输入f2c,将会执行该命令文件,执行情况为:

InputFahrenheittemperature:

73

c=

22.7778

说明:

当使用键盘输入数据时,可以使用input函数,常用的格式有两种:

v=input('message')将“message”后面键入的内容赋给变量v。

可以输入数值、字符串、元胞数组等各种形式的数据

v=input('message','s')将键入的内容s作为字符串赋给变量v。

即,不管输入什么,总是以字符串的形式赋给变量v

'message'是将显示在屏幕上的字符串,是必不可少的

二、函数文件

m函数文件是以function为第1行的文件

它的基本结构如下:

function[输出变量列表]=函数名(输入变量列表)

注释说明语句段,由%引导

函数语句体

说明:

1.在[输出变量列表]中,如果只有一个变量,方括号可以省略

2.在这种文件中,输入变量列表中所列出的变量并没有被赋值。

因此m函数文件本身不能像m脚本文件那样独立地运行。

它只能被其它文件或命令调用。

在调用过程中,必须在命令窗口或其它文件中将输入变量列表中所列出的变量赋值。

3.函数的调用格式为:

[输出变量列表]=函数文件名(输入变量列表)

例4用图形表示连续调制波形

及其包络线。

在MATLAB文本编辑器编辑

function[y1,y2]=test3(t,n)

y1=sin(n.*t)*[1,-1];%<2>

y2=sin(n.*t).*sin(9*t);%<3>

figure,plot(t,y1,'r:

',t,y2,'b');%<5>

axis([0,pi,-1,1]);title('连续调制波形');legend('包络线1','包络线2','调制波')

点击“file”菜单“saveas…”,生成test3.m函数文件

在这个文件中,输入变量列表中的变量t,n并没有被赋值

下面是对这个函数文件的调用

clearworkspace和clearcommandwindow

在命令窗口输入

t=(0:

pi/100:

pi)';n=1;%n=1时,与例1的情况相同

[y1,y2]=test3(t,n);

在这个例子中,如果给t和n赋不同的值,可以产生不同的结果

例5用图形表示连续调制波形

及其包络线。

clearworkspace和clearcommandwindow

在命令窗口输入

t=(0:

pi/100:

pi)';n=2;%n=1时,与例1的情况相同

[y1,y2]=test3(t,n);

在上两个例子中,在workspace都产生变量t、n、y1、y2,这和test3函数文件中的出现的变量及其数目是相同的。

但是,这仅仅是巧合。

例6用图形表示连续调制波形

及其包络线和零点。

在MATLAB文本编辑器编辑

function[y1,y2]=test4(t,n)

y1=sin(n.*t)*[1,-1];%<2>

y2=sin(n.*t).*sin(9*t);%<3>

t3=pi*(0:

9)/9;

y3=sin(t3).*sin(9*t3);

figure,plot(t,y1,t,y2,t3,y3,'mo');axis([0,pi,-1,1]);title('连续调制波形');legend('包络线1','包络线2','调制波','零点')

点击“file”菜单“saveas…”,生成test4.m函数文件

与test3.m函数文件相比,test4.m函数文件中多了t3和y3变量,而且它们并没有出现在文件的输入列表或输出列表中

clearworkspace和clearcommandwindow

在命令窗口输入下面的命令,注意观察workspace的变化

t=(0:

pi/100:

pi)';n=1;%n=1时,与例1的情况相同

[y1,y2]=test4(t,n);

可以看到,虽然test4.m函数文件中多了t3和y3变量,但是在workspace并没有显示出来。

在workspace显示的是变量t、n、y1、y2。

实际上,变量t、n、y1、y2显示在workspace也是一种巧合。

例7用图形表示连续调制波形

及其包络线和零点。

clearworkspace和clearcommandwindow

在命令窗口输入下面的命令,注意观察workspace的变化

s=(0:

pi/100:

pi)';m=1;

[z1,z2]=test4(s,m);

这时,在workspace,根本看不到函数文件定义的变量。

以前之所以在workspace能看到函数文件定义的变量,那是因为在命令窗口输入的变量碰巧和函数文件定义的变量一致。

从上面的分析看到,m函数文件的变量与m脚本文件的变量不同,并不存在于workspace。

实际上,每当函数文件运行时,MATLAB专门为函数文件开辟一个临时工作区间(contextworkspace)。

该空间称为函数工作区间(functionworkspace)。

所有中间变量都存放在函数工作区间中,当MATLAB执行完函数文件的最后一条指令后,或遇到return命令时,就结束该函数文件的运行,同时该临时函数空间及其所有的中间变量立即被清除。

这些存在于函数空间的中间变量称为局部变量。

它产生于该函数的运行过程中,其影响范围仅限于该函数本身。

注意,在函数文件中也可以产生全局变量。

这时需要通过global指令预先定义。

由于全局变量会损害函数的封闭性,因此不提倡在函数文件中使用全局变量。

3.m函数文件的名称可以与函数名不同。

例8将test3.m另存为test5.m,并将它的函数名改为“sin”

clearworkspace和clearcommandwindow

在命令窗口输入

t=(0:

pi/100:

pi)';n=1;%n=1时,与例1的情况相同

[y1,y2]=test5(t,n);

为了避免混乱,函数文件名应该与函数名一致

注意,函数文件名不能和MATLAB中已定义的函数同名

例9将test3.m另存为sin.m

clearworkspace和clearcommandwindow

在命令窗口输入下面的命令

t=(0:

pi/100:

pi)';n=1;%n=1时,与例1的情况相同

[y1,y2]=sin(t,n);

3.2程序控制结构

组成计算机程序的一系列指令语句可以分成两类:

运算语句和控制顺序语句。

MATLAB编程的主要任务是安排调整好控制顺序语句,使运算语句的运行顺序合理,运算简捷.节省机时。

常用的控制顺序语句有三种:

顺序结构、循环结构和分支结构.

顺序结构语句就是从前到后,依照指令排列的自然顺序逐条执行;

循环和分支结构语句则不全按指令语句的自然排序执行,中途可以利用控制顺序语句改变执行次序.

一、顺序结构

1.数据的输入

从键盘输入数据,则可以使用input函数来进行,该函数的调用格式为:

A=input(提示信息,选项);

其中提示信息为一个字符串,用于提示用户输入什么样的数据。

如果在input函数调用时采用's'选项,则允许用户输入一个字符串。

例如,想输入一个人的姓名,可采用命令:

xm=input('What''syourname?

','s')

What'syourname?

name

xm=

name

2.数据的输出

MATLAB提供的命令窗口输出函数主要有disp函数,其调用格式为

disp(输出项)

其中输出项既可以为字符串,也可以为矩阵。

例如:

a=‘helloeveryone!

’;

disp(a)

执行结果:

helloeveryone!

注意:

用disp函数显示矩阵时将不显示矩阵的名字,而且其格式更紧密,且不留任何没有意义的空行。

 

例1输入x,y的值,并将它们的值互换后输出。

程序如下:

x=input('Inputxplease.');

y=input('Inputyplease.');

z=x;

x=y;

y=z;

disp(x);

disp(y);

例2求一元二次方程ax2+bx+c=0的根。

程序如下:

a=input('a=?

');

b=input('b=?

');

c=input('c=?

');

d=b*b-4*a*c;

x=[(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a)];

disp(['x1=',num2str(x

(1)),'x2=',num2str(x

(2))]);

执行结果:

a=?

6

b=?

12

c=?

21

x1=-1+1.5811i,x2=-1-1.5811i

str=num2str(A)convertsarrayAintoastringrepresentationstr.Convertedfloating-pointvalueshaveamaximumoffourdigitsofprecision,andanexponentifrequired.Forintegervalues,num2strreturnstheexactstringrepresentationofthevalue.

二、循环结构语句

在实际问题中经常会遇到许多有规律的重复计算,如某些程序中需要反复执行某些语句。

这就需要调用循环语句进行控制。

在MATLAB中提供两种循环方式:

for循环和while循环。

次数循环语句for-end:

fori=V

循环结构体

end

其中,i为循环变量,V为一个向量,循环变量i每次从向量V中取一个值,执行一次循环体的内容,如此下去,直到执行完向量V中所有的元素,最后将自动结束循环体的执行。

for循环的特点是,它的循环判断通常是对循环次数的判断。

在一般情况下,循环次数是预先设定好的。

例1用for循环语句求解

s=0;%定义变量s并赋初值

fori=1:

100%在循环体内,i不影响它在循环体外的预定义变量的作用

s=s+i;%分号应该加上,否则会显示大量中间结果

end

s

例2用for循环语句创建一个范得蒙矩阵

clear

a=input('输入范得蒙矩阵的基本向量a=');

n=length(a);

fork=0:

n-1%规定执行语句组的次数

D(k+1,:

)=a.^k;%给矩阵D的第(k+1)行赋值

end,D

给文件起名“li2”(可随意),并存盘

在指令窗中键入li2,回车则屏幕显示:

输入范得蒙矩阵的基本向量a=

键盘输入:

[4523]

for语句更一般的格式:

for循环变量=矩阵表达式

循环体语句

end

执行过程是依次将矩阵的各列元素赋给循环变量,然后执行循环体语句,直至各列元素处理完毕。

已知5个学生4门功课的成绩,求每名学生的总成绩。

程序如下:

s=0;

a=[65,76,56,78;98,83,74,85;0,0,0,0;98,58,42,73;67,...

89,76,87];

fork=a

s=s+k;

end

disp(s');

执行结果:

2753400271319

条件循环语句while–end

while(条件式)

循环结构体

end

其中,条件式是一个逻辑表达式,若其值为真(非0),则将自动执行循环体内容,执行后再判断条件式的真伪,为真则继续执行循环体内容,否则退出循环体结构。

由于while语句具有判断控制功能,不是简单的定数循环,因此比for循环语句更灵活些,适用范围也就更广些。

例3用while循环语句求解

s=0;i=1;%定义变量s和i并赋初值

while(i<=100)%i<=100时在循环体内,否则退出循环体

s=s+i;i=i+1;%i作为计数用

end

s

事实上,前面的求和可以用MATLAB提供的sum()函数对整个向量1:

100进行直接操作来实现:

sum(1:

100)

这样做程序更简单了。

这是向量化方式求和。

例4求满足

的最小m值

这个问题用for循环不便求解,应该用while循环

s=0;m=0;%定义变量s和m并赋初值

while(s<=10000)%s<=10000时在循环体内,否则退出循环体

m=m+1;s=s+m;

end

[s,m]

例5用循环语句和向量化方式求解级数求和问题

可以用tic(启动计时器),toc(关闭计时器)命令侧出两种方法计算所需要的时间:

tic,

s=0;

fori=1:

100000,

s=s+1/2^i+1/3^i;

end;

s

toc

tic,

i=1:

100000;

s=sum(1./2.^i+1./3.^i)

toc

对这个问题来说,向量化所需的时间约相当于循环结构的40%,故用向量化的方法可以节省时间

二、分支结构(条件转移)语句

在复杂的计算中,常常需要根据表达式是否满足条件来确定下一步该做什么。

MATLAB提供了if语句来进行判断选择

单条件分支语句if-end

if条件

语句组

end

当条件成立时,执行语句组。

执行完后继续执行后续语句。

若条件不成立,直接执行后续语句。

例6每个苹果价格是25,购买量超过5个时,给与20%的折扣。

问买10个苹果需要多少钱?

apples=10;%苹果的数目

cost=apples*25;%不打折扣时购买苹果的费用

ifapples>5

cost=(1-20/100)*cost;%购买量超过5个时,给与20%的折扣

end

cost

双条件分支语句if–else-end

if条件

语句组1

else

语句组2

end

当条件成立时,执行语句组1,否则执行语句组2。

语句组1或语句组2执行后,再执行后续语句。

例7计算分段函数:

x=input('请输入x的值:

');

ifx==10

y=cos(x+1)+sqrt(x*x+1);

else

y=x*sqrt(x+sqrt(x));

end

y

例8编程执行下述任务:

输入一个数n,若使函数

,就显示“y>100";否则显示“y<100”。

解:

clear,n=input('n=')

ifn^2-n^3*sin(n)<=100

'y<=100'

else

'y>100'

end

递阶选择多分支语句if–elseif–else-end

if条件1

语句组1

elseif条件2

语句组2

……

elseif条件m

语句组m

else

语句组n

end

例9由键盘输入任一自变量时,判断函数

y是负数、偶数,还是其他。

解:

先判断函数y的正负,再判断其奇偶性

clear,x=input('输入自变量x=')%由键盘输入自变量x

ifx^4-19*x^3+32<0%判断函数y是否为负数

a='negatixe'

elseifrem(x^4-19*x^3+32,2)==0%判断y是否为偶数

a='even'

else

a='other'

end

(求余数函数rem(x,y):

y不等于0时,rem(x,y)=x-y*fix(x/y);y=0时,rem(x,y)=NaN)

循环和分支语句可以互相嵌套,形成更为复杂结构的程序语句。

例10鸡兔同笼,共有36个头、100只脚,问鸡兔各有多少?

解:

鸡有两只脚,兔有四只脚。

若设鸡兔共有P个头、q只脚,又设有n只鸡,则(q-2n)应该能被4整除,其商数即为兔的只数。

clear,p=input('总头数p=');q=input('总脚数q=');

n=1;%设鸡起码有1只,可以多设

while1%while后的逻辑值为l时将无限循环下去

ifrem(q-n*2,4)==0&(n+(q-2*n)/4)==p

break%遇此指令则跳出包含它的最小循环语句

end

n=n+1;

end,

disp('鸡的只数'),n,disp('兔的只数'),p-n

指令窗中调用该文件时输入p=36,q=100,则得出鸡数和兔子数。

3.break语句和continue语句

与循环结构相关的语句还有break语句和continue语句。

它们一般与if语句配合使用。

break语句用于终止循环的执行。

当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句的下一语句。

continue语句控制跳过循环体中的某些语句。

当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。

例3-12求[100,200]之间第一个能被21整除的整数。

程序如下:

forn=100:

200

ifrem(n,21)~=0

continue

end

break

end

n

多路选择分支语句switch-case-otherwise–end

有些运算是根据满足的条件来选择运算步骤(用语句组实现)的,多路选择分支语句就满足了这种需求。

switch数值或字符串表达式

case数值或字符串1

语句组A1

case数值或字符串2

语句组A2

……

case数值或字符串m

语句组Am

otherwise

语句组An

end

说明:

switch语句将根据开关表达式的取值不同,分别执行不同的语句。

当开关表达式输出的数值(或字符串)与某个case后的数值i(或字符串)一致时,就执行该case后的语句组Ai;若它跟任意case后的数值i(或字符串)都不一致,就执行最后一个语句组An。

“多路选择分支语句

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

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2