《matlab编程基础函数学习教案》由会员分享,可在线阅读,更多相关《matlab编程基础函数学习教案(33页珍藏版)》请在金锄头文库上搜索。
1、会计学1matlab编程基础编程基础(jch)函数函数第一页,共33页。2本讲主要本讲主要(zhyo)内容内容n 什么是函数文件什么是函数文件n 如何如何(rh)编写函数文件编写函数文件n 递归函数递归函数n 函数参数的可调性函数参数的可调性n 局部变量与全局变量局部变量与全局变量n 子函数子函数n 函数句柄、内联函数、匿名函数函数句柄、内联函数、匿名函数第1页/共32页第二页,共33页。3q M 文件根据文件根据(gnj)调用方式的不同可以分为两类:调用方式的不同可以分为两类:l Script:脚本文件:脚本文件(wnjin)/命令文件命令文件(wnjin) l Function:函数:函数
2、(hnsh)文件文件 Matlab 编程编程l 直接输入直接输入文件名文件名即可运行即可运行l 供其它供其它M文件调用,通常带输入参数和输出参数文件调用,通常带输入参数和输出参数第2页/共32页第三页,共33页。4function 输出形参列表输出形参列表=函数名函数名(形参列表形参列表)% 注释注释(zhsh)说明部分说明部分(可选可选)函数体语句函数体语句(必须必须)l 第一行为引导行,表示该第一行为引导行,表示该 M文件是函数文件是函数(hnsh)文件文件l 函数函数(hnsh)名的命名规则与变量名相同名的命名规则与变量名相同 ( 必须以字母开头必须以字母开头 )l 当输出形参多于一个时
3、,用方括号括起来当输出形参多于一个时,用方括号括起来函数函数(hnsh)文文件件q 函数文件一般格式函数文件一般格式l 函数函数文件名必须与函数名一致文件名必须与函数名一致l 函数必须是一个函数必须是一个单独的单独的 M文件文件第3页/共32页第四页,共33页。5l 函数函数(hnsh)文件文件(f2cf.m):例:将华氏温度例:将华氏温度(hu sh wn d)转转化为摄氏温度:化为摄氏温度:编程示例编程示例(shl)clear; f=input(Please input f:);c=5*(f-32)/9;fprintf(c = %gn,c);l 脚本文件脚本文件 (f2cs.m):func
4、tion c = f2cf(f)c=5*(f-32)/9;fprintf(c = %gn,c);第4页/共32页第五页,共33页。6函数文件函数文件(wnjin)举例举例function a,b = myswap(x,y)% swap x and y a = y; b = x;例:交换例:交换(jiohun)两个变量的值两个变量的值 myswap.ml 有两个输入有两个输入(shr)参数和两个输出参数参数和两个输出参数第5页/共32页第六页,共33页。7function printyh(n)% 打印打印(d yn)杨辉三角形杨辉三角形, 本函数没有输出参数本函数没有输出参数yh = 1; di
5、sp(yh); if n=1, return; endyh = 1,1; disp(yh);for k = 3 : n yh_old = yh; k2 = ceil(k/2); for i = 2 : k2 yh(i) = yh_old(i-1) + yh_old(i); end yh(k2+1:k) = yh(k-k2:-1:1); disp(yh);end函数文件函数文件(wnjin)举例举例例:打印例:打印(d yn)杨辉三角形杨辉三角形 printyh.ml 没有输入参数和输出参数没有输入参数和输出参数第6页/共32页第七页,共33页。8q 函数调用的一般函数调用的一般(ybn)格式格
6、式输出实参列表输出实参列表(li bio)=函数名函数名(输入实参列表输入实参列表(li bio)l 函数调用时,实参的顺序应与函数定义时形参的顺序一致函数调用时,实参的顺序应与函数定义时形参的顺序一致l 实参与形参之间的结合是通过值传递实现的实参与形参之间的结合是通过值传递实现的l 函数可以嵌套调用,即一个函数可以被其它函数调用,函数可以嵌套调用,即一个函数可以被其它函数调用, 甚至可以被它自身调用,此时称为递归调用甚至可以被它自身调用,此时称为递归调用l 函数所传递的参数具有可调性,函数所传递的参数具有可调性, Matlab 用两个永久变量用两个永久变量 nargin 和和 nargout
7、 分别记录调用该函数时的输入分别记录调用该函数时的输入 (shr)实参实参 和输出实参的个数和输出实参的个数函数调用函数调用第7页/共32页第八页,共33页。9% 函数函数(hnsh) 文件文件 myfactor.mfunction y=myfactor(n)if (n=1) y=1;else y=n*myfactor(n-1);end例:利用函数的递归调用例:利用函数的递归调用(dioyng)计计算算 n!递归函数举例递归函数举例(j l)第8页/共32页第九页,共33页。10% main.m%clear;s = 0;n = 10;for i = 1 : n s = s + myfactor
8、 (i);endfprintf ( s=%g n,s)例:计算例:计算(j sun) 1! + 2! + + 10!递归函数举例递归函数举例(j l)第9页/共32页第十页,共33页。11% ex4nargin.mfunction y = ex4nargin(a,b)if (nargin=1) y = a;elseif (nargin=2) y = a*b;end参数参数(cnsh)的的可调性举例可调性举例例:例:nargin 和和 nargout 的使用的使用(shyng)% ex4nargout.mfunction p,q=ex4nargout(a,b)if (nargout=1) p =
9、 a + b;elseif (nargout=2) p = a + b; q = a - b;end第10页/共32页第十一页,共33页。12l 函数通过函数通过(tnggu)输入和输出参数与其它输入和输出参数与其它 M 文件进行数据传递文件进行数据传递l 当函数调用完毕后,该函数文件当函数调用完毕后,该函数文件(wnjin)中定义的所有局部变量都将被释放,即全部被清除中定义的所有局部变量都将被释放,即全部被清除q 如果在若干个如果在若干个 M文件中,都把某个变量定义为全局变量,则这些函数将公共使用这一变量。所有函数都可以对它进行文件中,都把某个变量定义为全局变量,则这些函数将公共使用这一变量
10、。所有函数都可以对它进行(jnxng)存取和修改操作存取和修改操作q 函数文件中的变量都是函数文件中的变量都是局部局部的,即一个函数文件中定义的变量不能被另一个函数文件或其它的,即一个函数文件中定义的变量不能被另一个函数文件或其它 M 文件使用文件使用局部变量与全局局部变量与全局变量变量l 定义全局变量是定义全局变量是 M文件间传递信息的一种手段文件间传递信息的一种手段第11页/共32页第十二页,共33页。13l 变量名列表中的各个变量用空格隔开,不能用逗号!变量名列表中的各个变量用空格隔开,不能用逗号!l 在使用全局变量的所有在使用全局变量的所有M文件中,都要对其所使用的全局变量进行文件中,
11、都要对其所使用的全局变量进行(jnxng)定义定义全局变量给函数间的数据传递带来了方便,但却破坏了函数对变量的封装,降低了程序全局变量给函数间的数据传递带来了方便,但却破坏了函数对变量的封装,降低了程序(chngx)的可读性,因而在结构化程序的可读性,因而在结构化程序(chngx)设计中,全局变量是不受欢迎的。特别是当程序设计中,全局变量是不受欢迎的。特别是当程序(chngx)较大,子程序较大,子程序(chngx)较多时,全局变量将个程序较多时,全局变量将个程序(chngx)调试和维护带来不便,故不提倡使用全局变量。调试和维护带来不便,故不提倡使用全局变量。global 变量名列表变量名列表
12、(li bio)全局变量的定义全局变量的定义q 全局变量的定义全局变量的定义第12页/共32页第十三页,共33页。14程序程序(chngx)示示例例% ex4global.mclear; global a ba = 1; b = 3;y = mysquaresum(a,b);fprintf( a=%g, b=%g n,a,b);z = myproduct(a,b);fprintf( a=%g, b=%gn,a,b);% mysquaresum.mfunction square_sum = mysquaresum(x,y)square_sum = x2 + y2; a = x+y;% mypro
13、duct.mfunction product = myproduct(x,y)global aproduct = x*y; a = x+y;第13页/共32页第十四页,共33页。15子函数子函数l 一个函数文件中可以含有一个或多个函数,一个函数文件中可以含有一个或多个函数, 其中第一个称为主函数,其它函数称为子函数其中第一个称为主函数,其它函数称为子函数l 子函数由子函数由 function 语句引导语句引导l 除了用除了用 global 定义的全局变量外,所有函数中的变量都是局部变量,函数之间通过输入、输出定义的全局变量外,所有函数中的变量都是局部变量,函数之间通过输入、输出(shch)参数
14、进行数据传递参数进行数据传递调用调用(dioyng)一个函数时,一个函数时,Matlab 会首先检查该函数是否为一个子函数会首先检查该函数是否为一个子函数l 主函数必须位于最前面主函数必须位于最前面(qin mian),子函数出现的次序任意,子函数出现的次序任意l 子函数只能被主函数和位于同一个函数文件中的其它子函数调用子函数只能被主函数和位于同一个函数文件中的其它子函数调用第14页/共32页第十五页,共33页。16子函数举例子函数举例(j l)% ex4subfun.mfunction avg, med = ex4subfun(x) % 主函数主函数(hnsh) n = length(x);
15、avg = mean(x, n);med = median(x, n);function a = mean(x, n) % 子函数子函数(hnsh) ,计算平均值,计算平均值a = sum(x)/n;function m = median(x, n) % 子函数子函数(hnsh) ,计算中值,计算中值x = sort(x);if rem(n, 2) = 1 m = x(n+1)/2);else m = (x(n/2)+x(n/2+1)/2;end第15页/共32页第十六页,共33页。17函数函数(hnsh)句柄句柄q 函数函数(hnsh)句柄的定义句柄的定义fhandle = 函数函数(hns
16、h) 名名 函数句柄,函数句柄,可以理解成一个函数的代号或别名,调用函数句柄就等价于调用该函数。可以理解成一个函数的代号或别名,调用函数句柄就等价于调用该函数。l 的作用就是将一个函数的函数句柄赋值给左边的变量的作用就是将一个函数的函数句柄赋值给左边的变量 例:例:f = sin;y = f(pi/3)第16页/共32页第十七页,共33页。18内联函数内联函数(hnsh)q 内联函数内联函数(hnsh)的定义的定义函数函数(hnsh) 名名=inline( 函数函数(hnsh) 表达式表达式, 变量变量1, 变量变量2,.) MATLAB中的内联函数借鉴了中的内联函数借鉴了C语言中的内联函数,
17、使用内联函数可以减少调用的时间和空间开销。语言中的内联函数,使用内联函数可以减少调用的时间和空间开销。l 由于内联函数是储存于内存中而不是在由于内联函数是储存于内存中而不是在 M文件中,省去了文件访问的时间,加快了程序的运行效率。文件中,省去了文件访问的时间,加快了程序的运行效率。l 但内联函数只能定义一些简单的函数表达式。但内联函数只能定义一些简单的函数表达式。例:例:f = inline(x2 + y2,x,y);y = f(2,3)第17页/共32页第十八页,共33页。19匿名匿名(nmng)函数函数q 匿名匿名(nmng)函数的定义函数的定义fhandle = (输入参数列表输入参数列
18、表 (li bio)运算表达式运算表达式例:例:f = (x,y) x2 + y2;y = f(2,3)匿名函数(匿名函数(anonymous function)是)是 MATLAB 7.0 版提出的一种全新的函数描述形式,和内联函数类似,可以让用户编写简单的函数而不需要创建版提出的一种全新的函数描述形式,和内联函数类似,可以让用户编写简单的函数而不需要创建M文件,因此,匿名函数具有文件,因此,匿名函数具有inline函数的所有优点,并且效率比函数的所有优点,并且效率比inline函数高。函数高。p = 3; q = 5;f = (x,y) xp + yq;l 匿名函数匿名函数支持变量替换支持
19、变量替换第18页/共32页第十九页,共33页。20上机作业上机作业(zuy)1、兔子繁殖问题:、兔子繁殖问题:( Fibonacci number ) 假设每对兔子每月生出一对小兔,且新生的兔子满二个月后就能生育,那么从刚出生的一对小兔算起,假设每对兔子每月生出一对小兔,且新生的兔子满二个月后就能生育,那么从刚出生的一对小兔算起,12个月后总共有多少对兔子?三年后呢?试编写一个函数计算个月后总共有多少对兔子?三年后呢?试编写一个函数计算(j sun)该题,输入为月数,输出为兔子对数。该题,输入为月数,输出为兔子对数。2、编写一个函数,要求、编写一个函数,要求(yoqi)实现以下功能实现以下功能
20、l 当输入一个参数时,输出错误信息,并返回当输入一个参数时,输出错误信息,并返回l 当输入两个或三个参数时,计算它们的阶乘的和当输入两个或三个参数时,计算它们的阶乘的和第19页/共32页第二十页,共33页。21数学(shxu)实验Matlab 自定义函数(hnsh)第20页/共32页第二十一页,共33页。22q Matlab 自定义函数自定义函数(hnsh)的五种方式的五种方式u 命令文件命令文件(wnjin)/函数文件函数文件(wnjin)+ 函数文函数文件件(wnjin) :多个:多个 M 文件文件(wnjin)自定义函数的五种自定义函数的五种(w zhn)方式方式u 函数文件函数文件 +
21、 子函数子函数 : 一个一个 M 文件文件u inline : 无需无需 M 文件文件u 符号表达式符号表达式 + subs 方式方式 : 无需无需 M 文件文件u 字符串字符串 + subs 方式方式 : 无需无需 M 文件文件第21页/共32页第二十二页,共33页。23%命令命令(mng lng)/函数文件:函数文件:myfile1.mclearfor t=1:10; y=mylfg(t); fprintf(%4d(1/3) = %6.4fn,t,y);end%函数函数(hnsh)文件:文件:mylfg.mfunction y = mylfg(x)y=x(1/3);函数必须单独写一个函数必
22、须单独写一个 (y )文件!文件!不能与命令文件写在同一个不能与命令文件写在同一个 (y )文件中!文件中!函数名与文件名必须一致!函数名与文件名必须一致!调用函数时要注意调用函数时要注意 实参实参与与形参形参的匹配!的匹配!自定义函数方式自定义函数方式(一)(一)q 方式一方式一:命令文件命令文件/函数文件函数文件 + 函数文件函数文件第22页/共32页第二十三页,共33页。24自定义函数自定义函数(hnsh)方式(二)方式(二)%函数函数(hnsh)文件:文件:funtry2.m function =funtry2()for t=1:10 y=lfg2(t); fprintf(%4d(1/
23、3) = %6.4fn,t,y);endfunction y=lfg2(x) %子函数子函数(hnsh)y=x(1/3);函数文件函数文件(wnjin)中可以定义一个或多个子函数,此时我们称该函数为主函数,子函数只能被主函数或同一个函数文件中可以定义一个或多个子函数,此时我们称该函数为主函数,子函数只能被主函数或同一个函数文件(wnjin)中的其它子函数调用!中的其它子函数调用!q 方式二方式二:函数文件函数文件 + 子函数子函数第23页/共32页第二十四页,共33页。25f=inline(函数函数(hnsh)表达式表达式,变量变量1,变量变量2,.)y=f(数值数值(shz)列表列表)代入的
24、数值代入的数值(shz)列表顺序应与定义时的变量名顺序一致列表顺序应与定义时的变量名顺序一致例:例:自定义函数方式自定义函数方式(三)(三)q 方式三方式三:inline + 命令命令/函数文件函数文件l inline 命令可以用来定义一个命令可以用来定义一个内联函数内联函数l 调用方式:调用方式:第24页/共32页第二十五页,共33页。26u 这种函数定义方式是将这种函数定义方式是将 f 作为一个内部函数调用。其特点是:调用方式最接近于我们平时对函数的定义,使程序更具可读性。同时由于它是基于作为一个内部函数调用。其特点是:调用方式最接近于我们平时对函数的定义,使程序更具可读性。同时由于它是基
25、于 Matlab 的数值计算内核的数值计算内核(ni h)的,所以它的运算速度较快,程序更有效率。的,所以它的运算速度较快,程序更有效率。u 这种定义方式这种定义方式(fngsh)的缺点:的缺点:l 定义一个内联函数用去的内存空间比相同定义一个内联函数用去的内存空间比相同(xin tn)条件下其他的方法要大得多。条件下其他的方法要大得多。l 该方法只能对数值进行代入,不支持符号代入,并且对于定义后的函数不能进行求导等符号运算。该方法只能对数值进行代入,不支持符号代入,并且对于定义后的函数不能进行求导等符号运算。自定义函数方式自定义函数方式(三)(三)第25页/共32页第二十六页,共33页。27
26、自定义函数自定义函数(hnsh)方式(三)方式(三)第26页/共32页第二十七页,共33页。28%函数文件:函数文件:function =funtry3()lfg=inline(x.(1/3); %表达式两端的单引号不可表达式两端的单引号不可(bk)缺少缺少fid=fopen(myfile3.txt,w);for t=1:50; y=lfg(t); fprintf(fid,%4d(1/3) = %6.4fn,t,y);endfclose(fid);ezplot(lfg,0,50)diff(lfg,x)自定义函数自定义函数(hnsh)方式(三)方式(三)X第27页/共32页第二十八页,共33页。
27、29注:对于注:对于(duy)在在 syms 中已经定义过符号变量,在中已经定义过符号变量,在 subs 中进行替代时,单引号可以省略。但如果在中进行替代时,单引号可以省略。但如果在 syms 后又被重新定义为其它类型,则必须加单引号,后又被重新定义为其它类型,则必须加单引号,否则不可替换。否则不可替换。l syms 定义一个符号定义一个符号(fho)表达式,用表达式,用 subs 命令调用命令调用syms f x %定义定义(dngy)符号符号f=1/(1+x2); %定义定义(dngy)符号表达式符号表达式subs(f,x,代替代替 x 的数值或符号的数值或符号)自定义函数方式自定义函数方
28、式(四)(四)q 方式四方式四: syms + subs第28页/共32页第二十九页,共33页。30u 这种函数定义方法的一个特点是可以用符号这种函数定义方法的一个特点是可以用符号(fho)进进行替换行替换u 该方法该方法(fngf)的缺点也是明显的:由于使用符号运算内的缺点也是明显的:由于使用符号运算内核,运算速度会大大降低。核,运算速度会大大降低。自定义函数自定义函数(hnsh)方式(四)方式(四)第29页/共32页第三十页,共33页。31注:此处注:此处 x 的单引号不可省略。本函数方式可以代入的单引号不可省略。本函数方式可以代入字符,但字符不能参与运算,否则将自行转化成字符,但字符不能
29、参与运算,否则将自行转化成该字符的该字符的 ASCII 码运算,这与我们码运算,这与我们(w men)想要想要的结果可能会大相径庭。的结果可能会大相径庭。l 直接定义直接定义(dngy)一个字符串,用一个字符串,用 subs 命令完成调用。命令完成调用。例:例:f=1/(1+x2) % 定义定义(dngy)字符串字符串z=subs(f,x,2) g=subs(f,x,y2)优点:占内存最少,定义格式方便自由。优点:占内存最少,定义格式方便自由。自定义函数方式自定义函数方式(五)(五)q 方式五方式五:字符串字符串 + subs第30页/共32页第三十一页,共33页。32l subs 命令的一种
30、命令的一种(y zhn)比较方便的调用方法:比较方便的调用方法:当所要替代的符号在调用前都已经有了数值当所要替代的符号在调用前都已经有了数值(shz)定定义义,则可以直接调用:则可以直接调用:subs(f)例:例:自定义函数自定义函数(hnsh)方式(五)方式(五)u 关于关于 subs 的一个注解的一个注解第31页/共32页第三十二页,共33页。内容(nirng)总结会计学。第一行为引导行,表示该 M文件是函数文件。没有输入(shr)参数和输出参数。输出实参列表=函数名(输入(shr)实参列表)。y=n*myfactor(n-1)。function p,q=ex4nargout(a,b)。函数通过输入(shr)和输出参数与其它 M 文件进行数据传递。变量名列表中的各个变量用空格隔开,不能用逗号。这种函数定义方式是将 f 作为一个内部函数调用。f=1/(1+x2)。自定义函数方式(五)第三十三页,共33页。