参考atLab3程序设计.docx
《参考atLab3程序设计.docx》由会员分享,可在线阅读,更多相关《参考atLab3程序设计.docx(19页珍藏版)》请在冰豆网上搜索。
参考atLab3程序设计
MatLab&数学建模
第三讲MatLab程序设计
一、M文件
我们前面所介绍在MATLAB所做的运算,是适合于所要计算的算式不太长或是想以交谈式方式做运算,如果要计算的算式很长有数十行或是须要一再执行的算式,则那样的方式就行不通了。
MATLAB提供了所谓的M-file的方式,可让使用者自行将指令及算式写成巨集程式然后储存成一个特别的文档,其扩展名是m,譬如picture.m,其中的picture就是文件名称。
(1)编写M脚本文件的步骤
●点击MATLAB指令窗工具条上的NewFile图标
,就可打开如图所示的MATLAB文件编辑调试器。
用户即可在空白窗口中编写程序。
输入如下一段程序(picture.m)
x=linspace(0,2*pi,20);
y=sin(x);
plot(x,y,'r+')
title('2Dplot')
点击编辑调试器工具条图标
,在弹出的Windows标准风格的“保存为”对话框中,选择保存文件夹,键入新编文件名(如picture),点击【保存】键,就完成了文件保存。
(2)运行文件
●使picture.m所在目录成为当前目录(系统默认路径),或让该目录处在MATLAB的搜索路径上.
●然后在指令窗口运行以下指令,便可得到图形。
picture
再来看另一个M-file:
area.m的例子
%新建M-file,area.m
%计算一个球的体积
r=input('Typeradius输入半径:
');
Area=pi*r^2;
volume=(4/3)*pi*r^3;
fprintf('半径Theradiusis%12.5f\n',r)
fprintf('面积Theareaofacircleis%12.5f\n',Area)
fprintf('体积Thevolumeofasphereis%12.5f\n',volume)
在指令窗口运行指令area
二、M文件函数
一个函数M文件与脚本文件类似之处在于它们都是一个有.m扩展名的文本文件。
如同脚本M文件一样,函数M文件不进入命令窗口,而是由文本编辑器所创建的外部文本文件。
一个函数的M文件与脚本文件在通信方面是不同的。
函数与MATLAB工作空间之间的通信,只通过传递给它的变量和通过它所创建的输出变量。
在函数内中间变量不出现在MATLAB工作空间,或与MATLAB工作空间不交互。
一个函数的M文件的第一行把M文件定义为一个函数,并指定它的名字。
它与文件名相同,但没有.m扩展名。
它也定义了它的输入和输出变量。
M文件函数之间可以互相调用.
M文件函数必须遵循以下特定的规则。
1.函数名和文件名必须相同。
例如,函数fliplr存储在名为fliplr.m文件中。
2.MATLAB头一次执行一个M文件函数时,它打开相应的文本文件并将命令编辑成存储器的内部表示,以加速执行以后所有的调用。
如果函数包含了对其它M文件函数的引用,它们也同样被编译到存储器。
普通的脚本M文件不被编译,即使它们是从函数M文件内调用;打开脚本M文件,调用一次就逐行进行注释。
3.在函数M文件中,到第一个非注释行为止的注释行是帮助文本。
当需要帮助时,返回该文本。
例如,»helpfliplr返回上述前八行注释。
4.第一行帮助行,名为H1行,是由lookfor命令搜索的行。
5.函数可以有零个或更多个输入参量。
函数可以有零个或更多个输出参量。
6.函数可以按少于函数M文件中所规定的输入和输出变量进行调用,但不能用多于函数M文件中所规定的输入和输出变量数目。
如果输入和输出变量数目多于函数M文件中function语句一开始所规定的数目,则调用时自动返回一个错误。
7.当函数有一个以上输出变量时,输出变量包含在括号内。
例如,[V,D]=eig(A)。
不要把这个句法与等号右边的[V,D]相混淆。
右边的[V,D]是由数组V和D所组成。
8.当调用一个函数时,所用的输入和输出的参量的数目,在函数内是规定好的。
函数工作空间变量nargin包含输入参量个数;函数工作空间变量nargout包含输出参量个数。
事实上,这些变量常用来设置缺省输入变量,并决定用户所希望的输出变量。
例:
计算f
(1)f
(2)+f2(3)
首先建立一个M函数:
fun1.m
functionY=fun1(x)
Y=(x^3-2*x^2+x-6.3)/(x^2+0.05*x-3.14);
在指令窗口运行以下指令:
fun1
(1)*fun1
(2)+fun1(3)*fun1(3)
ans=
-12.6023
例:
计算阶乘函数fact.m
functionoutput=fact(n)
ifn==1
output=1;
return;
end
output=n*fact(n-1);
return:
通常情况下,当被调函数执行完后,MATLAB会自动地把控制转至主调函数或者指定窗口。
如果在被调函数中插入return命令后,可以强制matlab结束执行该函数并把控制转出。
Return命令可使正在运行的函数正常退出,返回调用它的函数继续运行,经常用于函数的末尾用来正常结束函数的运行。
【例】M函数文件示例。
[circle.m]
functionsa=circle(r,s)
%CIRCLEplotacircleofradiirinthelinespecifiedbys.
%r指定半径的数值
%s指定线色的字符串
%sa圆面积
%
%circle(r)利用蓝实线画半径为r的圆周线.
%circle(r,s)利用串s指定的线色画半径为r的圆周线.
%sa=circle(r)计算圆面积,并画半径为r的蓝色圆面.
%sa=circle(r,s)计算圆面积,并画半径为r的s色圆面.
ifnargin>2
error('输入宗量太多。
');
end;
ifnargin==1
s='b';
end;
clf;
t=0:
pi/100:
2*pi;
x=r*exp(i*t);
ifnargout==0
plot(x,s);
else
sa=pi*r*r;
fill(real(x),imag(x),s)
end
axis('square')
三MATLAB控制流
for循环结构
For循环允许一组命令以固定的和预定的次数重复。
For循环的一般形式是:
forx=array
{commands}
end
在for和end语句之间的{commands}按数组中的每一列执行一次。
【例】forn=1:
10
x(n)=sin(n*pi/10);
end
»x
x=
Columns1through7
0.30900.58780.80900.95111.00000.95110.8090
Columns8through10
0.58780.30900.0000
For循环可按需要嵌套。
n=0:
1:
10;
fori=1:
11
forj=1:
11
y(i)=sin(n(i));
n(j)=n(j)*10;
end
end
y=
Columns1through7
0-0.50640.9300-0.8027-0.1425-0.9765-0.5118
Columns8through11
0.8586-0.99570.99170.9287
n=
1.0e+012*
Columns1through7
00.10000.20000.30000.40000.50000.6000
Columns8through11
0.70000.80000.90001.0000
可以利用break命令跳出for循环
【例】一个简单的for循环示例。
fori=1:
10;%i依次取1,2,…10,.
x(i)=i;%对每个i值,重复执行由该指令构成的循环体,
end;
x%要求显示运行后数组x的值。
x=
12345678910
while循环结构
与For循环以固定次数求一组命令的值相反,While循环以不定的次数求一组语句的值。
While循环的一般形式是:
whileexpression
{commands}
end
只要在表达式里的所有元素为真,就执行while和end语句之间的{commands}。
【例】num=0;EPS=1;
while(1+EPS)>1
EPS=EPS/2;
num=num+1;
end
»num
num=
53
»EPS=2*EPS
EPS=
2.2204e-016
【例】
x=zeros(1,6);%x是一个的零矩阵
i=1;
whilei<=6,
x(i)=1/i;
i=i+1;
end
»x
x=
1.00000.50000.33330.25000.20000.1667
可以利用break命令跳出while循环
while循环可按需要嵌套。
【例】Fibonacci数组的元素满足Fibonacci规则:
,
;且
。
现要求该数组中第一个大于10000的元素。
a
(1)=1;a
(2)=1;i=2;
whilea(i)<=10000
a(i+1)=a(i-1)+a(i);%当现有的元素仍小于10000时,求解下一个元素。
i=i+1;
end;
i,a(i),
i=
21
ans=
10946
if-else-end分支结构
很多情况下,命令的序列必须根据关系的检验有条件地执行。
在编程语言里,这种逻辑由某种If-Else-End结构来提供。
最简单的If-Else-End结构是:
ifexpression
{commands}
end
如果在表达式中的所有元素为真(非零),那么就执行if和end语言之间的{commands}【例】»apples=10;
»cost=apples*25
cost=
250
»ifapples>5
cost=(1-20/100)*cost;
end
»cost
cost=
200
假如有两个选择,If-Else-End结构是:
ifexpression
commandsevaluatedifTrue
else
commandsevaluatedifFalse
end
在这里,如果表达式为真,则执行第一组命令;如果表达式是假,则执行第二组命令。
当有三个或更多的选择时,If-Else-End结构采用形式
ifexpression1
commandsevaluatedifexpression1isTrue
elseifexpression2
commandsevaluatedifexpression2isTrue
elseifexpression3
commandsevaluatedifexpression3isTrue
elseifexpression4
commandsevaluatedifexpression4isTrue
elseif……
.
.
.
else
commandsevaluatedifnootherexpressionisTrue
end
最后的这种形式,只和所碰到的、与第一个真值表达式相关的命令被执行;接下来的关系表达式不检验,跳过其余的If-Else-End结构。
而且,最后的else命令可有可无。
【例】
ifrand
(1)>0.5
disp('iloveyou')
else
disp('idonotloveyou')
end
【例】一个简单的分支结构。
cost=10;number=12;
ifnumber>8
sums=number*0.95*cost;
end,
sums
sums=
114.0000
【例】用for循环指令来寻求Fibonacc数组中第一个大于10000的元素。
n=100;a=ones(1,n);
fori=3:
n
a(i)=a(i-1)+a(i-2);
ifa(i)>=10000
a(i),
break;%跳出所在的一级循环。
end;
end,
i
ans=
10946
i=
21
switch-case-end结构
if-else-end语句所对应的是多重判断选择,而有时也会遇到多分支判断选择的问题。
MATLAB语言为解决多分支判断选择提供了switch-case语句。
swich语句是多分支选择语句,虽然在某些场合switch功能可以由if语句的多层嵌套来完成,但是会使程序变得复杂和难于修改维护,而利用switch语句构造多分支选择时显得更加简单明了、容易理解。
switch-case语句的一般表达形式为:
switch〈表达式〉
Case选择判断值1
选择判断语句1
case选择判断值2
选择判断语句2
……
otherwise
判断执行语句
end
与其他的程序设计语言的switch-case语句不同的是,在MATLAB语言中,当其中一个case语句后的条件为真时,switch-case语句不对其后的case语句进行判断,也就是说在MATLAB语言中,即使有多条case判断语句为真,也只执行所遇到的第一条为真的语句。
这样就不必像C语言那样,在每条case语句后加上break语句以防止继续执行后面为真的case条件语句。
【例】学生的成绩管理,用来演示switch结构的应用。
%划分区域:
满分(100),优秀(90-99),良好(80-89),及格(60-79),不及格(<60)。
N=input('输入分数');
switchN
case100%得分为100时
S='满分';%列为'满分'等级
case90%得分在90和99之间
S='优秀';%列为'优秀'等级
case80%得分在80和89之间
S='良好';%列为'良好'等级
case60%得分在60和79之间
S='及格';%列为'及格'等级
otherwise%得分低于60。
S='不及格';%列为'不及格'等级
end
disp(S)
(此程序不正确!
)
程序2:
N=input('输入分数');
N1=fix(N/10);
switchN1
case10%得分为100时
S='满分';%列为'满分'等级
case9%得分在90和99之间
S='优秀';%列为'优秀'等级
case8%得分在80和89之间
S='良好';%列为'良好'等级
case{6,7}%得分在60和79之间
S='及格';%列为'及格'等级
otherwise%得分低于60。
S='[不及格]';%列为'不及格'等级
end
disp(S)
例:
某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用price来表示):
price<200没有折扣
200≤price<5003%折扣
500≤price<10005%折扣
1000≤price<25008%折扣
2500≤price<500010%折扣
5000≤price14%折扣
输入所售商品的价格,求其实际销售价格。
程序如下:
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;
end
price=price*(1-rate)%输出商品实际销售价格
try-catch结构
【例】try-catch结构应用实例。
clear,N=4;A=magic(3);%设置3行3列矩阵A。
try
A_N=A(N,:
),%取A的第N行元素
catch
A_end=A(end,:
),%如果取A(N,:
)出错,则改取A的最后一行。
end
lasterr%显示出错原因
A_end=
492
ans=
Indexexceedsmatrixdimensions.
例:
[tang.m]
a=2;b=2;
x=-a:
0.2:
a;y=-b:
0.2:
b;
fori=1:
length(y)
forj=1:
length(x)
ifx(j)+y(i)>1
z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2-1.5*x(j));
elseifx(j)+y(i)<=-1
z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2+1.5*x(j));
elsez(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);
MATLAB的输入与输出语句
∙输入语句
o输入数值
x=input('pleaseinputanumber:
')
pleaseinputanumber:
22
x=22
o输入字符串
x=input('pleaseinputastring:
','s')
pleaseinputastring:
thisisastring
x=thisisastring
∙输出语句
o输出显示命令
▪自由格式(disp)
disp(23+454-29*4)
361
disp([112233;445566;778899])
112233
445566
778899
disp('thisisastring')
thisisastring
▪格式化输出(fprintf)。
fprintf('Theareais%8.5f\n',area)%注意输出格式前须有%符号,
%跳行符号须有\符号
Theareais12.56637%输出值为8位数含5位小数
在这里你如果学过c语言就能很好的理解了。
o错误消息显示命令
error('thisisanerror')
?
?
thisisanerror
关系操作符
说明
<
小于
<=
小于或等于
>
大于
>=
大于或等于
==
等于
~=
不等于
逻辑操作符
说明
&
与
|
或
~
非