ch6编程Word格式.docx
- 文档编号:3098084
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:21
- 大小:66.30KB
ch6编程Word格式.docx
《ch6编程Word格式.docx》由会员分享,可在线阅读,更多相关《ch6编程Word格式.docx(21页珍藏版)》请在冰点文库上搜索。
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%
elseiff0-fmin>
1e-6%
f0=fmin;
jj=1;
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)
最终子区间分割数为%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)
【例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>
%根据学生的分数,求出相应的等级。
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】创建Hilbert矩阵。
1)
K=5;
A=zeros(K,K);
form=1:
K%
forn=1:
K%
A(m,n)=1/(m+n-1);
formatrat
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)
%
tic%
K=1000;
K
A1(m,n)=1/(m+n-1);
t1=toc%
t1=
17.434
tic
A2=zeros(K,K);
A2(m,n)=1/(m+n-1);
t2=toc
t2=
2.1895
4)产生Hilbert矩阵的数组化编程将大大提高运行速度
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整除的偶数。
2)
function[A,n]=exm060104_ZZY(n)
%exm060104_ZZY.m
%A
%n
clc
while1%<
4>
ifmod(n,4)==0%<
5>
break
else
n=input('
请输入一个能被4整除的正整数!
n='
);
%<
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%
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是魔方矩阵。
'
)
经验证,A不是魔方矩阵。
end
12阶魔方矩阵的标称和是870
●关于魔方矩阵的说明:
⏹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'
)
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;
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>
2
输出量太多。
S=N*R*R*sin(2*pi/N)/2;
%
L=2*N*R*sin(pi/N);
%
fill(x,y,str)%
axisimage%
set(gcf,'
Color'
white'
)%
boxon
shg
[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函数绘图文件。
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)
circle'
plot(x,y,'
8),
axissquareoff
error('
输入宗量只能取'
或'
!
shg
HH=exm060301('
HH=
@cirline
图6.3-1
t=0:
2*pi/5:
x=cos(t);
y=sin(t);
HH('
x,y,t)%
图6.3-2
.3.3匿名函数(Anonymousfunction)
(1)
(2)
.4函数句柄
.4.1函数句柄的创建和观察
【例6.4-1】
hm=@magic
hm=
@magic
class(hm)
isa(hm,'
function_handle'
ans=
function_handle
1
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】
[S,L]=exm060201(3,2,'
-r'
)%
5.1962
图6.4-1
Hexm=@exm060201,%
Hexm=
@exm060201
which('
exm060201'
notfound.
5)
?
Undefinedfunction'
forinputargumentsoftype'
double'
.
6)
[S,L]=Hexm(3,2,'
)%
.
图6.4-2
【例6.4-3】
clear
Hexm_2=@exm060201
Hexm_2=
class(Hexm_2)
isa(Hexm_2,'
[S,L]=Hexm_2(3,2,'
习题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.bingdoc.com/images/bang_tan.gif)