MATLAB函数句柄和M文件_第1页
MATLAB函数句柄和M文件_第2页
MATLAB函数句柄和M文件_第3页
MATLAB函数句柄和M文件_第4页
MATLAB函数句柄和M文件_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEPAGE17M文件和函数句柄6.1Matlab控制流6.2脚本文件和函数文件6.3Matlab的函数类别6.4函数句柄MATLAB控制流6.1.1if-else-end条件控制6.1.2swith-case控制语句6.1.3for循环和while循环6.1.4控制程序流和的其他常用指令if-else-end条件控制【例6.1-1】已知,在区间,求函数的最小值。回顾与复习:[x,fval,exitflag,output]=fminbnd(fun,x1,x2,options) 求一元函数在区间(x1,x2)中极小值在第四章中采用的方法(1)采用优化算法求极小值x1=-50;x2=5; %yx=@(x)(sin(x)^2*exp(-0.1*x)-0.5*sin(x)*(x+0.1)); [xc0,fc0,exitflag,output]=fminbnd(yx,x1,x2) % <9> %(2)据图形观察,重设fminbnd的搜索区间xx=[-23,-20,-18]; %fc=fc0;xc=xc0; %fork=1:2 [xw,fw]=fminbnd(yx,xx(k),xx(k+1)); % <16> iffw<fc xc=xw; fc=fw; endend fprintf('函数最小值%6.5f发生在x=%6.5f处',fc,xc)函数最小值-3.34765发生在x=-19.60721处1)function[xmin,fmin,n]=exm060101(fx,a,b,Nt)%exm060101.m %fx %a、b %Nt %xmin、ymin %n [~,f0]=fminbnd(fx,a,b); %n=1; %jj=1; %while1n=2*n; %d=(b-a)/n; %x=a:d:b; %ii=0;xc=zeros(1,n);fc=xc; %fork=1:n %[w,f,eflag]=fminbnd(fx,x(k),x(k+1)); %ifeflag>0 %ii=ii+1;xc(ii)=w;fc(ii)=f;endend[fmin,kk]=min(fc); %xmin=xc(kk); %ifabs(f0-fmin)<1e-6 %jj=jj+1; %ifjj>Nt %break %endelseiff0-fmin>1e-6 %f0=fmin; %jj=1; %endend2) clearfx=@(x)(sin(x)^2*exp(-0.1*x)-0.5*sin(x)*(x+0.1));a=-50;b=5;[xmin,fmin,n]=exm060101(fx,a,b,3);fprintf('在x=%6.5f处,函数到达最小值%6.5f\n',xmin,fmin)fprintf('最终子区间分割数为%d\n',n)在x=-19.60721处,函数到达最小值-3.34765最终子区间分割数为128switch-case控制结构【例6.1-2】已知学生姓名和百分制分数,用“满分”,优秀、良好、及格和不及格表示学生成绩clear;%fork=1:10 a(k)={89+k};b(k)={79+k};c(k)={69+k};d(k)={59+k};end;c=[d,c];%A=cell(3,5); %A(1,:)={'Jack','Marry','Peter','Rose','Tom'};%<7>A(2,:)={72,83,56,94,100}; %<8>%fork=1:5switchA{2,k} %case100 %r='满分'; casea %r='优秀'; caseb %r='良好'; casec %r='及格'; otherwise %r='不及格';end A(3,k)={r}; endAA='Jack''Marry''Peter''Rose''Tom'[72][83][56][94][100]'及格''良好''不及格''优秀''满分'for循环和while循环表6.1-3循环结构的使用方式for循环while循环forix=array(commands)endwhileexpression(commands) end【例6.1-3】请分别写出用for和while循环语句计算的程序。此外,还请写出避免循环的数值、符号计算程序。(1)for循环方法tics1=0;fork=0:1e6s1=s1+0.2^(k);end;s1toc(2)while循环方法tics2=1;k=1;whilek<1e6+1 %注意:上限与for循环不同 s2=s2+0.2^k; k=k+1;ends2toc(3)数值求和指令tics3=sum(0.2.^(0:1e6))toc(4)符号求和指令ticsymsk;s4=vpa(symsum(0.2^k,0,1e6))toc【例6.1-4】编写计算,其中,是预先给定的控制精度。(1)function[S,N]=exm060104(epsilon)%[S,N]=exm060104(epsilon)% CalculatethesumofaspecialseriesS=1+1/(1+2)+…+1/(1+2+…+N)%S Sumofaspecialseries%N Theminimumamongallnumberstohave1/sum(1:N)<epsilon%epsilon Givenaccuracyk=0;s=0;d=inf;S=0;whiled>epsilonk=k+1;s=s+k;d=1/s;S=S+d;endN=k;(2)(3)[S,N]=exm060104(0.0001)symsknNSINF=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))控制程序流的其它常用指令break语句和continue语句一般与if语句配合使用。break语句用于终止循环的执行。continue语句跳过当前循环,进入下一次。例:求[100,200]之间第一个能被21整除的整数。程序如下:forn=100:200ifrem(n,21)~=0continueendbreakendnn=105try语句try语句组1catch语句组2endtry语句先试探性执行语句组1,如果语句组1在执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并转去执行语句组2例:矩阵乘法运算要求两矩阵的维数相容,否则会出错。先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。A=[1,2,3;4,5,6];B=[7,8,9;10,11,12];tryC=A*B;catchC=A.*B;endlasterrans=错误使用*内部矩阵维度必须一致。脚本文件和函数文件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(正多边形的面积和周长)% N Thenumberofsides% R Thecircumradius% str Alinespecificationtodeterminelinetype/color% S Theareaoftheregularpolygon% L Theperimeteroftheregularpolygon%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-3switchnargincase0N=100;R=1;str='-b';case1R=1;str='-b';case2str='-b';case3; %otherwiseerror('输入量太多。');end;t=0:2*pi/N:2*pi;x=R*sin(t);y=R*cos(t);ifnargout==0plot(x,y,str);elseifnargout>2error('输出量太多。');elseS=N*R*R*sin(2*pi/N)/2; %L=2*N*R*sin(pi/N); %fill(x,y,str)endaxisequalsquareboxonshg(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赋初值%通过循环用投点法模拟圆周率pifori=1:mx=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);%圆周率的模拟值endifnargout==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;%设置坐标轴属性endelsepiva=pivalue;%输出圆周率的模拟值endp=PiMonteCarlo([1000:5000:50000])'%返回圆周率pi的模拟值向量PiMonteCarlo([100:50:20000])%绘制模拟值与投点个数的散点图PiMonteCarlo(1000)MATLAB的函数类别从扩展名M观察,MATLAB的M文件分为M脚本文件和M函数文件。那么,在MATLAB中,函数Function又被细分为:主函数;子函数;嵌套函数;私用函数;匿名函数等。限于篇幅,本节只对主函数、子函数及匿名函数进行阐述。主函数(Primaryfunction)子函数(Subfunction)【例6.3-1】编写一个内含子函数的M函数绘图文件。(1)functionHr=exm060301(flag)%exm060301.m Demoforhandlesofprimaryfunctionsandsubfunctions% 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)%switchwdcase'line'plot(t,x,'b',t,y,'r','LineWidth',2)case'circle'plot(x,y,'-g','LineWidth',8),axissquareoffotherwiseerror('输入宗量只能取''line''或''circle''!')endshg(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由子函数绘制的绿色正五边形匿名函数(Anonymousfunction)(1)匿名函数的创建FH=@(arglist)expr(2)匿名函数的调用FH(arglist)直接调用格式函数句柄函数句柄(Functionhandle)是MATLAB的一种数据类型。包含了函数的路径、函数名、类型以及可能存在的重载方法;好处:引入函数句柄是为了使feval及借助于它的泛函指令工作更可靠;使“函数调用”像“变量调用”一样方便灵活;提高函数调用速度,特别在反复调用情况下更显效率;提高软件重用性,扩大子函数和私用函数的可调用范围;迅速获得同名重载函数的位置、类型信息。可以与变量一样方便地使用:比如说,在现在这个目录运行时,创建了本目录一个函数的句柄,当转到其他目录时,可以通过函数句柄直接调用上一个目录的函数,而不需要把那个函数文件复制过来,因为创建的函数句柄中已经包含了路径信息;提高函数调用速度:因为matlab对函数的调用每次都是要搜索所有的路径,从setpath中可以看到,路径是非常的多的,所以如果一个函数在程序中需要经常用到的话,使用函数句柄,对速度会有提高的函数句柄的创建和观察(1)创建函数句柄hm=@magichm=@magic(2)函数句柄的调用M1=hm(4)M2=feval(hm,4)M1=16231351110897612414151M2=16231351110897612414151【例6.4-1】为magic函数创建文件句柄,并观察其内涵(1)hm=@magichm=@magic(2)class(hm)isa(hm,'function_handle')ans=function_handleans=1(3)CC=functions(hm)CC=function:'magic'type:'simple'file:'D:\MatlabR2014a\toolbox\matlab\elmat\ma...'(4)M1=hm(4)M1=1623

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论