MATLAB函数句柄和M文件重点讲义资料Word下载.docx

上传人:b****4 文档编号:8200374 上传时间:2023-05-10 格式:DOCX 页数:20 大小:377.77KB
下载 相关 举报
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第1页
第1页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第2页
第2页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第3页
第3页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第4页
第4页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第5页
第5页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第6页
第6页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第7页
第7页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第8页
第8页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第9页
第9页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第10页
第10页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第11页
第11页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第12页
第12页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第13页
第13页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第14页
第14页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第15页
第15页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第16页
第16页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第17页
第17页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第18页
第18页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第19页
第19页 / 共20页
MATLAB函数句柄和M文件重点讲义资料Word下载.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

MATLAB函数句柄和M文件重点讲义资料Word下载.docx

《MATLAB函数句柄和M文件重点讲义资料Word下载.docx》由会员分享,可在线阅读,更多相关《MATLAB函数句柄和M文件重点讲义资料Word下载.docx(20页珍藏版)》请在冰点文库上搜索。

MATLAB函数句柄和M文件重点讲义资料Word下载.docx

%

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

[fmin,kk]=min(fc);

xmin=xc(kk);

ifabs(f0-fmin)<

1e-6%

jj=jj+1;

ifjj>

Nt%

break%

elseiff0-fmin>

1e-6%

f0=fmin;

jj=1;

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

在x=%6.5f处,函数到达最小值%6.5f\n'

xmin,fmin)

最终子区间分割数为%d\n'

n)

在x=-19.60721处,函数到达最小值-3.34765

最终子区间分割数为128

.1.2switch-case控制结构

【例6.1-2】已知学生姓名和百分制分数,用“满分”,优秀、良好、及格和不及格表示学生成绩

clear;

%

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>

5

switchA{2,k}%

case100%

r='

满分'

;

casea%

优秀'

caseb%

良好'

casec%

及格'

otherwise%

不及格'

A(3,k)={r};

A

A=

'

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

.1.3for循环和while循环

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

for循环

while循环

forix=array

(commands)

whileexpression

(commands)

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

的程序。

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

(1)for循环方法

tic

s1=0;

fork=0:

1e6

s1=s1+0.2^(k);

s1

toc

(2)while循环方法

s2=1;

k=1;

whilek<

1e6+1%注意:

上限与for循环不同

s2=s2+0.2^k;

k=k+1;

s2

toc

(3)数值求和指令

s3=sum(0.2.^(0:

1e6))

toc

(4)符号求和指令

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)<

epsilon

%epsilonGivenaccuracy

k=0;

s=0;

d=inf;

S=0;

whiled>

s=s+k;

d=1/s;

S=S+d;

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

break

n

n=

105

●try语句

try

语句组1

catch

语句组2

try语句先试探性执行语句组1,如果语句组1在执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并转去执行语句组2

矩阵乘法运算要求两矩阵的维数相容,否则会出错。

先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。

A=[1,2,3;

4,5,6];

B=[7,8,9;

10,11,12];

C=A*B;

C=A.*B;

lasterrans=

错误使用*

内部矩阵维度必须一致。

脚本文件和函数文件

●M脚本文件

●M函数文件

●局部变量和全局变量

●M函数文件的一般结构

6.2.1M脚本文件

指令集合

所产生变量驻留在matlab工作空间

Clear指令或者matlab关闭时才删除

6.2.2M函数文件

从形式上看,第一行是function引导的函数申明行

中间变量存放在临时工作空间,函数调用结束时,临时工作空间变量立即被清除。

function输出形参表=函数名(输入形参表)

注释说明部分;

函数体语句;

具体:

1.函数申明行。

2.help和lookfor帮助使用。

3.在线帮助文本区,包括函数输入输出宗量的含义,调用格式说明。

(在线帮助文本,help菜单下matlabhelp)。

4.编写和修改记录。

用于软件档案管理。

5.函数体。

Matlab指令。

6.2.3局部变量和全局变量

局部变量:

存在于函数空间内部的中间变量。

产生于该函数的运行之中,影响范围也仅仅限于该函数。

全局变量:

基本工作空间和几个不同函数空间共享一个变量,即全局变量。

必须逐个用global函数加以定义。

一个函数改变其值,则所有的同名变量值改变。

【例6.2-1】编写一个M函数文件。

它具有以下功能:

(A)根据指定的半径,画出蓝色圆周线;

(B)可以通过输入字符串,改变圆周线的颜色、线型;

(C)假若需要输出圆面积,则绘出圆。

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;

case2

str='

case3

;

%

otherwise

error('

输入量太多。

'

);

t=0:

2*pi/N:

2*pi;

x=R*sin(t);

y=R*cos(t);

ifnargout==0

plot(x,y,str);

elseifnargout>

输出量太多。

else

S=N*R*R*sin(2*pi/N)/2;

%

L=2*N*R*sin(pi/N);

fill(x,y,str)

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

%圆周率的模拟值

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为标量,则返回投点法模拟圆周率的示意图

plot(x,y,'

holdon;

%绘制边长为2的正方形

h=rectangle('

Position'

[-1-122],'

LineWidth'

2);

t=linspace(0,2*pi,100);

%定义一个角度向量

plot(cos(t),sin(t),'

%绘制单位圆

X'

Y'

title(['

Pi的模拟值:

num2str(pivalue)]);

%添加标题

axis([-1.11.1-1.11.1]);

axisequal;

%设置坐标轴属性

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函数绘图文件。

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'

plot(t,x,'

b'

t,y,'

r'

'

2)

plot(x,y,'

8),

axissquareoff

otherwise

输入宗量只能取'

shg

(2)HH=exm060301('

)?

?

未定义与'

char'

类型的输入参数相对应的函数'

exm060301'

HH=

@cirline

图6.3-1绿色圆周线

HH=exm060301('

t=0:

2*pi/5:

x=cos(t);

y=sin(t);

HH('

x,y,t)

CC=functions(HH)

CC=

function:

cirline'

type:

scopedfunction'

file:

E:

\2016秋Matlab\program\exm060301.m'

parentage:

{'

}

图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=

414151

【例6.4-1】为magic函数创建文件句柄,并观察其内涵

hm=@magic

class(hm)

isa(hm,'

function_handle'

ans=

function_handle

1

CC=functions(hm)

magic'

simple'

D:

\MatlabR2014a\toolbox\matlab\elmat\ma...'

(4)

M1=hm(4)

(5)

.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所画的红色等边三角形

Hexm=@exm060201,%

which('

exm060201'

[S,L]=exm060201(3,2,'

(6)[S,L]=Hexm(3,2,'

)%

图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<

low'

youareright'

a

break

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

当前位置:首页 > 工程科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2