优选Matlab第五讲编程二函数Ppt

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数文件名必须与函数名一致 函数必须是一个单独的 M文件
第四页,总共二十七页。
编程示例
例:将华氏温度转化为摄氏温度: 脚本文件 (f2cs.m):
c 5 ( f 32) 9
clear; f=input('Please input f:');
c=5*(f-32)/9; fprintf('c = %g\n',c);
% ex4nargin.m function y = ex4nargin(a,b)
if (nargin==1)
y = a;
elseif (nargin==2)
y = a*b;
end
% ex4nargout.m
function [p,q]=ex4nargout(a,b) if (nargout==1)
函数调用时,实参的顺序应与函数定义时形参的顺序一致 实参与形参之间的结合是通过值传递实现的 函数可以嵌套调用,即一个函数可以被其它函数调用,
甚至可以被它自身调用,此时称为递归调用 函数所传递的参数具有可调性,Matlab 用两个永久变量
nargin 和 nargout 分别记录调用该函数时的输入实参 和输出实参的个数
第八页,总共二十七页。
递归函数举例
例:利用函数的递归调用计算 n!
n!
n
1, (n
1)!,
n1 n1
% 函数文件 myfactor.m function y=myfactor(n) if (n<=1)
y=1; else
y=n*myfactor(n-1); end
第九页,总共二十七页。
递归函数举例
p = a + b; elseif (nargout==2)
p = a + b;
q = a - b;
end
第十一页,总共二十七页。
全局变量与局部变量
函数文件中的变量都是局部的,即一个函数文件中定义 的变量不能被另一个函数文件或其它 M 文件使用
当函数调用完毕后,该函数文件中定义的所有局部变量都将被释 放,即全部被清除
Function:函数文件
供其它M文件调用,通常带输入参数和输出参数
第三页,总共二十七页。
函数文件
函数文件由 function 语句引导
function 输出形参列表=函数名(输入形参列表) % 注释说明部分(可选) 函数体语句(必须)
第一行为引导行,表示该 M文件是函数文件 函数名的命名规则与变量名相同 ( 必须以字母开头 ) 当输出形参多于一个时,用方括号括起来 以百分号开始的语句为注释语句
function a = mean(x, n) % 子函数,计算平均值 a = sum(x)/n;
function m = median(x, n) % 子函数,计算中值
x = sort(x); if rem(n, 2) == 1
m = x((n+1)/2Fra bibliotek;else
m = (x(n/2)+x(n/2+1))/2;
主函数必须位于最前面,子函数出现的次序任意 子函数只能被主函数和位于同一个函数文件中的其它子 函数调用
调用一个函数时,Matlab 会首先检查该函数是否为一个子 函数
第十五页,总共二十七页。
子函数举例
% ex4subfun.m function [avg, med] = ex4subfun(x) % 主函数 n = length(x); avg = mean(x, n); med = median(x, n);
function y = mylfg(x)
y=x^(1/3);
函数名与文件名必须一致!
函数必须单独写一个文件! 不能与命令文件写在同一个文件中!
第十九页,总共二十七页。
自定义函数方式(二)
方式二:函数文件 + 子函数
%函数文件:funtry2.m
function []=funtry2()
for t=1:10
进行定义
全局变量给函数间的数据传递带来了方便,但却破坏了函 数对变量的封装,降低了程序的可读性,因而在结构化程 序设计中,全局变量是不受欢迎的。特别是当程序较大,
子程序较多时,全局变量将个程序调试和维护带来不便,故不 提倡使用全局变量。
第十三页,总共二十七页。
程序示例
% ex4global.m clear;
第二十二页,总共二十七页。
自定义函数方式(三)
第二十三页,总共二十七页。
自定义函数方式(三)
%函数文件:function []=funtry3() lfg=inline('x.^(1/3)');
%表达式两端的单引号不可缺少 fid=fopen('myfile3.txt','w'); for t=1:50;
yh_old=yh; k2=ceil(k/2); for l=2:k2
yh(l)=yh_old(l-1)+yh_old(l); end yh(k2+1:k)=yh(k-k2:-1:1); disp(yh); end
第七页,总共二十七页。
函数调用
函数调用的一般格式
输出实参列表=函数名(输入实参列表)
y=lfg(t); fprintf(fid,'%4d^(1/3) = %6.4f\n',t,y); end fclose(fid); ezplot(lfg,[0,50])
X diff(lfg,'x')
第二十四页,总共二十七页。
自定义函数方式(四)
方式四: syms + subs
syms 定义一个符号表达式,用 subs 命令调用
y=lfg2(t);
fprintf('%4d^(1/3) = %6.4f\n',t,y); end
function y=lfg2(x) %%子函数 y=x^(1/3);
函数文件中可以定义一个或多个子函数,此时我们称该函 数为主函数,子函数只能被主函数或同一个函数文件中的 其它子函数调用!
第二十页,总共二十七页。
end
第十六页,总共二十七页。
Matlab 自定义函数
第十七页,总共二十七页。
自定义函数的五种方式
Matlab 自定义函数的五种方式 命令文件/函数文件+ 函数文件 :多个 M 文件 函数文件 + 子函数 : 一个 M 文件 inline : 无需 M 文件 符号表达式 + subs 方式 : 无需 M 文件 字符串 + subs 方式 : 无需 M 文件
% 定义字符串
z=subs(f,'x',2)
g=subs(f,'x','y^2')
注:此处 x 的单引号不可省略。本函数方式可以代入字符,
但字符不能参与运算,否则将自行转化成该字符的 ASCII 码运算,这与我们想要的结果可能会大相径庭。
优点:占内存最少,定义格式方便自由。
第二十七页,总共二十七页。
global a b
a=1; b=3;
y=mysquaresum(a,b);
fprintf(' a=%g, b=%g \n',a,b); z=myproduct(a,b); fprintf(' a=%g, b=%g\n',a,b);
% mysquaresum.m
function square_sum=mysquaresum(x,y) square_sum=x^2 + y^2; a=x+y;
函数文件(f2cf.m):
function c = f2cf(f)
c=5*(f-32)/9; fprintf('c = %g\n',c);
第五页,总共二十七页。
函数文件举例
例:交换两个变量的值 myswap.m
有两个输入参数和两个输出参数 function [a,b] = myswap(x,y) % swap x and y a = y; b = x;
例:计算 1! + 2! + … + 10!
% main.m % clear; s = 0; n = 10; for i = 1 : n
s = s + myfactor(i); end fprintf(' s=%g \n',s)
第十页,总共二十七页。
参数的可调性举例
例:nargin 和 nargout 的使用
第六页,总共二十七页。
函数文件举例
例:打印杨辉三角形 printyh.m
没有输入参数和输出参数
function printyh(n) % 打印杨辉三角形, 本函数没有输出参数 yh=1; disp(yh); if n==1, return; end yh=[1,1]; disp(yh); for k=3:n
syms f x
%定义符号
f=1/(1+x^2); %定义符号表达式
subs(f,'x',代替 x 的数值或符号)
注:对于在 syms 中已经定义过符号变量,在 subs 中进行 替代时,单引号可以省略。但如果在 syms 后又被重新 定义为其它类型,则必须加单引号,否则不可替换。
第二十五页,总共二十七页。
第十八页,总共二十七页。
自定义函数方式(一)
方式一:命令文件/函数文件 + 函数文件
%命令/函数文件:myfile1.m
clear
for t=1:10; y=mylfg(t); fprintf('%4d^(1/3) = %6.4f\n',t,y);
end
调用函数时要注意实参与形参的匹配!
%函数文件:mylfg.m
这种函数定义方式是将 f 作为一个内部函数调用。其特 点是:调用方式最接近于我们平时对函数的定义,使程序 更具可读性。同时由于它是基于 Matlab 的数值计算内核 的,所以它的运算速度较快,程序更有效率。
这种定义方式的缺点: 定义一个内联函数用去的内存空间比相同条件下其他 的方法要大得多。 该方法只能对数值进行代入,不支持符号代入,并且 对于定义后的函数不能进行求导等符号运算。
% myproduct.m
function product=myproduct(x,y) global a
product=x*y; a=x+y;
第十四页,总共二十七页。
子函数
一个函数文件中可以含有一个或多个函数, 其中第一个称为主函数,其它函数称为子函数
子函数由 function 语句引导 除了用 global 定义的全局变量外,所有函数中的变量都 是局部变量,函数之间通过输入、输出参数进行数据传递
函数通过输入和输出参数与其它 M 文件进行数据传递
如果在若干个 M文件中,都把某个变量定义为全局变量,则
这些函数将公共使用这一变量。所有函数都可以对它进行存取和 修改操作
定义全局变量是 M文件间传递信息的一种手段
第十二页,总共二十七页。
全局变量的定义
global 变量名列表 变量名列表中的各个变量用空格隔开,不能用逗号! 在使用全局变量的所有M文件中,都要对其所使用的全局变量
自定义函数方式(三)
方式三:inline + 命令/函数文件
inline 命令可以用来定义一个内联函数 f=inline('函数表达式','变量1','变量2',...) 调用方式: y=f(数值列表)
代入的数值列表顺序应与定义时的变量名顺序一致
例:
第二十一页,总共二十七页。
自定义函数方式(三)
优选Matlab第五讲编程二函数
1
第一页,总共二十七页。
本讲主要内容
什么是函数文件 如何编写函数文件
递归函数
函数参数的可调性
全局与局部变量 子函数
第二页,总共二十七页。
Matlab 编程
M 文件根据调用方式的不同可以分为两类: Script:脚本文件/命令文件
直接输入文件名即可运行
自定义函数方式(四)
这种函数定义方法的一个特点是可以用符号进行替换
该方法的缺点也是明显的:由于使用符号运算内核,运算速 度会大大降低。
第二十六页,总共二十七页。
自定义函数方式(五)
方式五:字符串 + subs
直接定义一个字符串,用 subs 命令完成调用。
例: f='1/(1+x^2)'
相关文档
最新文档