第五章MATLAB程序设计Word文档下载推荐.docx
- 文档编号:18669177
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:18
- 大小:23.08KB
第五章MATLAB程序设计Word文档下载推荐.docx
《第五章MATLAB程序设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第五章MATLAB程序设计Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
编辑器用颜色区分程序内容的类别,分别为:
绿色—注解部分,程序并不不执行,用%开头。
黑色—程序主体部分。
红色—属性值的设定。
蓝色—控制流程,比如for,if…then等语句。
2、程序运算符
(1)数学运算符
+,-,.*,./,'
,.^,:
(2)关系运算符
,<
=,>
=,==,~=
(3)逻辑运算符
&
,|,~
以上所介绍的仅仅是部分重要并且常用的运算符,详细内容可使用helpmatlab\ops查看。
第二节程序控制结构
一、顺序结构
1、数据的输入
从键盘输入数据,则可以使用input函数来进行,该函数的调用格式为:
A=input(提示信息,选项);
其中提示信息为一个字符串,用于提示用户输入什么样的数据。
如果在input函数调用时采用'
s'
选项,则允许用户输入一个字符串。
例如,想输入一个人的姓名,可采用命令:
xm=input('
What'
syourname?
'
2、数据的输出
MATLAB提供的命令窗口输出函数主要有disp函数,其调用格式为
disp(输出项)
其中输出项既可以为字符串,也可以为矩阵。
①输入x,y的值,并将它们的值互换后输出(exam5_2.m)。
x=input('
Inputxplease.'
y=input('
Inputyplease.'
z=x;
x=y;
y=z;
disp(x);
disp(y);
②求一元二次方程ax2+bx+c=0的根(exam5_3.m)。
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))]);
3、程序的暂停
暂停程序的执行可以使用pause函数,其调用格式为:
pause(延迟秒数)
如果省略延迟时间,直接使用pause,则将暂停程序,直到用户按任一键后程序继续执行。
若要强行中止程序的运行可使用Ctrl+C命令。
二、选择结构
1、if语句
在MATLAB中,if语句有3种格式。
(1)单分支if语句:
if条件
语句组
end
当条件成立时,则执行语句组,执行完之后继续执行if语句的后继语句,若条件不成立,则直接执行if语句的后继语句。
(2)双分支if语句:
语句组1
else
语句组2
当条件成立时,执行语句组1,否则执行语句组2,语句组1或语句组2执行后,再执行if语句的后继语句。
计算分段函数的值(exam5_4.m)。
请输入x的值:
ifx<
=0
y=(x+sqrt(pi))/exp
(2);
else
y=log(x+sqrt(1+x*x))/2;
y
(3)多分支if语句:
if条件1
elseif条件2
语句组2
……
elseif条件m
语句组m
语句组n
语句用于实现多分支选择结构。
输入一个字符,若为大写字母,则输出其对应的小写字母;
若为小写字母,则输出其对应的大写字母;
若为数字字符则输出其对应的数值,若为其他字符则原样输出(exam5_5.m)。
请输入一个字符'
ifc>
='
A'
&
c<
Z'
disp(setstr(abs(c)+abs('
a'
)-abs('
)));
elseifc>
z'
disp(setstr(abs(c)-abs('
)+abs('
0'
9'
disp(abs(c)-abs('
));
disp(c);
2、switch语句
switch语句根据表达式的取值不同,分别执行不同的语句,其语句格式为:
switch表达式
case表达式1
语句组1
case表达式2
……
case表达式m
otherwise
当表达式的值等于表达式1的值时,执行语句组1,当表达式的值等于表达式2的值时,执行语句组2,…,当表达式的值等于表达式m的值时,执行语句组m,当表达式的值不等于case所列的表达式的值时,执行语句组n。
当任意一个分支的语句执行完后,直接执行switch语句的下一句。
某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用price来表示):
price<
200
没有折扣
200≤price<
500
3%折扣
500≤price<
1000
5%折扣
1000≤price<
2500
8%折扣
2500≤price<
5000
10%折扣
5000≤price
14%折扣
输入所售商品的价格,求其实际销售价格(exam5_6.m)。
price=input('
请输入商品价格'
switchfix(price/100)
case{0,1}
%价格小于200
rate=0;
case{2,3,4}
%价格大于等于200但小于500
rate=3/100;
casenum2cell(5:
9)
%价格大于等于500但小于1000
rate=5/100;
casenum2cell(10:
24)
%价格大于等于1000但小于2500
rate=8/100;
casenum2cell(25:
49)
%价格大于等于2500但小于5000
rate=10/100;
otherwise
%价格大于等于5000
rate=14/100;
price=price*(1-rate)
%输出商品实际销售价格
3、try语句
语句格式为:
try
catch
try语句先试探性执行语句组1,如果语句组1在执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并转去执行语句组2。
矩阵乘法运算要求两矩阵的维数相容,否则会出错。
先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘(exam5_7.m)。
A=[1,2,3;
4,5,6];
B=[7,8,9;
10,11,12];
C=A*B;
C=A.*B;
C
lasterr
%显示出错原因
三、循环结构
1、for语句
for语句的格式为:
for循环变量=表达式1:
表达式2:
表达式3
循环体语句
end
其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。
步长为1时,表达式2可以省略。
一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。
输出全部水仙花数(exam5_8.m)。
form=100:
999
m1=fix(m/100);
%求m的百位数字
m2=rem(fix(m/10),10);
%求m的十位数字
m3=rem(m,10);
%求m的个位数字
ifm==m1*m1*m1+m2*m2*m2+m3*m3*m3
disp(m)
2、while语句
while语句的一般格式为:
while(条件)
循环体语句
其执行过程为:
若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环。
从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和(exam5_9.m)。
sum=0;
cnt=0;
val=input('
Enteranumber(endin0):
while(val~=0)
sum=sum+val;
cnt=cnt+1;
val=input('
if(cnt>
0)
sum
mean=sum/cnt
3、break语句和continue语句
与循环结构相关的语句还有break语句和continue语句。
它们一般与if语句配合使用。
break语句用于终止循环的执行。
当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句的下一语句。
continue语句控制跳过循环体中的某些语句。
当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。
求[100,200]之间第一个能被21整除的整数(exam5_10.m)。
forn=100:
200
ifrem(n,21)~=0
continue
break
n
4、循环的嵌套
如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。
若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。
求[1,500]之间的全部完数(exam5_11.m)。
form=1:
500
s=0;
fork=1:
m/2
ifrem(m,k)==0
s=s+k;
ifm==s
disp(m);
第三节函数文件
一、函数文件的基本结构
函数文件由function语句引导,其基本结构为:
function输出形参表=函数名(输入形参表)
注释说明部分
函数体语句
其中以function开头的一行为引导行,表示该M文件是一个函数文件。
函数名的命名规则与变量名相同。
输入形参为函数的输入参数,输出形参为函数的输出参数。
当输出形参多于一个时,则应该用方括号括起来。
编写函数文件求半径为r的圆的面积和周长(exam5_12.m)。
函数文件如下:
function[s,p]=exam5_12(r)
%CIRCLEcalculatetheareaandperimeterofacircleofradiir
%r—圆半径
%s—圆面积
%p—圆周长
%2007年7月30日编
s=pi*r*r;
p=2*pi*r;
二、函数调用
函数调用的一般格式是:
[输出实参表]=函数名(输入实参表)
要注意的是,函数调用时各实参出现的顺序、个数,应与函数定义时形参的顺序、个数一致,否则会出错。
函数调用时,先将实参传递给相应的形参,从而实现参数传递,然后再执行函数的功能。
利用函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换(exam5_13.m)。
函数文件tran.m:
function[rho,theta]=tran(x,y)
rho=sqrt(x*x+y*y);
theta=atan(y/x);
调用tran.m的命令文件exam5_13.m:
Pleaseinputx=:
Pleaseinputy=:
[rho,the]=tran(x,y);
rho
the
在MATLAB中,函数可以嵌套调用,即一个函数可以调用别的函数,甚至调用它自身。
一个函数调用它自身称为函数的递归调用。
利用函数的递归调用,求n!
(exam5_14.m)。
n!
本身就是以递归的形式定义的:
显然,求n!
需要求(n-1)!
,这时可采用递归调用。
递归调用函数文件exam5_14.m如下:
functionf=exam5_14(n)
ifn<
=1
f=1;
f=exam5_14(n-1)*n;
%递归调用求(n-1)!
三、函数参数的可调性
在调用函数时,MATLAB用两个永久变量nargin和nargout分别记录调用该函数时的输入实参和输出实参的个数。
只要在函数文件中包含这两个变量,就可以准确地知道该函数文件被调用时的输入输出参数个数,从而决定函数如何进行处理。
nargin用法示例(exam5_15.m)。
函数文件examp.m:
functionfout=charray(a,b,c)
ifnargin==1
fout=a;
elseifnargin==2
fout=a+b;
elseifnargin==3
fout=(a*b*c)/2;
命令文件exam5_15.m:
x=[1:
3];
y=[1;
2;
examp(x)
examp(x,y'
)
examp(x,y,3)
四、全局变量与局部变量
全局变量用global命令定义,格式为:
global变量名
全局变量应用示例(exam5_16.m)。
先建立函数文件wadd.m,该函数将输入的参数加权相加。
functionf=wadd(x,y)
globalALPHABETA
f=ALPHA*x+BETA*y;
在命令窗口中执行exam5_16.m文件。
ALPHA=1;
BETA=2;
s=wadd(1,2)
第四节程序调试及常用指令
一、程序调试
1、程序调试概述
一般来说,应用程序的错误有两类,一类是语法错误,另一类是运行时的错误。
语法错误包括词法或文法的错误,例如函数名的拼写错、表达式书写错等。
程序运行时的错误是指程序的运行结果有错误,这类错误也称为程序逻辑错误。
2、调试器
(1)Debug菜单项
该菜单项用于程序调试,需要与Breakpoints菜单项配合使用。
(2)Breakpoints菜单项
该菜单项共有6个菜单命令,前两个是用于在程序中设置和清除断点的,后4个是设置停止条件的,用于临时停止M文件的执行,并给用户一个检查局部变量的机会,相当于在M文件指定的行号前加入了一个keyboard命令。
二、常用指令
1、return指令
通常,当被调函数挂执行完后,MATLAB会自动地把控制转至主调函数或者指令窗。
如果在被调函数中插入了return指令,可以强制MATLAB结束执行该函数并把控制转出。
2、keyboard指令
当程序遇到keyboard时,MATLAB将“控制权”交给键盘,用户可以从键盘输入各种合法的MATLAB指令,只有当用户使用return指令结束输入后,“控制权”才交还给程序。
3、P码文件
一个M文件首次被调用(运行文件名,或被M文本编辑器打开)时,MATLAB将首先对该M文件进行语法分析,并把生成的相应内部代码(Psedocode,简称P码)文件存放在内存中。
此后,当再次调用该M文件时,将直接调用该文件在内存中的P码文件,而不会对原码文件重新进行语法分析。
P码文件有与原码文件相同的文件名,但其扩展名是“.P”。
本质上说P码文件运行速度高于原码文件。
在MATLAB中,假如存在同名的P码文件和原码文件,那么当该文件名被调用时,被执行的肯定是P码文件。
P码文件可用以下命令生成。
pcodeFunName
P码文件是二进制码,难于阅读,程序保密性好。
4、串演算函数
(1)eval
利用字符串建立运算式后,再用eval命令执行它,可以使程序设计更加灵活。
但是注意表达式一定要是字符串。
其命令格式为:
eval('
字符串'
先定义字符串t为平方根运算,再用eval求出1到10的平方根,以后只要修改t的表达式即可(exam5_17.m)。
clear
t='
sqrt(i)'
;
fori=1:
10
f(i)={char(['
Thesquarerootof'
int2str
(1),'
is'
num2str(eval(t))])};
f(:
①计算“表达式”串,产生向量值。
clear,t=pi;
cem='
[t/2,t*2,sin(t)]'
y=eval(cem)
y=
1.5708
6.2832
0.0000
②计算“语句”串,创建变量。
theta=t/2,y=sin(theta)'
who
theta=
1.5708
1
Yourvariablesare:
t
thetay
(2)feval
指令feval的格式为:
feval('
字串'
,数组)
与eval不同之处在于feval用于模拟功能函数如cos,sin,sqrt等,而不像eval那样模拟运算式,所以con(pi)的值同样可以用feval(cos,pi)求出。
(exam5_18.m)
sqrt'
num2str(feval(t,i))])};
①feval和eval运行区别之一:
feval的FN绝对不能是表达式。
x=pi/4;
Ve=eval('
1+sin(x)'
)
Ve=
1.7071
Vf=feval('
x)
?
Errorusing==>
feval
Invalidfunctionname'
.
②feval和eval调用区别:
feval的FN只接受函数名。
本例两种方法以后者为好(exam5_19.m)。
randn('
seed'
1);
A=rand(2,2);
[ue,de,ve]=eval('
svd(A)'
disp('
Resultsbyeval'
disp([ue,de,ve]);
disp(blanks
(1))
[uf,df,vf]=feval('
svd'
A);
Resultsbyfeval'
disp([uf,df,vf])
Resultsbyeval
-0.9193
-0.3936
1.2212
0
-0.7897
-0.6135
-0.3936
0.9193
0.2633
-0.6135
0.7897
Resultsbyfeval
0.7897
5、内联函数创建和应用示例
(1)内联函数的第一种创建格式;
使内联函数适于“数组运算”。
clear,F1=inline('
sin(rho)/rho'
F1=
Inlinefunction:
F1(rho)=sin(rho)/rho
f1=F1
(2)
f1=
0.4546
FF1=vectorize(F1)
FF1=
FF1(rho)=sin(rho)./rho
xx=[0.5,1,1.5,2];
ff1=FF1(xx)
ff1=
0.9589
0.8415
0.6650
0.4546
(2)第一种内联函数创建格式的缺陷;
含向量的多宗量输入的赋值。
G1=inline('
a*exp(x
(1))*cos(x
(2))'
),G1(2,[-1,pi/3])
G1=
G1(a)=a*exp(x
(1))*cos(x
(2))
inline/subsref
Toomanyinputstoinlinefunction.
G2=inline('
x'
),G2(2,[-1,pi/3])
G2=
G2(a,x)=a*exp(x
(1))*cos(x
(2))
0.3679
(3)产生向量输入、向量输出的内联函数;
这种向量函数的调用方法
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 MATLAB 程序设计