【良心出品】MATLAB实验五《 M文件和函数句柄》
MATLABM文件与M函数
M文件与M函数Matlab输入命令的常用方式有两种:一种是直接在Matlab的命令窗门中逐条输入Matlab 命令;二是m文件工作方式。
当命令行很简单时,使用逐条输入方式还是比较方便的。
但当命令行很多时(比如说几十行乃至全成百上千行命令),显然再使用这种方式输入MATLAB 命令,就会显得杂乱无章,不易于把握程序的具体走向,并且给程序的修改和维护带来了很大的麻烦。
这时,建议采用Matlab命令的第二种输入形式m文件工作方式。
m文件工作方式,指的是将要执行的命令全部写在一个文本文件中,这样既能使程序显得简洁明了,又便于对程序的修改与维护。
m文件直接采用Matlab命令编写,就像在Matlab的命令窗口直接输入命令一样,因此调试起来也十分方便,并且增强了程序的交互性。
m文件与其他文本文件一样,可以在任何文本编辑器中进打编辑、存储、修改和读取。
利用m文件还可以根据白己的需要编写一些函数,这些函数也可以橡Matlab提供的函数一样进行调用。
从某种意义上说,这也是对MA TLAB的二次开发。
m文件有两种形式:一种是命令方式或称脚本方式;另一种就是函数文件形式。
两种形式的文件扩展名均是.m。
1、M文件当遇到输入命令较多以及要重复输入命令的情况时,利用命令文件就显得很方便了。
将所有要执行的命令按顺序放到一个扩展名为.m的文本文件中,每次运行时只需在MATLAB 的命令窗口输入m文件的文件名就可以了。
需要注意的是,m文件最好直接放在Matlab的默认搜索路径下(一般是Matlab安装目录的子目录work中),这样就不用设置m文件的路径了,否则应当用路径操作指令path重新设置路径。
另外,m文件名不应该与Matlab的内置函数名以及工具箱中的函数重名,以免发生执行错误命令的现象。
Matlab对命令文件的执行等价于从命令窗口中顺序执行文件中的所有指令。
命令文件可以访问Matlab工作空间里的任何变量及数据。
命令文件运行过程中产生的所有变量都等价于从Matlab工作空间中创建这些变量。
【良心出品】MATLAB实验五《M文件和函数句柄》
【良心出品】MATLAB实验五《M文件和函数句柄》实验五 M 文件和函数句柄一、实验目的1、掌握M 文件的编写方法。
2、熟练掌握MATLAB 的五种程序控制流结构。
3、掌握M 函数文件的一般结构。
4、了解函数句柄的创建、观察及基本使用方法。
二、实验主要仪器与设备装配有MA TLAB7.6软件的计算机三、预习要求做实验前必须认真复习第六章M 文件和函数句柄。
四、实验内容及实验步骤1、已知函数??≤<≤--<=+-x e x xx xy x 111113,编写能对任意一组输入x 值求相应y 值的程序,并验证运行结果。
(1)编写M 函数文件function y=exm060101(x)% y=exm060101(x) Function calculate of example n=length(x); for k=1:n if x(k)<-1 y(k)=x(k); elseif x(k)>=1 y(k)=exp(1-x(k)); elsey(k)=x(k)^3; endend(2)把文件exm060101.m 放置在搜索路径上(3)运行以下指令x=[-2,-1,-1.2,-0.4,0.8,1,6] y=exm060101(x) 运行结果: x =-2.0000 -1.2000 -0.4000 0.8000 1.0000 6.0000y =-2.0000 -1.2000 -0.0640 0.5120 1.0000 0.00672、已知学生的名字和百分制分数。
要求根据学生的百分制分数,分别采用“满分”、“优秀”、“良好”、“及格”、“不及格”等表示学生的学习成绩。
试用switch结构编程实现。
clear;%定义分数段:满分(100),优秀(90-99),良好(80-89),及格(60-79),不及格(<60)。
for k=1:10a(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','T om'};A(2,:)={72,83,56,94,100};for k=1:5switch A{2,k}case 100r='满分';case ar='优秀';case br='良好';case cr='及格';otherwiser='不及格';endA(3,k)={r};endA运行结果:A ='Jack' 'Marry' 'Peter' 'Rose' 'Tom'[ 72] [ 83] [ 56] [ 94] [ 100]'及格' '良好' '不及格' '优秀' '满分'3、试用for 循环结构创建Hilbert 矩阵。
6.M文件和函数句柄
本章内容
6.1 6.2 6.3 6.4
MATLAB控制流 脚本文件和函数文件 MATLAB的函数类别 函数句柄
MATLAB程序及其作用
从总体上说,单独的MATLAB指令,及由若干 指令构成的孤立表达式,只能解算或仿真简单 理论数学模型所描述的问题 复杂些的问题通常需要用一组理论数学算式, 这些问题的解算及仿真就需要借助较复杂的 MATLAB程序进行 这种MATLAB程序由较多的MATLAB指令和多 种多样的MATLAB表达式组成,并循着一定的 执行次序运行 这种程序的扩展名为.m,这就是脚本M文件或 函数M文件
6.2.1 M脚本文从指令窗中直接输 入指令进行计算是十分轻松简单的事 但随指令数的增加,或随控制流复杂度的增加, 或重复计算要求的提出,直接从指令窗进行计 算就显得烦琐
此时脚本文件最为适宜
“脚本”本身反映这样一个事实:MATLAB只 是按文件所写的指令执行 关于M脚本文件的编写,请参见1.8节
H1行:以%开头,后面是大写体的函数文件 名和运用关键词简要描述的函数功能,供 lookfor和help指令在线帮助使用 在线帮助文本区:包括函数输入输出宗量的 含义,调用格式说明 编写和修改记录:说明编写及修改该M文件 的作者和日期、版本记录
6.2.4 M函数文件的一般结构
函数体
由实现该M函数文件功能的MATLAB指令组 成,它接受输入量,进行程序流控制,创建 输出量
课堂练习
习题6
2
6.3 MATLAB函数类别
MATLAB的M文件分为M脚本文件和M函 数文件 函数Function又被细分为主函数、子函数、 嵌套函数、私用函数、匿名函数等 本节介绍为主函数、子函数、匿名函数
第六讲M文件和函数句柄
-4-
例 6.2.4 用 for 循环指令来求 Fibonacci 数列中第一个大于 10000 的元素 n=100;a=ones(1,n); for k=3,n a(k)=a(k-1)+a(k-2); if a(k)>=10000 a(k), break; % 跳出所在的一级循环 end; end,k ans = 10946 k= 21
6.2.4 switch-case 结构
switch ex ex 为一标量或字符串。 case test1 (commands 1) 当 ex 等于 test1 时,执行组命令 1,然后跳出该结构。 case test2 …… case testk (commands k) 当 ex 等于 testk 时,执行组命令 k,然后跳出该结构。 otherwise otherwise 指令可以不存在 (commands) 表达式不等于前面所有检测值时,则执行该组命令。 end [说明] (1)当遇到 switch 结构时,MATLAB 将表达式的值依次和各个 case 指令后面的检测值进 行比较。如果比较结果为假,则取下一个检测值再比较,一旦比较结果为真,MATLAB 将 执行相应的一组命令,然后跳出该结构。如果所有的比较结果都为假,即表达式的值和所有 的检测都不等,MATLAB 将执行 otherwise 后面的一组命令。由此可见上述结构保证了至少 有一组命令会得到执行。 (2)switch 指令后面的表达式应为一个标量或者为一个字符串。对于标量形式的表达式, 比较这样进行:表达式 = = 检测值 i。而对于字符串,MATLAB 将调用函数 strcmp 来实现 比较:strcmp(表达式,检测值 i) 。 (3)case 指令后面的检测值不仅可以为一个标量值或一个字符串,还可以为一个元胞数组。 如果一个检测值是一个元胞数组,MATLAB 将把表达式的值和该元胞数组中的所有元素进 行比较;如果元胞数组中某个元素和表达式的值相等,MATLAB 认为此次比较结果为真, 从而执行与该检测值相应的一组命令。 例 6.2.5 将百分制的学生成绩转换为五级制的成绩 x=input('请键入学生成绩:'); switch fix(x/10) case {10,9} f='A'
MATLAB m文件和函数
Matlab与系统仿真
h
22
➢ 例:
>> t=0:0.1:2*pi; >> y1=sin(t); >> y2=cos(t); >> y3=sin(t).*cos(t); >> plot(t,y1,'-',t,y2,':g',t,y3,'xk')
Matlab与系统仿真
h
23
思考:但很多实验情况下,实际上是对同一个变量进行测 量,并将数据进行绘图比较。
➢ subplot(m,n,p) :将当前窗口分割成m行、n列,并且 当前在其中的第p个区域绘图。
➢ 绘图区域编号原则:“从左到右,从上到下”。
➢ 允许每个子窗口不同的坐标系。
Matlab与系统仿真
h
26
➢ 例:
subplot(3,2,2) t=0:0.1:2*pi; y1=sin(t); plot(t,y1,'-')
Matlab与系统仿真
h
5
例1 :
>>t=0:0.1:pi; >>plot(t)
Matlab与系统仿真
h
6
例2 :绘制出一个周期内的正弦曲线
*语句命令及绘图结果:
>>t=0:0.1:2*pi; >>y=sin(t); >>plot(t,y)
Matlab与系统仿真
h
7
例3 :
>> t=0:0.1:2*pi; >> y1=sin(t); >> y2=cos(t); >> y3=sin(t).*cos(t); >> plot(t,y1,'-')
第6章 M文件和函
©通信与电子工程学院
MATLAB语言 电子教案
(2)在指令窗中运行 [S,L]=exm060201(6,2,'-g') S= 1 10.3923 L= 0.5 12.0000
改变输入输出参数 观察运行结果
0
-0.5
-1 -1
-0.5
0
0.5
1
©通信与电子工程学院
MATLAB语言 电子教案
6.3 MATLAB的函数类别
MATLAB语言 电子教案
2 、 while 语句的一般格式 while (条件)
commands (循环体语句) end 其执行过程为:若条件成立,则执行循 环 体语句,执行后再判断条件是否成立, 如 果不成立则跳出循环
©通信与电子工程学院
MATLAB语言 电子教案
a(1)=1; a(2)=1; i=2; while a(i)<=10000 a(i+1)=a(i-1)+a(i); i=i+1; end; i,a(i)
error('输入宗量只能取 ''line'' 或 ''circle'' ! ')
end shg
©通信与电子工程学院
MATLAB语言 电子教案
3.匿名函数(Anonymous function)
4.函数句柄 函数句柄(Function handle)是MATLAB 的一种数据类型。它使“函数调用”象“变量 调用”一样灵活方便;提高函数调用速度。
【例6.2-1】编写一个M函数文件。 它具有以下功能: (A)根据指定的半径,画出蓝色圆周线; (B)可以通过输入字符串,改变圆周线的颜色、线 型; (C)假若需要输出圆面积,则绘出圆。
第六章 M文件和函数句柄
例7.4-2 assignin 运作机理示范 function y=xyq(x) y=sqrt(x);t=x^2; assignin('base','yy',t)
将当前工作空间变量t的 值跨空间赋给变量yy 运行结果: 运行结果 x y yy 4 2 16
H1行,lookfor和help查询用 • 脚本文件包括两部分:注释部分和程序部分 文件包括两部分: %RANK Number of linearly independent rows or columns. % K = RANK(X) is the number of singular values of X % that are larger than MAX(SIZE(X)) * NORM(X) * EPS. % K = RANK(X,tol) is the number of singular values of X that % are larger than tol. help文本区 % Copyright (c) 1984-94 by The MathWorks, Inc. 全局变量 global abc; 局部变量 s = svd(x); if (nargin == 1) tol = max(size(x)) * max(s) * eps; end r = sum(s > tol);
y(1,k)=eval([CEM{k},'(',num2str(theta),')']); disp([CEM{k},'(',num2str(theta),')',… blanks(6),num2str(y(1,k))]); end
MATLAB函数句柄和M文件
MATLAB函数句柄和M文件第 6 章M 文件和函数句柄6.1 Matlab控制流6.2 脚本文件和函数文件6.3 Matlab的函数类别6.4 函数句柄6.1 MATLAB 控制流6.1.1 if-else-end 条件控制6.1.2 swith-case 控制语句6.1.3 for 循环和while 循环6.1.4 控制程序流和的其他常用指令6.1.1 if-else-end 条件控制0.1x 2例 6.1-1 】已知y e sin x 0.5(x 0.1) sin x ,在50 x 5 区间,求函数的最小值。
回顾与复习 :[x,fval,exitflag,output]=fminbnd(fun,x1,x2,options) 求一元函数在区间 (x1, x2)中极小值在第四章中采用的方法( 1)采用优化算法求极小值 x1=-50;x2=5; % yx=@(x)(sin(x)^2*exp(-0.1*x)-0.5*sin(x)*(x+0.1)); [xc0,fc0,exitflag,output]=fminbnd(yx,x1,x2)<9>%( 2)据图形观察,重设 fminbnd 的搜索区间 xx=[-23,-20,-18];%fc=fc0;xc=xc0; % for k=1:2[xw,fw]=fminbnd(yx,xx(k),xx(k+1)); <16> if fw<fc xc=xw; fc=fw; end endfprintf(' 函数最小值 %6.5f 发生在 x=%6.5f 处 ',fc,xc) 函数最小值 -3.34765 发生在 x=-19.60721 处1)function [xmin,fmin,n]=exm060101(fx,a,b,Nt) % exm060101.m2sin(x) /exp(x/10) - (sin(x) (x + 1/10))/2-50-45 -40 -35 -30 -25-20 -15 -10 -5x70 6050 40 30 2010[~,f0]=fminbnd(fx,a,b); % n=1; jj=1;%% while 1n=2*n; %d=(b-a)/n;% x=a:d:b;%ii=0;xc=zeros(1,n);fc=xc; %for k=1:n %[w,f,eflag]=fminbnd(fx,x(k),x(k+1)); % if eflag>0 % ii=ii+1; xc(ii)=w; fc(ii)=f; end end[fmin,kk]=min(fc); % xmin=xc(kk); % if abs(f0-fmin)<1e-6 % jj=jj+1; % if jj>Nt %break % endelseif f0-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 最终子区间分割数为 1286.1.2 switch-case 控制结构% fx % a 、 b % Nt % xmin【例 6.1-2】已知学生姓名和百分制分数,用“满分” ,优秀、良好、及格和不及格表示学生成绩clear;%for k=1:10a(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'表 6.1-3 循环结构的使用方式【例 6.1-3 】请分别写出用 for 和 while 循环语句计算 1000000K 0.2i 1 0.2 0.22 0.21000000的程序。
MATLAB 07_M文件,函数句柄
M文件和函数句柄一、概念1、编程的概念2、向量化编程与数据流控制二、知识点1、编程基础(1)程序的基本构件:变量、运算符、标点符号、关键词(字)、特殊值(预定义变量)、MATLAB函数(内建函数、M文件函数、重载函数)(2)数据流控制(3)M文件的基本类型2、编写复杂程序必须的组件和技术(1)函数:主函数、子函数、嵌套函数、匿名函数(2)对象:内联对象(3)句柄:直接句柄、匿名句柄(4)泛函指令:eval、feval(5)变量的使用域(6)跨内存调用和赋值3、三、命令、函数列表四、练习题1、【7.2.1】for循环和while循环控制2、3、【例7.2-3】对于预先指定的控制精度ε,求∑∑===N n n k k S 111,其中N 要满足约束⎪⎪⎭⎪⎪⎬⎫⎪⎪⎩⎪⎪⎨⎧≤=∑=εN k k N 11min arg 。
4、5if-elseif-else 条件分支控制【例7.2-5】借助“if-else 条件分支控制”编写M 码,以实现式(7.2-1)分域函数的可视化(参见图7.2-5)。
⎪⎪⎩⎪⎪⎨⎧>+≤+<--≤+=-----+-- 15457.0 117575.015457.0),(5.175.375.065.175.375.0222222y x e y x e y x e y x z x x y x y x x y(7.2-1)6try-catch容错控制【例7.2-6】对MATLAB初学者来说,易混淆plot和ezplot的不同适用场合:前者只适于“离散数值数据”表达的曲线绘制;后者则适于“函数解析式”表达的曲线绘制。
本例将利用try-catch结构的意外警示(Throw an Exception)及意外处理(Handle an Exception)的能力,编写一个具备plot全部功能,7M文件【例7.3-1】编写一个M函数文件。
它具有以下功能:(A)根据指定的半径,画出蓝色圆周线;(B)可以通过输入字符串,改变圆周线的颜色、线型;(C)假若需要输出圆面积,则绘出圆。
matlabm文件和函数句柄PPT课件
>> EPS=1; >> for num=1:1000
EPS=EPS/2; if (1+EPS)>1
continue end EPS=EPS*2 break end EPS = 2.2204e-016 >> num num = 53
第11页/e结构
switch ex
第4页/共37页
>> data=[3 9 45 6; 7 16 -1 5] data =
3 9 45 6 7 16 -1 5 >>for n=data x=n(1)-n(2) end; x= -4 x= -7 x= 46 x= 1
第5页/共37页
>>for n=1:5 for m=5:-1:1 A(n,m)=n^2+m^2; end disp(n)
end 1 2 3 4 5 >>A A= 2 5 10 17 26 5 8 13 20 29 10 13 18 25 34 17 20 25 32 41 26 29 34 41 50
第6页/共37页
>> n=1:10; >>x=sin(n*pi/10) x= Columns 1 through 7 0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090 Columns 8 through 10 0.5878 0.3090 0.0000
nargin('fun') 获取'fun'指定函数的标称输入参量数
nargout('fun') 获取'fun'指定函数的标称输出参量数
inputname(n) 在函数体内使用,给出第 n个输入参量 的实际调用变量名
M文件和函数句柄
1.expr作为控制其下分支的条件表达式,通常是关系、 逻辑运算构成的表达式,该表达式的结果是“标量逻 辑值1或0”。 2. expr也可以是一般代数表达式,任何非零值的作用 等同于“逻辑1”。
3. expr可以是数组之间的关系、逻辑运算。 只有逻辑数组全为1时,该 expr控制的分支才 能执行。 4.当expr为数值数组时,只有当该数组不包含 任何零元素时,expr控制的分支才能执行。 5.如果expr为空数组,MATLAB认为条件为 假(false),则该expr控制的分支不被执行。 例6.1-1
第六章 M文件和函数句柄
前言
为什么要引入M文件?
1.复杂的问题需要较复杂的MATLAB程序 进行解算。如求0.2的10000次方的累加。 2. 通用的程序不能也不必每次都写,应该 有一段程序表达这个通用的算法,称为函 数。
sum, abs, filter, fourier, plot,…
关于M文件的明:
6.2 脚本文件和函数文件 6.2.1 M脚本文件 M脚本文件是一串按用户意图排列而成的 MATLAB指令(如命令/函数调用、数组操作、 控制指令)的组合,如同命令行方式分步键 入的命令,执行效果相同,生成的变量都在 workspace中,和命令行方式不同的是这些脚 本并不在历史命令窗中出现。
6.2.2 M函数文件 函数文件供别的程序调用完成某种功能, 有输入和输出结果,内部运算一般不公开, 有自己的独立运行空间,函数用到的中间变 量也不在workspace中保存。 注意:编写完函数文件后,不能直接点击run 执行。因为执行函数需要调用参数,而直接 点击不能传参数,一般通过脚本、命令行或 别的函数间接调用。
continue 在循环体中,跳出当前迭代,直接进入 下一次迭代。
第七章 M文件和函数句柄
在逻辑表达式中,作为输入的任何非 0 实数都被看作是 “逻辑真”,只有 0 才被认为是“逻辑假”。
标量(一个数)可以与任何维数组进行逻辑运算。运算在 标量与数组每个元素间进行。
当两个数组进行逻辑运算时,参与运算的数组必须维数相 同,运算在两数组相同位置上的元素间进行。
(3)Short-Circuit 逻辑运算
(1)两个标量(双精度实数)之间的关系运算
关系运算符 说明
<
小于
<= 小于等于
>
大于
>= 大于等于
== 等于
~= 不等于
举例 3<2 3<=2 3>2 3>=2 3==2 3~=2
返回结果 0 0 1 1 0 1
(2)两个数值数组之间的关系运算
进行比较的两个数组必须维数相同,比较在两数组相同 位置上的元素间进行,返回一个由0和1组成的“逻辑数组” 。
Matlab 程序设计基础
一、逻辑数据、关系运算、逻辑运算 二、程序控制语句 三、M函数
一、逻辑数据、关系运算、逻辑运算
1、逻辑类型的数据和函数 2、关系运算 3、逻辑运算 4、运算优先级
1、逻辑类型的数据和函数
逻辑类型的数据主要用于选择(判断)结构,在Matlab 中,也可用来作为数组元素的“逻辑索引”。用 1 表示逻辑“ 真”(true),用 0 表示逻辑“假”(false)。
(2) ture( ) 和 false( ) :创建逻辑类型的数据
用ture( )和false( )函数可以创建逻辑类型的数据
true :
即 logical (1)
true(n) : 逻辑1组成的n×n二维数组
true(m, n) :逻辑1组成的m×n二维数组
第六章_MatlabM文件和函数句柄
3) continue
跳过位于其后的循环中的其他指令,执行循环的下一个迭代 例 更改数组中的值
a=ones(1,12);count=0;s=0; for k=1:12 if rem(k,3)==0 continue break else s=s+k; end count = count + 1; end count = 8
●当遇到switch结构时, matlab将表达式的值依次和各个case指 令后面的检测值进行比较.如果比较结果为假,则取下一个检测值再 比较,一旦比较结果为真, matlab将执行相应的一组命令,然后跳出 该结构。如果所有的比较结果都为假,即表达式和所有的检测值都 不等, matlab将执行otherwise后面的一组命令.可见该结构保证 至少有一组命令会得到执行。
6.2 脚本文件 和函数文件
m文件的语法类似于c语言,但又有其自身特点。它 只是一个简单的ASCII码文本文件,执行程序时逐行 解释运行程序。 m文件有两类独立的m文件 — 称脚本文件
可调用m文件 — 称函数文件
6.2.1 脚本文件
脚本文件 — 简单的m文件 脚本文件实际上是一串指令的集合,与在命令窗口 逐行执行文件中的所有指令,其结果是一样的。没 有输入输出参数。 运行产生的所有变量驻留在基本工作空间。
Matlab教程之M文件和函数句柄
第 6 章 M 文件和函数句柄从总体上说,单独的MATLAB 指令,及由若干指令构成的孤立表达式,只能解算或仿真简单理论数学模型所描述的问题。
复杂些的问题通常需要用一组理论数学算式。
这些问题的解算及仿真就需要借助较复杂的MATLAB 程序进行。
这种MATLAB 程序由较多的MATLAB 指令和多种多样的MATLAB 表达式组成,并循着一定的执行次序运行。
这种程序的扩展名为m 。
这就是脚本M 文件或函数M 文件。
本章系统介绍编写MATLAB 程序时最常用到的四种控制结构、M 函数文件的构造、主函数、子函数以及匿名函数。
最后一节专门叙述函数句柄的创建、观察和调用。
6.1 MATLAB 控制流作为一种计算机编程语言,MATLAB 提供了多种用于程序流控制的描述关键词(Keyword )。
本节只介绍其中最常用的条件控制(if, switch )和循环控制(for, while, continue, break )。
由于MATLAB 的这些指令与其它语言相应指令的用法十分相似,因此本节只结合MATLAB 给定的描述关键词,对这四种指令进行简要的说明。
6.1.1if-else-end 条件控制if-else-end 指令为程序流提供了一种分支控制,它最常见的使用方式见表6.1-1。
【例6.1-1】已知函数xx x e xx y x ≤<≤--<⎪⎩⎪⎨⎧=+-111113,编写能对任意一组输入x 值求相应y 值的程序。
(1)function y=exm060101(x)% y=exm060101(x) Function calculate of example 6.1-1n=length(x); for k=1:n if x(k)<-1y(k)=x(k);elseif x(k)>=1y(k)=exp(1-x(k));elsey(k)=x(k)^3;endend(2)(3)x=[-2,-1.2,-0.4,0.8,1,6]y=exm060101(x)x =-2.0000 -1.2000 -0.4000 0.8000 1.0000 6.0000y =-2.0000 -1.2000 -0.0640 0.5120 1.0000 0.00676.1.2switch-case控制结构【例6.1-2】已知学生的名字和百分制分数。
MATLAB函数句柄和M文件要点
第 6 章 M 文件和函数句柄6.1 Matlab 控制流6.2 脚本文件和函数文件 6.3 Matlab 的函数类别 6.4 函数句柄6.1 MATLAB 控制流6.1.1 if-else-end 条件控制 6.1.2 swith-case 控制语句 6.1.3 for 循环和while 循环6.1.4 控制程序流和的其他常用指令6.1.1 if-else-end 条件控制【例 6.1-1】已知x x x e y x si n )1.0(5.0si n 21.0+-=-,在505x -≤≤区间,求函数的最小值。
-50-45-40-35-30-25-20-15-10-55010203040506070x sin(x)2/exp(x/10) - (sin(x) (x + 1/10))/2在第四章中采用的方法(1)采用优化算法求极小值x1=-50;x2=5; %yx=@(x)(sin(x)^2*exp(-0.1*x)-0.5*sin(x)*(x+0.1)); [xc0,fc0,exitflag,output]=fminbnd(yx,x1,x2)%<9>%(2)据图形观察,重设fminbnd 的搜索区间 xx=[-23,-20,-18]; % fc=fc0;xc=xc0; % for k=1:2[xw,fw]=fminbnd(yx,xx(k),xx(k+1)); %<16>if fw<fc xc=xw; fc=fw; end endfprintf('函数最小值%6.5f 发生在x=%6.5f 处',fc,xc) 函数最小值-3.34765发生在x=-19.60721处 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; %while 1n=2*n; %d=(b-a)/n; %x=a:d:b; %ii=0;xc=zeros(1,n);fc=xc; %for k=1:n %[w,f,eflag]=fminbnd(fx,x(k),x(k+1)); %if eflag>0 %ii=ii+1;xc(ii)=w;fc(ii)=f;endend[fmin,kk]=min(fc); %xmin=xc(kk); %if abs(f0-fmin)<1e-6 %jj=jj+1; %if jj>Nt %break %endelseif f0-fmin>1e-6 %f0=fmin; %jj=1; %endend2)clearfx=@(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最终子区间分割数为 1286.1.2switch-case控制结构【例6.1-2】已知学生姓名和百分制分数,用“满分”,优秀、良好、及格和不及格表示学生成绩clear;%for k=1:10a(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> %for k=1:5switch A{2,k} % case 100 % r='满分'; case a % r='优秀'; case b % r='良好'; case c % r='及格'; otherwise %r='不及格'; endA(3,k)={r}; end AA ='Jack' 'Marry' 'Peter' 'Rose' 'Tom' [ 72] [ 83] [ 56] [ 94] [100]'及格' '良好' '不及格' '优秀' '满分'6.1.3 for 循环和while 循环【例 6.1-3】请分别写出用for 和while 循环语句计算1000000210000002.02.02.012.0+++==∑= i i K 的程序。
第六章 M文件和函数句柄
使用循环结构,在循环指令之前应尽量对数组进行预定义 使用循环结构 在循环指令之前应尽量对数组进行预定义
● 由于 和j是预定义变量 作虚单位使用 建议不作为循环变量 由于i和 是预定义变量 作虚单位使用.建议不作为循环变量 是预定义变量,作虚单位使用
5
(2) while循环结构 循环结构 while expression (command) end 说明: 说明:
%(和一维数组冒号法定义相同 和一维数组冒号法定义相同) 和一维数组冒号法定义相同 % 循环体 % i, j虚数单位,尽量不用 虚数单位, 虚数单位
例7.1-1 for循环示例 循环示例
for ii=1:10 x(ii)=ii; end
x= 1 2 3 4 5 6 7 8 9 10
2
多重循环生成9x9乘法表 例7.1-2 多重循环生成 乘法表
% 划分区域:满分 划分区域:满分(100),优秀 优秀(90-99),良好 良好(80-89),及格 及格(60-79),不及格 不及格(<60) 优秀 良好 及格 不及格
for k=1:1:10 a(k)=89+k; b(k)=79+k; c(k)=69+k; d(k)=59+k; end
% 90-99 % 80-89 % 70-79 % 60-69
表达式为真? 表达式为真? Y 执行组命令 N 退出循环
数组元素满足规则: 例7.1-3 fibonacci数组元素满足规则:ak+2=ak+ak+1,(k=1,2,…); 数组元素满足规则 求出该数组中第一个大于10 且a1=a2=1.求出该数组中第一个大于 000的元素 求出该数组中第一个大于 的元素
4
Matlab北航教程 第七章 M文件和函数句柄
commands是一组合法的matlab指令集 只要expr的值不为0, (commands)将 被重复执行。 while循环体的执行次数事先不确定 当expr为数组时,只有其全部元素非0 时循环体才被执行。 expr的常见形式:
expr1<(<=,>,>=)a1|(&)expr2<(<=,>,>=)a2
四、switch-case结构 调用方法: switch expr(标量或字串) case t1 (commands1) case t2 (commands2) …… case tn (commandsn) ortherwise (commands) end
switch-case结构的执行过程: 依次将expr的值与检验值t1,t2,…,tn比较,哪 项比较为真,则执行该项检验值后的语句,若 全部为假,则执行otherwise后的语句。 注意:各检验值t1,t2,…,tn可以是元胞数组,此 时只要元胞数组中有一个元素与expr相同,则 比较为真。例7.2-5 五、try-catch结构 调用方法: try (commands1) catch (commands2)
step in:进入被调用的函数内部 step out:从被调用函数返回 3.text菜单下的evaluate用于查看选中变量 的当前值 CH7.2 MATLAB的控制流 根据某些判断结构来控制程序语句的执行次序 matlab提供了五种控制程序流程的结构 for循环 while循环 Matlab控制流结构 if-else-end分支结构 switch-case结构 try-catch结构
(1)指令窗中运行edit filename (2)工具条上的“open”图表 (3)指令窗中的【File ;Open】菜单 3.编辑文件 (1)edit菜单下:拷贝、粘贴、查找、替换 (2)text菜单下:注释、取消注释、缩进 调试功能 1.breakpoint菜单或工具条上的设置断点功 能,用于分段调试程序或重点调试某程序 段。常与debug中的run配合使用。 2.debug菜单下的执行功能。 1)run/continue:运行到断点 2)单步运行:step,step in,step out
第六章 matlab的m文件和函数句柄
m文件编辑器缺省设置是 c:\windows\notepad.exe 还可设成:c:\windows\write.exe c:\windows\command\ c:\program file\office\winword.exe 注意:所创建的m文件必须纳入matlab搜索路 径后,才能在matlab命令窗口运行。
当前状态值
S函数与函数m文件类似,只是输入、输出变量是 限定的。
(5). 函数句柄 函数句柄优点:
方便地实现函数间互相调用
兼容函数加载的所有方式
拓宽子函数包括局部函数的使用范围
提高函数调用的可靠性
减少程序设计中的冗余
提高重复执行的效率 数组、结构数组、细胞型数组结合定义数据
命令文件包括两部分:注释文件和程序文件 %RANK Number of linearly independent rows or columns. % K = RANK(X) is the number of singular values of X % that are larger than MAX(SIZE(X)) * NORM(X) * EPS. % K = RANK(X,tol) is the number of singular values of X that % are larger than tol. % Copyright (c) 1984-94 by The MathWorks, Inc. %奇异值分解 s = svd(x); if (nargin == 1) tol = max(size(x)) * max(s) * eps; 程序部分 end r = sum(s > tol);
函数句柄的创建和显示 定义函数句柄的定义只需在提示符@后添加相应 函数的函数名 f_h=@plot f_h = @plot 函数句柄的内容通过functions显示 functions(f_h) ans = function: 'plot' type: 'overloaded' file: 'MATLAB built-in function' methods: [1x1 struct]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五 M 文件和函数句柄
一、实验目的
1、掌握M 文件的编写方法。
2、熟练掌握MATLAB 的五种程序控制流结构。
3、掌握M 函数文件的一般结构。
4、了解函数句柄的创建、观察及基本使用方法。
二、实验主要仪器与设备
装配有MA TLAB7.6软件的计算机
三、预习要求
做实验前必须认真复习第六章M 文件和函数句柄。
四、实验内容及实验步骤
1、已知函数⎪⎩
⎪⎨⎧≤<≤--<=+-x e x x
x x
y x 11111
3
,编写能对任意一组输入x 值求相应y 值的程序,
并验证运行结果。
(1)编写M 函数文件 function y=exm060101(x)
% y=exm060101(x) Function calculate of example n=length(x); for k=1:n if x(k)<-1 y(k)=x(k); elseif x(k)>=1 y(k)=exp(1-x(k)); else
y(k)=x(k)^3; end
end
(2)把文件exm060101.m 放置在搜索路径上 (3)运行以下指令
x=[-2,-1,-1.2,-0.4,0.8,1,6] y=exm060101(x) 运行结果: x =
-2.0000 -1.2000 -0.4000 0.8000 1.0000 6.0000
y =
-2.0000 -1.2000 -0.0640 0.5120 1.0000 0.0067
2、已知学生的名字和百分制分数。
要求根据学生的百分制分数,分别采用“满分”、“优秀”、“良好”、“及格”、“不及格”等表示学生的学习成绩。
试用switch结构编程实现。
clear;
%定义分数段:满分(100),优秀(90-99),良好(80-89),及格(60-79),不及格(<60)。
for k=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'};
A(2,:)={72,83,56,94,100};
for k=1:5
switch A{2,k}
case 100
r='满分';
case a
r='优秀';
case b
r='良好';
case c
r='及格';
otherwise
r='不及格';
end
A(3,k)={r};
end
A
运行结果:
A =
'Jack' 'Marry' 'Peter' 'Rose' 'Tom'
[ 72] [ 83] [ 56] [ 94] [ 100]
'及格' '良好' '不及格' '优秀' '满分'
3、试用for 循环结构创建Hilbert 矩阵。
K=5;
A = zeros(k,k); for m = 1:K
for n = 1:K
A(m,n)=1/(m+n-1) ;
end end format rat A
format short g 运行结果: A =
1 1/
2 1/
3 1/
4 1/
5 1/2 1/3 1/4 1/5 1/
6 1/3 1/4 1/5 1/6 1/
7 1/4 1/5 1/6 1/7 1/
8 1/5 1/6 1/7 1/8 1/9
4、编写计算∑∑===N
n n k k S 111,其中⎪⎪⎭
⎪
⎪⎬⎫
≤⎪⎪⎩⎪⎪⎨⎧=∑=ε
N k k N 1
1
min arg ,ε是预先 给定的控制精度。
使用while 循环结构编程实现。
(1)编写M 函数文件exm060104(x)
function [S,N]=exm060104(epsilon) k=0; s=0; d=inf; S=0;
while d>epsilon
k=k+1;
s=s+k; d=1/s;
S=S+d;
end N=k;
(2)把文件exm060104.m保存在处于MATLAB搜索路径的文件夹中。
(3)运行以下指令(控制精度假设取0.0001)
[S,N]=exm060104(0.0001)
运行结果:
S =
1.9859
N =
141
五、实验报告与思考题
说明M函数文件的一般结构。
(1)函数申明行(function declaration line):位于函数文件的首行;以MATLAB
关键字function开头;函数名以及函数的输入/输出量名都在这一行被定义.
(2)H1行(the first help text line):紧随函数申明行之后以%开头的第一注释行;
按MA TLAB自身文件的规则,H1行包含大写体的函数文件名和运用关键词
简要描述的函数功能。
该H1行提供lookfor关键词查询和help在线帮助使用。
(3) 在线帮助文本(help text)区:H1行及其之后的连续的一%开头的所有注释
行构成整个在线帮助文本。
它通常包括:函数输入/输出宗量的含义;调用
格式说明。
(4) 编写和修改记录:起几何位置与在线帮助文本区相隔一个空行(不用%符开
头)。
该区域文本内容也都以%开头;标志编写及修改改M文件的作者和日
期、版本记录。
它用作软件档案管理。
(5) 函数体(function body):为清晰起见,与前面的注释一空行相隔。
这部分
内容由实现该M函数文件功能的MA TLAB指令组成。
它接受输入量,进行
程序流控制,创建输出量。
其中为阅读、理解方便,也配置适当的空行和注释。
(6)若仅从运算角度看,唯“函数申明行”和“函数体”两部分是构成M函数文件
所必不可少的。