ch6编程.docx
《ch6编程.docx》由会员分享,可在线阅读,更多相关《ch6编程.docx(14页珍藏版)》请在冰豆网上搜索。
ch6编程
第6章M文件和函数句柄
.1MATLAB控制流
.1.1if-else-end条件控制
【例6.1-1】
(1)
functiony=exm060101(x)
%
n=length(x);
fork=1:
n
ifx(k)<-1
y(k)=x(k);
elseifx(k)>=1
y(k)=exp(1-x(k));
else
y(k)=x(k)^3;
end
end
(2)
x=[-2,-1.2,-0.4,0.8,1,6]
y=exm060101(x)
x=
-2.0000-1.2000-0.40000.80001.00006.0000
y=
-2.0000-1.2000-0.06400.51201.00000.0067
.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】
(1)
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
(2)
%
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
(3)
%
tic
N=1000;
n=repmat(1:
N,N,1);
m=n';
A3=1./(n+m-1);
t3=toc
t3=
0.13909
【例6.1-4】
(1)
function[S,N]=exm060104(epsilon)
%
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)
[S,N]=exm060104(0.0001)
S=
1.9859
N=
141
symsknN
SINF=limit(symsum(1/symsum(k,1,n),n,1,N),N,inf)
SINF=
2
N=141;
SN=vpa(symsum(1/symsum(k,1,n),n,1,N))
SN=
1.9859154929577464788732394366197
【例6.1-5】
(1)
(2)
clear,clc
n=12;
[A,n]=exm060105_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是魔方矩阵。
.1.4控制程序流的其它常用指令
.2脚本文件和函数文件
.2.1M脚本文件
.2.2M函数文件
.2.3局部变量和全局变量
.2.4M函数文件的一般结构
【例6.2-1】
(1)
function[S,L]=exm060201(N,R,str)
%
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')%
S=
10.3923
L=
12.0000
图6.2-1绿色正六边形
.3MATLAB的函数类别
.3.1主函数(Primaryfunction)
.3.2子函数(Subfunction)
【例6.3-1】
(1)
functionHr=exm060301(flag)
%
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')
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)
.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:
'C:
\MATLABR2010a\toolbox\matlab\elmat\magic.m'
(4)
M1=hm(4)
M1=
162313
511108
97612
414151
(5)
M2=feval(hm,4)
M2=
162313
511108
97612
414151
.4.2函数句柄的基本用法
【例6.4-2】
(1)
[S,L]=exm060201(3,2,'-r')%
S=
5.1962
L=
10.3923
图6.4-1直接调用函数exm060201所画的红色等边三角形
(2)
Hexm=@exm060201,%
Hexm=
@exm060201
(3)
which('exm060201')
'exm060201'notfound.
(5)
[S,L]=exm060201(3,2,'-r')
?
?
?
Undefinedcommand/function'exm060201'.
(6)
[S,L]=Hexm(3,2,'-r')%
S=
5.1962
L=
10.3923
图6.4-2在新视野中里用函数句柄Hexm所画的红色等边三角形
【例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')
?
?
?
Undefinedcommand/function'exm060201'.
习题6
1.请分别写出用for和while循环语句计算
的程序。
此外,还请写出避免循环的数值、符号计算程序。
(提示:
sum和“指数采用数组”配合;tic,toc可用以记录计算所花的时间。
)
2.编写一个函数M文件,它的功能:
没有输入量时,画出单位圆(见图p6-1);输入量是大于2的自然数N时,绘制正N边形,图名应反映显示多边形的真实边数(见图p6-2);输入量是“非自然数”时,给出“出错提示”。
此外,函数M文件应有H1行、帮助说明和程序编写人姓名。
(提示:
nargin,error,int2str)
图p6-1
图p6-2
3.用泛函指令fminbnd求
在x=0附近的极小值。
fminbnd的第一个输入量要求使用匿名函数表达。
(提示:
注意搜索范围的选择;假如极值在边界附近,进一步扩大搜索范围是合理的选择。
)
4.在matlab的\toolbox\matlab\elmat\private文件夹上有一个“烟圈矩阵”发生函数smoke.m。
运行指令smoke(3,0,'double'),将生成一个3阶伪特征根矩阵如下
A=
-0.5000+0.8660i1.00000
0-0.5000-0.8660i1.0000
1.000001.0000
现在的问题是:
在MATLAB当前目录为\work情况下,如何利用函数句柄调用smoke.m函数,产生3阶伪特征根矩阵。
请写出相应的程序或操作步骤。
(提示:
注意函数句柄创建的有效性;若想编写能完全自动执行的解题程序,注意使用cd,pwd,which,及字符串的拆分、合并操作技术。
)