ch6编程.docx
- 文档编号:12303904
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:21
- 大小:66.30KB
ch6编程.docx
《ch6编程.docx》由会员分享,可在线阅读,更多相关《ch6编程.docx(21页珍藏版)》请在冰豆网上搜索。
ch6编程
第6章M文件和函数句柄
从总体上说,单独的MATLAB指令,及由若干指令构成的孤立表达式,只能解算或仿真简单理论数学模型所描述的问题。
复杂些的问题通常需要用一组理论数学算式。
这些问题的解算及仿真就需要借助较复杂的MATLAB程序进行。
这种MATLAB程序由较多的MATLAB指令和多种多样的MATLAB表达式组成,并循着一定的执行次序运行。
这种程序的扩展名为m。
这就是脚本M文件或函数M文件。
本章系统介绍编写MATLAB程序时最常用到的四种控制结构、M函数文件的构造、主函数、子函数以及匿名函数。
最后一节专门叙述函数句柄的创建、观察和调用。
.1MATLAB控制流
.1.1if-else-end条件控制
表6.1-1if-else-end分支结构的使用方式
单分支
双分支
多分支
ifexpr
(commands)
end
ifexpr
(commands1)
else
(commands2)
end
ifexpr1
(commands)
elseifexpr2
(commands)
…….
else
(commandsk)
end
〖说明〗
【例6.1-1】
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-2switch-case控制结构的使用方式
指令格式
含义
switchexpr
casevalue_1
(commands1)
casevalue_2
(commands2)
casevalue_k
(commandsk)
otherwise
(commands)
end
〖说明〗
【例6.1-2】
clear;
%定义分数段:
满分(100),优秀(90-99),良好(80-89),及格(60-79),不及格(<60)。
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】创建Hilbert矩阵。
1)
2)
K=5;
A=zeros(K,K);%
form=1:
K%
forn=1:
K%
A(m,n)=1/(m+n-1);
end
end
formatrat
A
formatshortg
A=
11/21/31/41/5
1/21/31/41/51/6
1/31/41/51/61/7
1/41/51/61/71/8
1/51/61/71/81/9
3)
%
clear
tic%
K=1000;
form=1:
K
forn=1:
K
A1(m,n)=1/(m+n-1);
end
end
t1=toc%
t1=
17.434
%
tic
K=1000;
A2=zeros(K,K);%
form=1:
K
forn=1:
K
A2(m,n)=1/(m+n-1);
end
end
t2=toc
t2=
2.1895
4)产生Hilbert矩阵的数组化编程将大大提高运行速度
%
tic
N=1000;
n=repmat(1:
N,N,1);
m=n';
A3=1./(n+m-1);
t3=toc
t3=
0.13909
〖说明〗
【例6.1-4】创建n阶魔方矩阵,限定条件是n为能被4整除的偶数。
1)
2)
function[A,n]=exm060104_ZZY(n)
%exm060104_ZZY.m
%A
%n
clear
clc
while1%<4>
ifmod(n,4)==0%<5>
break
else
n=input('请输入一个能被4整除的正整数!
n=');%<8>
end%<9>
end%<10>
G=logical(eye(4,4)+rot90(eye(4,4)));%
m=n/4;
K=repmat(G,m,m);%
N=n^2;
A=reshape(1:
N,n,n);
A(K)=N-A(K)+1%
3)
clear,clc
n=12;
[A,n]=exm060104_ZZY(n);
s0=round(n*(n*n+1)/2);%
disp([int2str(n),'阶魔方矩阵的标称和是',int2str(s0)])
Ns0=round(2*(n+1));%
B=A';
SC=sum(A);%
SR=sum(B);%
Sd=sum(diag(A));%
Sdi=sum(diag(B));%
LS=[SC,SR,Sd,Sdi]==s0;%
NS=round(sum(LS));%
ifNS==Ns0
disp('经验证,A是魔方矩阵。
')
else
disp('经验证,A不是魔方矩阵。
')
end
12阶魔方矩阵的标称和是870
经验证,A是魔方矩阵。
〖说明〗
●关于魔方矩阵的说明:
⏹MATLAB\toolbox\matlab\demos文件夹上的durer.mat数据文件是一幅版画“MelencoliaI(忧郁人)”的电子数据。
该版画是文艺复兴时期德国画家、业余数学家AlbrechtDürer创作的。
在此版画的右上角,绘制着一个4阶魔方(MagicSquare)。
有兴趣的读者,通过运行loaddurer,image(X),colormap(map),axisimage看到这幅版画。
⏹魔方具有许多迷人的数学特性,至今仍是组合数学的一个研究课题。
在MATLAB帮助文件的算例中经常用到魔方矩阵。
⏹考证表明:
魔方源于古代中国,时称“纵横图”,伴有浓重神秘色彩。
部分学者认为,“纵横图”始于《洛书》。
[二九四,七五三,六一八]是最早文字记载的3阶魔方矩阵(见图6.1-1),称“九宫图”。
它见著于公元前1世纪的《大戴礼记》“明堂篇”。
公元1275年宋朝数学家杨辉著的《续古摘奇算法》中,有关于“纵横图”的专门研究。
“纵横图”经由东南亚、印度、阿拉伯向西方传播。
公元15世纪,“纵横图”再从土耳其的君士坦丁堡传入欧洲。
图6.1-1九宫图
.1.4控制程序流的其它常用指令
表6.1-4控制程序流的其它常用指令
指令及使用格式
使用说明
v=input('message')
v=input('message','s')
keyboard
break
continue
pause
pause(n)
return
.2脚本文件和函数文件
.2.1M脚本文件
.2.2M函数文件
.2.3局部变量和全局变量
(1)局部(Local)变量
(2)全局(Global)变量
〖说明〗
.2.4M函数文件的一般结构
【例6.2-1】编写一个M函数文件。
它具有以下功能:
根据指定的半径,画出蓝色圆周线;可以通过输入字符串,改变圆周线的颜色、线型;假若需要输出圆面积,则绘出圆。
本例演示:
M函数文件的典型结构;指令nargin,nargout的使用和函数输入/输出量数目的柔性可变;switch-case控制结构的应用示例;if-elseif-else的应用示例;error的使用。
1)编写函数M文件exm060201.m
function[S,L]=exm060201(N,R,str)
%exm060201.mTheareaandperimeterofaregularpolygon(正多边形的面积和周长)
%NThenumberofsides
%RThecircumradius
%strAlinespecificationtodeterminelinetype/color
%STheareaoftheregularpolygon
%LTheperimeteroftheregularpolygon
%exm060201
%exm060201(N)
%exm060201(N,R)
%exm060201(N,R,str)
%S=exm060201(...)
%[S,L]=exm060201(...)
%ZhangZhiyong修改于2013-12-20
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
axisimage%
set(gcf,'Color','white')%
boxon
shg
2)
[S,L]=exm060201(6,2,'-g')%
S=
10.3923
L=
12.0000
图6.2-1
〖说明〗
.3MATLAB的函数类别
.3.1主函数(Primaryfunction)
.3.2子函数(Subfunction)
【例6.3-1】编写一个内含子函数的M函数绘图文件。
1)
functionHr=exm060301(flag)
%exm060301.mDemoforhandlesofprimaryfunctionsandsubfunctions
%flag
%Hr
t=(0:
50)/50*2*pi;
x=sin(t);
y=cos(t);
Hr=@cirline;%
feval(Hr,flag,x,y,t)
%-------------subfunction---------------------------
functioncirline(wd,x,y,t)
%cirline(wd,x,y,t)
%wd
%t
%x
%y
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')
HH=
@cirline
图6.3-1
3)
t=0:
2*pi/5:
2*pi;x=cos(t);y=sin(t);%
HH('circle',x,y,t)%
图6.3-2
.3.3匿名函数(Anonymousfunction)
(1)
(2)
〖说明〗
.4函数句柄
.4.1函数句柄的创建和观察
【例6.4-1】
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:
'F:
\MATLABR2013a\toolbox\matlab\elmat\magic.m'
4)
M1=hm(4)
M1=
162313
511108
97612
414151
〖说明〗
.4.2函数句柄的基本用法
〖说明〗
【例6.4-2】
1)
2)
[S,L]=exm060201(3,2,'-r')%
S=
5.1962
L=
10.3923
图6.4-1
3)
Hexm=@exm060201,%
Hexm=
@exm060201
4)
which('exm060201')
'exm060201'notfound.
5)
[S,L]=exm060201(3,2,'-r')
?
?
?
Undefinedfunction'exm060201'forinputargumentsoftype'double'.
6)
[S,L]=Hexm(3,2,'-r')%
S=
5.1962
L=
10.3923
.
图6.4-2
【例6.4-3】
1)
clear
2)
Hexm_2=@exm060201
Hexm_2=
@exm060201
3)
class(Hexm_2)
isa(Hexm_2,'function_handle')
ans=
function_handle
ans=
1
4)
[S,L]=Hexm_2(3,2,'-r')
?
?
?
Undefinedfunction'exm060201'forinputargumentsoftype'double'.
〖说明〗
习题6
1.请分别写出用for和while循环语句计算
的程序。
此外,还请写出避免循环的数值、符号计算程序。
(提示:
sum和“指数采用数组”配合;tic,toc可用以记录计算所花的时间。
)
2.在指定阈值
的情况下,求
。
其中通项
,而
是使通项
满足的最小正整数
,即
。
本题要求:
先请编写一个M函数文件,且该函数的输入量为阈值
,输出量是满足要求
的最小正整数
及这
个通项和
。
然后,在
时,利用你所编写的M函数算出相应的
值、
值。
(利用提示:
构成while环。
)
3.编写一个函数M文件,它的功能:
没有输入量时,画出单位圆(见图p6-1);输入量是大于2的自然数N时,绘制正N边形,图名应反映显示多边形的真实边数(见图p6-2);输入量是“非自然数”时,给出“出错提示”。
此外,函数M文件应有H1行、帮助说明和程序编写人姓名。
(提示:
nargin,error,int2str)
图p6-1
图p6-2
4.使用泛函指令fminbnd寻找
在x=0附近的极小值,并绘制出该函数在[-2,2]间的图形加以验证。
本题要求:
fminbnd的第一个输入量使用匿名函数表达。
(提示:
注意搜索范围的选择;假如极值在边界附近,进一步扩大搜索范围是合理的选择。
)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ch6 编程
![提示](https://static.bdocx.com/images/bang_tan.gif)