MATLAB函数句柄和M文件要点Word格式文档下载.docx
- 文档编号:20048576
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:20
- 大小:377.75KB
MATLAB函数句柄和M文件要点Word格式文档下载.docx
《MATLAB函数句柄和M文件要点Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《MATLAB函数句柄和M文件要点Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
%
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MATLAB 函数 句柄 文件 要点