MATLAB函数句柄和M文件要点.docx

上传人:b****5 文档编号:7024613 上传时间:2023-01-16 格式:DOCX 页数:20 大小:377.75KB
下载 相关 举报
MATLAB函数句柄和M文件要点.docx_第1页
第1页 / 共20页
MATLAB函数句柄和M文件要点.docx_第2页
第2页 / 共20页
MATLAB函数句柄和M文件要点.docx_第3页
第3页 / 共20页
MATLAB函数句柄和M文件要点.docx_第4页
第4页 / 共20页
MATLAB函数句柄和M文件要点.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

MATLAB函数句柄和M文件要点.docx

《MATLAB函数句柄和M文件要点.docx》由会员分享,可在线阅读,更多相关《MATLAB函数句柄和M文件要点.docx(20页珍藏版)》请在冰豆网上搜索。

MATLAB函数句柄和M文件要点.docx

MATLAB函数句柄和M文件要点

第6章M文件和函数句柄

6.1Matlab控制流

6.2脚本文件和函数文件

6.3Matlab的函数类别

6.4函数句柄

.1MATLAB控制流

6.1.1if-else-end条件控制

6.1.2swith-case控制语句

6.1.3for循环和while循环

6.1.4控制程序流和的其他常用指令

.1.1if-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

xc=xw;

fc=fw;

end

end

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;%

while1

n=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;

end

end

[fmin,kk]=min(fc);%

xmin=xc(kk);%

ifabs(f0-fmin)<1e-6%

jj=jj+1;%

ifjj>Nt%

break%

end

elseiff0-fmin>1e-6%

f0=fmin;%

jj=1;%

end

end

2)

clear

fx=@(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

最终子区间分割数为128

.1.2switch-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:

5

switchA{2,k}%

case100%

r='满分';

casea%

r='优秀';

caseb%

r='良好';

casec%

r='及格';

otherwise%

r='不及格';

end

A(3,k)={r};

end

A

A=

'Jack''Marry''Peter''Rose''Tom'

[72][83][56][94][100]

'及格''良好''不及格''优秀''满分'

.1.3for循环和while循环

表6.1-3循环结构的使用方式

for循环

while循环

forix=array

(commands)

end

whileexpression

(commands)

end

【例6.1-3】请分别写出用for和while循环语句计算

的程序。

此外,还请写出避免循环的数值、符号计算程序。

(1)for循环方法

tic

s1=0;

fork=0:

1e6

s1=s1+0.2^(k);

end;

s1

toc

(2)while循环方法

tic

s2=1;k=1;

whilek<1e6+1%注意:

上限与for循环不同

s2=s2+0.2^k;

k=k+1;

end

s2

toc

(3)数值求和指令

tic

s3=sum(0.2.^(0:

1e6))

toc

(4)符号求和指令

tic

symsk;

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)

%SSumofaspecialseries

%NTheminimumamongallnumberstohave1/sum(1:

N)

%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'

elseifb

xx='low'

else

xx='youareright'

a

break

end

end

end

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

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1