%epsilonGivenaccuracy
k=0;
s=0;
d=inf;
S=0;
whiled>epsilon
k=k+1;
s=s+k;
d=1/s;
S=S+d;
end
N=k;
(2)
(3)
[S,N]=exm060104(0.0001)
symsknN
SINF=limit(symsum(1/symsum(k,1,n),n,1,N),N,inf)
N=141;
SN=vpa(symsum(1/symsum(k,1,n),n,1,N))
.1.4控制程序流的其它常用指令
●break语句和continue语句
一般与if语句配合使用。
break语句用于终止循环的执行。
continue语句跳过当前循环,进入下一次。
例:
求[100,200]之间第一个能被21整除的整数。
程序如下:
forn=100:
200
ifrem(n,21)~=0
continue
end
break
end
n
n=
105
●try语句
try
语句组1
catch
语句组2
end
try语句先试探性执行语句组1,如果语句组1在执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并转去执行语句组2
例:
矩阵乘法运算要求两矩阵的维数相容,否则会出错。
先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。
A=[1,2,3;4,5,6];B=[7,8,9;10,11,12];
try
C=A*B;
catch
C=A.*B;
end
lasterrans=
错误使用*
内部矩阵维度必须一致。
脚本文件和函数文件
●M脚本文件
●M函数文件
●局部变量和全局变量
●M函数文件的一般结构
6.2.1M脚本文件
指令集合
所产生变量驻留在matlab工作空间
Clear指令或者matlab关闭时才删除
6.2.2M函数文件
从形式上看,第一行是function引导的函数申明行
中间变量存放在临时工作空间,函数调用结束时,临时工作空间变量立即被清除。
●M函数文件的一般结构
function输出形参表=函数名(输入形参表)
注释说明部分;
函数体语句;
具体:
1.函数申明行。
2.help和lookfor帮助使用。
3.在线帮助文本区,包括函数输入输出宗量的含义,调用格式说明。
(在线帮助文本,help菜单下matlabhelp)。
4.编写和修改记录。
用于软件档案管理。
5.函数体。
Matlab指令。
6.2.3局部变量和全局变量
局部变量:
存在于函数空间内部的中间变量。
产生于该函数的运行之中,影响范围也仅仅限于该函数。
全局变量:
基本工作空间和几个不同函数空间共享一个变量,即全局变量。
必须逐个用global函数加以定义。
一个函数改变其值,则所有的同名变量值改变。
【例6.2-1】编写一个M函数文件。
它具有以下功能:
(A)根据指定的半径,画出蓝色圆周线;(B)可以通过输入字符串,改变圆周线的颜色、线型;(C)假若需要输出圆面积,则绘出圆。
(1)
function[S,L]=exm060201(N,R,str)
%exm060201.mTheareaandperimeterofaregularpolygon(正多边形的面积和周长)
%NThenumberofsides
%RThecircumradius
%strAlinespecificationtodeterminelinetype/color
%STheareaoftheregularpolygon
%LTheperimeteroftheregularpolygon
%exm060201用蓝实线画半径为1的圆
%exm060201(N)用蓝实线画外接半径为1的正N边形
%exm060201(N,R)用蓝实线画外接半径为R的正N边形
%exm060201(N,R,str)用str指定的线画外接半径为R的正N边形
%S=exm060201(...)给出多边形面积S,并画相应正多边形填色图
%[S,L]=exm060201(...)给出多边形面积S和周长L,并画相应正多边形填色图
%ZhangZhiyong编写于2006-1-31
switchnargin
case0
N=100;R=1;str='-b';
case1
R=1;str='-b';
case2
str='-b';
case3
;%
otherwise
error('输入量太多。
');
end;
t=0:
2*pi/N:
2*pi;
x=R*sin(t);y=R*cos(t);
ifnargout==0
plot(x,y,str);
elseifnargout>2
error('输出量太多。
');
else
S=N*R*R*sin(2*pi/N)/2;%
L=2*N*R*sin(pi/N);%
fill(x,y,str)
end
axisequalsquare
boxon
shg
(2)
[S,L]=exm060201(6,2,'-g')%
图6.2-1绿色正六边形
例2:
求圆周率
functionpiva=PiMonteCarlo(n)
%PiMonteCarlo(n),用随机投点法模拟圆周率pi,作出模拟图.n为投点次数,可以是非负整数标量或向量.
%piva=PiMonteCarlo(n),用随机投点法模拟圆周率pi,返回模拟值piva.若n为标量(向量),则piva也为标量(向量).
x=0;y=0;d=0;
m=length(n);%求变量n的长度
pivalue=zeros(m,1);%为变量pivalue赋初值
%通过循环用投点法模拟圆周率pi
fori=1:
m
x=2*rand(n(i),1)-1;%随机投点的横坐标
y=2*rand(n(i),1)-1;%随机投点的纵坐标
d=x.^2+y.^2;
pivalue(i)=4*sum(d<=1)/n(i);%圆周率的模拟值
end
ifnargout==0
%不输出圆周率的模拟值,返回模拟图
ifm>1
%如果n为向量,则返回圆周率的模拟值与投点个数的散点图
figure;%新建一个图形窗口
plot(n,pivalue,'k.');%绘制散点图
h=refline(0,pi);%添加参考线
set(h,'linewidth',2,'color','k');%设置参考线属性
text(1.05*n(end),pi,'\pi','fontsize',15);%添加文本信息
xlabel('投点个数');ylabel('\pi的模拟值');%添加坐标轴标签
else
%如果n为标量,则返回投点法模拟圆周率的示意图
figure;%新建一个图形窗口
plot(x,y,'k.');%绘制散点图
holdon;
%绘制边长为2的正方形
h=rectangle('Position',[-1-122],'LineWidth',2);
t=linspace(0,2*pi,100);%定义一个角度向量
plot(cos(t),sin(t),'k','linewidth',2);%绘制单位圆
xlabel('X');ylabel('Y');%添加坐标轴标签
title(['Pi的模拟值:
'num2str(pivalue)]);%添加标题
axis([-1.11.1-1.11.1]);axisequal;%设置坐标轴属性
end
else
piva=pivalue;%输出圆周率的模拟值
end
p=PiMonteCarlo([1000:
5000:
50000])'%返回圆周率pi的模拟值向量
PiMonteCarlo([100:
50:
20000])%绘制模拟值与投点个数的散点图
PiMonteCarlo(1000)
.2MATLAB的函数类别
从扩展名M观察,MATLAB的M文件分为M脚本文件和M函数文件。
那么,在MATLAB中,函数Function又被细分为:
主函数;子函数;嵌套函数;私用函数;匿名函数等。
限于篇幅,本节只对主函数、子函数及匿名函数进行阐述。
.2.1主函数(Primaryfunction)
.2.2子函数(Subfunction)
【例6.3-1】编写一个内含子函数的M函数绘图文件。
(1)
functionHr=exm060301(flag)
%exm060301.mDemoforhandlesofprimaryfunctionsandsubfunctions
%flag可以取字符串'line'或'circle'。
%Hr子函数cirline的句柄
t=(0:
50)/50*2*pi;
x=sin(t);
y=cos(t);
Hr=@cirline;%
feval(Hr,flag,x,y,t)
%
functioncirline(wd,x,y,t)
%
switchwd
case'line'
plot(t,x,'b',t,y,'r','LineWidth',2)
case'circle'
plot(x,y,'-g','LineWidth',8),
axissquareoff
otherwise
error('输入宗量只能取''line''或''circle''!
')
end
shg
(2)HH=exm060301('circle')?
?
?
未定义与'char'类型的输入参数相对应的函数'exm060301'。
HH=
@cirline
图6.3-1绿色圆周线
HH=exm060301('line')
HH=
@cirline
(3)
t=0:
2*pi/5:
2*pi;x=cos(t);y=sin(t);%
HH('circle',x,y,t)
CC=functions(HH)
CC=
function:
'cirline'
type:
'scopedfunction'
file:
'E:
\2016秋Matlab\program\exm060301.m'
parentage:
{'cirline''exm060301'}
图6.3-2由子函数绘制的绿色正五边形
.2.3匿名函数(Anonymousfunction)
(1)匿名函数的创建
FH=@(arglist)expr
(2)匿名函数的调用
FH(arglist)直接调用格式
.3函数句柄
●函数句柄(Functionhandle)是MATLAB的一种数据类型。
●包含了函数的路径、函数名、类型以及可能存在的重载方法;
好处:
(1).引入函数句柄是为了使feval及借助于它的泛函指令工作更可靠;
(2).使“函数调用”像“变量调用”一样方便灵活;
(3).提高函数调用速度,特别在反复调用情况下更显效率;
(4).提高软件重用性,扩大子函数和私用函数的可调用范围;
(5).迅速获得同名重载函数的位置、类型信息。
可以与变量一样方便地使用:
比如说,在现在这个目录运行时,创建了本目录一个函数的句柄,当转到其他目录时,可以通过函数句柄直接调用上一个目录的函数,而不需要把那个函数文件复制过来,因为创建的函数句柄中已经包含了路径信息;
提高函数调用速度:
因为matlab对函数的调用每次都是要搜索所有的路径,从setpath中可以看到,路径是非常的多的,所以如果一个函数在程序中需要经常用到的话,使用函数句柄,对速度会有提高的
.3.1函数句柄的创建和观察
(1)创建函数句柄
hm=@magic
hm=
@magic
(2)函数句柄的调用
M1=hm(4)
M2=feval(hm,4)
M1=
162313
511108
97612
414151
M2=
162313
511108
97612
414151
【例6.4-1】为magic函数创建文件句柄,并观察其内涵
(1)
hm=@magic
hm=
@magic
(2)
class(hm)
isa(hm,'function_handle')
ans=
function_handle
ans=
1
(3)
CC=functions(hm)
CC=
function:
'magic'
type:
'simple'
file:
'D:
\MatlabR2014a\toolbox\matlab\elmat\ma...'
(4)
M1=hm(4)
M1=
162313
511108
97612
414151
(5)
M2=feval(hm,4)
M2=
162313
511108
97612
414151
.3.2函数句柄的基本用法
原函数调用格式
[argout1,argout2,…,argoutn]=FunName(argin1,argin2,…,arginn)
Hfun=@FunName
函数句柄调用格式
[argout1,argout2,…,argoutn]=Hfun(argin1,argin2,…,arginn)
【例6.4-2】
(1)[S,L]=exm060201(3,2,'-r')%S=
5.1962
L=
10.3923
S=
图6.4-1直接调用函数exm060201所画的红色等边三角形
(2)
Hexm=@exm060201,%
(3)
which('exm060201')
(5)
[S,L]=exm060201(3,2,'-r')
(6)[S,L]=Hexm(3,2,'-r')%
图6.4-2在新视野中里用函数句柄Hexm所画的红色等边三角形
思考题1:
猜数游戏
首先由计算机产生[1,100]之间的随机整数,然后由用户猜测所产生的随机数。
根据用户猜测的情况给出不同提示,如猜测的数大于产生的数,则显示“High”,小于则显示“Low”,等于则显示“Youwon”,同时退出游戏。
用户最多可以猜7次。
a=ceil(100*rand
(1));
fori=1:
7
b=input('thenumberis?
');
ifb>a
xx='high'
elseifbxx='low'
else
xx='youareright'
a
break
end
end
end