3.1 Matlab的函数
Matlab本身是一个不断丰富的函数库。从某种意义上说,学习Matlab,首先要学会它当中函数的使用方法,更进一步可以用Matlab的编程功能自己编写函数,扩充Matlab的内容,使得Matlab更加个性化。
3.1.1 Matlab的函数分类
Matlab的函数可以分为系统内部函数、用户自定义函数两大类。 1.系统函数
所谓系统函数是指Matlab系统已经编写好的,用户可以直接调用的函数。 很多函数名都是直接沿用数学中的名字。例如,正弦函数:sin(x);以2为底的对数函数:log2(x),等等。也有很多函数是根据需要特别编写的,例如求反函数:finverse(f)等等。Matlab的函数比我们在数学学习中涉及的函数要广泛得多,函数遍布Matlab的各个使用领域。除了数学意义上的函数,Matlab的很多功能都通过函数实现,例如函数colordef用于设置默认的颜色,fprintf是将文本写入到某个文件中,等等。
在本章,我们对系统函数的学习着重在于数学系统函数。在学习中要注意,由于我们的学习是围绕微积分知识进行的,所以有些函数并没有将其全部用法一一列举,而只对其微积分方面的功能做介绍。
2.用户自定义函数
如果在解决一个问题时,要反复多次地计算一个函数在不同点的值,在编制程序时,就可以把这个函数事先编写成类似于系统函数的格式,需要时可以随时调用。
函数文件的一般格式:
function [输出表]=函数名(输入表) 注释行 函数体
函数文件的第一行必须以function开头,表示该文件是一个函数文件。输入表是以逗号分开的参数表;输出表是函数的返回值,如果返回值只有一个就可以省略方括号;当返回值不只一个时,要用逗号分开。
为方便今后阅读函数文件,最好在编写函数时对函数的功能作一些文字说明。一般将功能说明集中放在函数文件的开始,也可以在相应的程序行再行说明。他们的作用是注释,为与函数的命令语句区别,凡是注释性的语言都要在前面加上“%”,表示该行“%”后是注释。如果注释行有多行,则每行都要以“%”开头。
一般地,为避免引起混淆,函数文件在存盘时,文件名就用函数文件中的函数名。 例1、编写一个函数文件,计算n! 可以编写阶乘计算函数njc(n): function m=njc(n) %m的值为n! m=1; k=1; while k<=n m=m*k; k=k+1; end
3.1.2 Matlab的函数调用方式
函数的使用可以分为即编即用、先编写好再反复多次调用等形式。
对系统函数和已经编写好的函数,调用格式为:函数名(参数表)。其调用方式有
两种。
1.直接输入函数名调用
直接输入函数名调用,这样系统会返回函数值,但是其值不会被保留下来。多用于在命令行方式下完成简单任务。
例2、利用例1编写的函数计算4!,10!,在命令窗口执行该函数,马上得到结果: >> njc(4) ans = 24 >> njc(10) ans = 3628800
其实,Matlab提供了阶乘计算系统函数factorial(),计算n!也可以直接调用该函数。如:
>> factorial(3) ans = 6
例3、计算log2(4),可以直接在命令行输入: >> log2(4) 系统马上输出: ans = 2
2.将函数值赋值给变量表
将函数值赋值给变量表,这样可以在后继操作中继续使用已经计算好的函数值。常常在程序文件(M文件)中使用。
例4、在上例中,计算得到的log2(4)在后面还要用,可以将其保留在一个变量中: >>X=log2(4); 以后直接调用X即可: >> X X = 2
3.2 函数表达式在Matlab中的运算
3.2.1 MATLAB函数表达式的表示方法
Matlab中的函数表达式要求必须写在同一行上,因此与书写形式的表示有不同的地方。Matlab的加法、减法运算符号仍然是“+”,“-”;乘法运算符号不能省略,用“*”表示;指数运算符号为“.^”;除法运算符号为“/”;还要注意在Matlab中括号不能省略,而且一律用圆括号“()”表示。
例1、将下列表达式改写成Matlab的输入形式:
(1)
x1
x(x2x)解:(x1)/(x*(x.^2x)) (2)exy(xy)
解:exp(xy)(xy)
在上节看到,对于定义好的函数,可以直接计算某点的函数值。如果要将函数表达式作为整体进行处理,这时要定义符号函数。
例2、定义符号函数f(x)2sinx x21方法一、用单引号定义,运行如下语句:
>> f='(2*sin(x))/(x^2-1)' 得到: f =
(2*sin(x))/(x^2-1)
方法二、先定义符号变量,再定义符号函数,
>> syms x
>> f=(2*sin(x))/(x^2-1) 运行结果如下: f =
2*sin(x)/(x^2-1)
3.2.2 常用的表达式处理函数 1.函数表达式的四则运算
已知两个函数解:f(x)和g(x),要求: (1)f(x)g(x)用函数f+g; (2)f(x)g(x)用函数f-g; (3)f(x)g(x)用函数f*g;
(4)若g(x)0,则f(x)/g(x)用函数f/g;
(5)f(x)g(x)用函数f^g
例3、定义符号函数f(x)2x21,g(x)x1, 并将其进行表达式的四则运算
程序如下:
syms x f=2*x^2-1 g=x+1 z1=f+g z2=f-g z3=f*g z4=f/g z5=f^g
运行结果如下: f = 2*x^2-1 g = x+1 z1 = 2*x^2+x z2 = 2*x^2-2-x z3 =
(2*x^2-1)*(x+1) z4 =
(2*x^2-1)/(x+1) z5 =
(2*x^2-1)^(x+1)
如果想要得到书写形式的表达式,可以用pretty函数。 例4、续上例,运行 >> pretty(z1) 结果如下:
2 2 x + x
>> pretty(z5) 结果如下:
2 (x + 1) (2 x - 1)
2.函数的嵌套复合
利用嵌套复合函数compose(f,g),得到函数f(g)
格式:compose(f,g,1,2,3)前面的f,g表示要复合的两个函数,后面位置1,2,3的参数分别用于指定函数f,g,f(g)的自变量,可以省略。其省略形式可以为:
compose(f,g),compose(f,g,3),compose(f,g,1,3)
例5、若f(u)sinu,g1,(1)将x作为最终自变量,求f(g);(2)t2x将g中的t作为自变量,x作为待定参数时的g(f);(3)将g中的x作为自变量,t作为待定参数时的g(f);
程序如下: syms u t x f=sin(u); g=1/(t-2*x);
fg=compose(f,g,u,x,x) gf1=compose(g,f,t,u) gf2=compose(g,f,x,u) 运行结果: fg = sin(1/(1-2*x)) >> ktfh fg = sin(1/(t-2*x)) gf1 = 1/(sin(u)-2*x) gf2 = 1/(t-2*sin(u))
要注意的是,在一个函数中有多个字母时,必须指明哪个是自变量;如果只有一个
字母,不需要特别指明,系统会默认其为自变量。另外,复合后的函数也只有一个自变量,如上例中,fg的自变量是x,gf1的自变量是u,gf2的自变量是也是u。
3.求反函数
finverse(f,u)返回函数f的反函数,用参数u指定反函数的自变量,当f中只有一
个字母时,u可以省略。
例6、求函数f(x)sin(x1)的反函数 程序如下:
f='sin(x+1)'; g=finverse(f,x)
运行结果如下:
g = -1+asin(x)
需要说明的是,如果符号函数以单引号定义,这时必须指明其中的自变量。
4.求函数值
一般的函数可以用function编制函数文件来定义,这时要计算某点的函数值只需要调用该函数即可。特别地,对于表达式函数,也可以直接将其定义为符号函数,这种定义方式简单明了,这时由于定义的函数名中没有参数位置,要计算函数值时,首先给自变量赋值,然后用函数eval() 求得该点处的函数值。
ex例7、定义函数f(x),并计算f(0.5)
x1方法一、定义为函数文件,函数文件如下: function m=f(x)
m=exp(x)/(x+1);
以f为名存盘,运行该函数,得到: >> f(0.5) ans = 1.0991
方法二、定义为符号函数,程序如下: syms x
f=exp(x)/(x+1); x=0.5; g=eval(f) 运行结果如下: g = 1.0991
3.2.3 求函数的零点
在实际应用中经常涉及到求函数零点的问题。Matlab提供了函数fzero用于求函数的零点,其基本调用格式为:zfzero(f,x)
说明:其中函数f是要求零点的函数。x是计算的初始值,既可以是标量也可以是二维向量。当x是标量时函数自动在初始值附近找到函数值异号的区间,然后迭代求出函数值为零时自变量的值,若找不到,则返回NaN;当x为二维向量[x(1),x(2)]时,函数在区间[x(1),x(2)]寻找函数值为零时自变量的值,此时要求在x(1),x(2)处的函数值异号,否则系统会显示出错。
注意:参数x应该是很接近零点的一个数(一般先用较粗略的方法找到计算初始值x,再用这个函数进行精确计算),否则误差较大。
例8、求方程xx10的根在区间[0,1]内的根 可以证明该方程在区间[0,1]内只有一个根。 运行: x=fzero('x^5+x-1',[0,1]) 得到:x = 0.7549
例9、先粗略估计方程e5x0的零点,然后用fzero计算 (分析,作图可知该方程有且只有一个零点) 运行: f='exp(x)-5*x'; x=fzero(f,0.5) 得到: x = 0.2592 3.2.4 多项式函数
多项式函数是函数中很常见的,Matlab中有很多函数涉及多项式的处理。这里介绍几个常用函数。需要说明的是,这里介绍的函数有的不仅仅适用于多项式,而且适用于所有函数。在没有特别说明的时候,介绍的函数仅仅适用于多项式函数。
1.多项式的表示方法
Matlab中的多项式可以用一般函数表达式的表示方法,也可以将多项式写为行向量,其中数为多项式降幂书写时每次幂的系数,缺项多项式要补零。
x5
例8、定义多项式函数f(x)3x4x2x1 方法一、定义为符号函数 syms x; f=3*x^4-x^2+x-1 得到: f =
3*x^4-x^2+x-1 方法二、用行向量定义 A=[3 0 -1 1 -1]
可以将之恢复为多项式的一般形式,用函数poly2sym(): f=poly2sym(A) 得到: f =
3*x^4-x^2+x-1 2.常用多项式函数
(1)多项式求根函数roots(A),参数A是一个表示多项式的行向量。其结果也是一个行向量。
例11、计算多项式方程2xx5x20的根: 程序如下: A=[2 1 -5 2]; x=roots(A) 得到:
32
x = -2.0000 1.0000 0.5000
即,该方程有三个实数根,分别是2,1,0.5 例12、计算多项式方程xxx10的根: 程序如下: A=[1 -1 1 -1]; x=roots(A) 得到:
x =
1.0000 0.0000 + 1.0000i 0.0000 - 1.0000i
即,该方程有三个根,分别是1,i,i
(2)多项式四则运算
如果是用符号函数定义的多项式,其四则运算和一般符号函数相同。
另外,很多时候多项式都是以行向量的形式表示的,这时,对于两个次数不同的多项式要进行加减运算,需要将低阶多项式行向量前面补0,让两个多项式的维数(向量中数字的个数)相同。
例13、设f1(x)x42x21,f2(x)2x2x5,计算f1(x)f2(x),
32
程序如下: A1=[1 0 -2 0 1]; A2=[0 0 2 -1 -5]; A1+A2 运行结果如下: ans =
1 0 0 -1 -4
4结果还原成多项式为xx4
多项式相乘用函数conv(A1,A2);多项式相除用函数deconv(A1,A2)。它们的参数A1,A2都是表示多项式的行向量。函数deconv(A1,A2)的格式有两种:(1)deconv(f,g)返回f除以g的商;(2)[q,r]=deconv(f,g)计算f除以g,q表示商,r表示余式。
例14、f1(x),f2(x)同上例,计算f1(x)f2(x)
继续使用上例的行向量A1,A2来表示f1(x),f2(x),再运行如下语句: conv(A1,A2) 得到:
ans =
0 0 2 -1 -9 2 12 -1 -5 即结果是一个6次多项式,为2xx9x2x12xx5 例15、f1(x),f2(x)同上,求f1(x)/f2(x)的商式和余式
这时,行向量的第一个数字不能为0,沿用上面的A1,改写A2,程序如下
A2=[2 -1 -5]; [q,r]=deconv(A1,A2)
65432
运行结果如下:
q =
0.5000 0.2500 0.3750 r =
0 0 0 1.6250 2.8750 即商式为0.5x0.25x0.375,而余式为1.625x2.875
3.表达式的变形
下列函数中的参数可以是任意的函数,这里即使是多项式函数也不能以向量的形式给出。
(1)因式分解函数factor(f)对表达式进行因式分解;
例16、对函数f(x)x36x211x6进行因式分解 程序如下: syms x
f=x^3-6*x^2+11*x-6; f1=factor(f) 运行结果如下: f1 =
(x-1)*(x-2)*(x-3)
(2)表达式展开函数expand(f),将表达式f展开。
例17、对例14中的多项式用符号函数来定义,结果需要用expand()函数展开。 程序如下: syms x
2
f1=x^4-2*x^2+1; f2=2*x^2-x-5; f1*f2
f=expand(f1*f2) 运行结果如下: ans =
(x^4-2*x^2+1)*(2*x^2-x-5) f =
2*x^6-x^5-9*x^4+2*x^3+12*x^2-x-5
例18、展开函数f(x)(x2sinx)(3x1)(x1) 程序如下: syms x
f=(x^2+sin(x))*(3*x-1)*(x+1) expand(f) 运行结果如下: f =
(x^2+sin(x))*(3*x-1)*(x+1) ans =
3*x^4+2*x^3-x^2+3*sin(x)*x^2+2*sin(x)*x-sin(x)
3.3 极限与连续实验
3.3.1 用MATLAB计算极限
用limit函数可以计算符号表达式的极限,其调用格式有以下几种: 格式 Limit(F,x,a) Limit(F, a) 功能 计算符号表达式F在条件x→a下的极限值 计算符号表达式F中由findsym(F)返回的独立变量趋于a 时的极限值 Limit(F) 计算符号表达式F在条件x→0下的极限值 Limit(F,x,a,‘right’)或 计算符号表达式F在条件x→a下的极限值,其中“right”“left”,Limit(F,x,a,‘left’) 用来指定取极限的方向,分别表示右极限和左极限 说明:(1)F是被求极限的函数表达式,要以符号表达式的方式定义,当中出现的字母以及F(如果要用的话),事先要定义为符号变量;
(2)参数a可以是有限的数,也可以是无穷大,无穷大用inf表示;
(3)结果输出可以是数值、无穷大inf、不定值NaN,当函数中有待定参数时,输出的还可以是表达式。
例1、用MATLAB计算下列极限
sin3x212) (3)limx2ex (1)lim (2)lim(2x0x1x1x0xx1xx1lntan2xx3) (5)limlim (6)
x2(x2)2x0lntanx2x11(4)lim(xsinxa2x(a21)x1)x (7)limx (8)lim(xex0x12
程序如下: syms x a
z1=limit(sin(3*x)/x) z2=limit(2/(x^2-1)-1/(x-1),1) z3=limit(x^2*exp(1/x^2)) z4=limit((x/(2*x+1)^(x-1)),inf) z5=limit((x+3)/(x-2)^2,2)
z6=limit(log(tan(2*x))/log(tan(x)),x,0,'right') z7=limit(sin(x)/(exp(-x)-x+1),x,inf,'left') z8=limit(((a^(2*x)+(a^2+1)^x)/2)^(1/x),x,0) 运行结果如下: z1 = 3 z2 = -1/2 z3 = inf z4 = 0 z5 = inf z6 =
1 z7 = 0 z8 =
a*(a^2+1)^(1/2)
3.3.2 函数的连续性
没有专门用于判断函数连续性的系统函数。但是由于有:函数f(x)在x0连续
limf(x)f(x0),因此可以利用极限来判断函数的连续性。可以编写如下的通用
xx0程序lxx.m,来判断函数f在x0点的连续性。
syms x; f=input('f=') x0=input('x0=') z=limit(f,x,x0); x=x0; f1=eval(f); if z==f1
'函数在该点连续' else '函数在该点不连续' end
例2、在命令窗口运行该程序,判断下列函数在指定点处的连续性:
(1)f(x)1在x02处 x1(2)g(x)log(x1)在x01处 执行: lxx f=1/(x+1) f = 1/(x+1) x0=2 x0 = 2 ans =
函数在该点连续 得到(1)中函数的连续性 再次执行lxx: lxx f=log(x-1) f = log(x-1) x0=1 x0 = 1
Warning: Log of zero.
> In e:\\数学实验\\lxx.m at line 6
In D:\\MATLAB6p1\oolbox\\symbolic\\@sym\\eval.m at line 9 In e:\\数学实验\\lxx.m at line 6 ans = 函数在该点不连续
警告提醒程序计算中出现log函数的真数为0的无意义情况,得到结论在该点不连续。
该程序稍加修改,即可成为判断函数左连续或者右连续的通用程序。留作习题。 对于间断点的类型,也可以编写程序来确定,只是情况比较复杂。这里仅将判断可去间断点的程序写出,有兴趣的读者可以编写判断其它类型间断点的程序,将这些小程序整合在一起,可以成为判断间断点类型的通用程序。
判断可去间断点通用程序kqjdd.m:
syms x; f=input('f=') x0=input('x0=') z1=limit(f,x,x0,'left'); z2=limit(f,x,x0,'right'); x=x0; f1=eval(f); if z1==z2 if z2~f1
'该点是函数的可去间断点' end
else '该点不是函数的可去间断点' end
例3、利用上面的程序判断x0=0是否函数f(x)sinx/x的可去间断点。 执行程序kqjdd:
f=sin(x)/x x0=0
Warning: Divide by zero. > In e:\\数学实验\\kqjdd.m at line 8
In D:\\MATLAB6p1\oolbox\\symbolic\\@sym\\eval.m at line 9 In e:\\数学实验\\kqjdd.m at line 8 ans = 0 ans =
该点是函数的可去间断点
执行后结论为,x0=0是函数f(x)sinx/x的可去间断点。
对于分段函数分段点处的连续性,可以将之归结为某几个初等函数在某些点的连续性,这里举出一例。
例4、判断函数f(x)sinx/xx0在分段点处的连续性
x1x0 编写程序如下:
syms x; f1=sin(x)/x; f2=x+1;
z1=limit(f1,x,0,'left'); z2=limit(f2,x,0,'right'); x=0; f3=eval(f2); if z1==z2==f3
'函数在该分段点处连续' else '函数在该分段点不连续' end 运行结果: ans =
函数在该分段点处连续
上 机 实 验
1 熟悉基本初等函数在Matlab中的使用,根据下表在Matlab中计算下列函数值: Matlab中的函数名 sin() cos() 数学含义 正弦函数sinx 余弦函数cosx Matlab中的函数名 asin() acos() 数学含义 反正弦函数arcsinx 反余弦函数arccosx
tan() cot() sec() csc() log() 正切函数tanx 余切函数cotx 正割函数secx 余割函数cscx 自然对数函数lnx atan() acot() asec() acsc() log10() 反正切函数arctanx 反余切函数arccotx 反正割函数secx 反余割函数acscx 以10为底的对数函数lgx sinh() asinh() 双曲正弦函数shx 反双曲正弦函数arshx cosh() acosh() 双曲余弦函数chx 反双曲余弦函数archx exp() 指数函数e x sin22,log34,ee,earctan2 42 熟悉一些常用函数,进而计算:
Matlab中的函数名 abs() sign() ceil() fix() rem() sqrt() round() 数学含义 绝对值函数 符号函数 对方向取整函数 对0方向取整 除法求余 平方根函数 四舍五入取整
(1)4; (2)2tan1;
(3)对2tan1四舍五入,对方向取整函数,对0方向取整; (4)确定earctan1.54的符号,并对其四舍五入,对0方向取整 附:Matlab中某些常数的表示以及一些常用变量:
ans 最新表达式的运算结果 Inf 无穷大 NaN 非数 pi
i或j 虚数单位
3 将下列表达式转换为Matlab的书写形式:
(1)
x1 (2)2xsin2x
(5x2)(exx2)
4 在Matlab中将下列函数按要求进行复合:
2(1)f(x)ln(x1),g(x)xsinx,求f(g(x))以及g(f(x));
(2)faxbx,g(x)21,将f看为x的函数时,求f(g(x));将f看为a 的x1函数时,求f(g(x))。
5 在Matlab中求函数fx1的反函数 x2
6 在Matlab中定义函数f(x)sin(x1),并计算x12时的函数值。 2xx17 在Matlab中求出方程x2sinx0在区间[0.1,2]内的根。 8在Matlab中 先粗略估计方程xe2x0正根的近似值,然后计算其精确值。
V课外作业: 上机实验
1、在Matlab中 设多项式f(x)(x2x)(x1),g(x)x22x1。 (1)求f(x)g(x)的展开式,并求方程的根f(x)g(x)0; (2)求f(x)/g(x)的商式和余式。
2、在Matlab中 将函数f(x)2x45x34x25x2进行因式分解。 3 、在Matlab中在MATLAB中计算下列极限:
2(1)lime(sinxx1) (2)limx(x2x)
x2xx(3)lim(sinx)xtanx (4)limx02cosxe 2x[xln(1x)]x22e(5)limx11x1sinx
4、编写判断函数在某点处左(或右)连续的程序, 从而判断分段函数在分段点处的连续性
2x21x1(1)f(x)
x3x11x(2)f(x)(1x)3x0
x0
因篇幅问题不能全部显示,请点此查看更多更全内容