薛定宇教授大讲堂(卷Ⅱ):MATLAB微积分运算
上QQ阅读APP看书,第一时间看更新

3.1 单变量函数的极限

3.1.1 单变量函数极限的εδ定义

假设已知函数f(x),则极限问题的数学表示为

其物理意义是当自变量x无限接近x0时,函数f(x)无限逼近的值。在一般微积分学教程中会给出如下极限问题的εδ定义。

定义3-1εδ定义)对任意事先选定的ε>0,都存在满足0<|x−x0|的正数δ,使得|f(x)−L|,则称极限L

例3-1 常数e是一个无理数,试显示其前32位。

由下面的命令可以直接显示所需的位数

     >> vpa(exp(sym(1)),32) %用户还可以显示该无理数任意多位数值

其前32位为e2.7182818284590452353602874713527。如果将32替换成其他整数,则可以显示任意指定位数。用这种语句最多显示位数为32766位,超过这个位数要求则应该使用循环,参见第I卷。

例3-2 试通过εδ定义验证一个重要极限

考虑不等式|(1+1/x)x−e|<ε,这个不等式是一个关于x的非线性的不等式,不借助计算机工具不能直接求解该不等式。其实,可以将该不等式的求解转换为解方程问题,如果给定ε的值,将(1+1/x)x−e−ε=0方程的边界求出来,该边界的绝对值就是我们期待的δ

MATLAB中提供了单变量方程的简易求解函数fzero(),如果选定ε=0.01,则通过求解方程得出D=0.0073,表明若能保证−0.0073⩽x⩽0.0073,则(1+1/x)x与e的距离将小于ε=0.01。

     >> eps0=0.01; f=@(x)(1+x)^(1/x)-exp(1)-eps0; D=abs(fzero(f,0.1))

可以用下面的语句绘制出x∈(−0.01,0.01)区间的函数曲线,如图3-1所示。从图中可见,如果选择了误差限ε=0.01,则可以找到一个δ的值,使得−δxδ时,能保证−εL−e⩽ε。如果缩小期望的误差限ε,通过非线性方程的求解方法都能找到相应的边界δ,确保−δxδ时,实际的误差满足预先指定的误差限要求。

图3-1 x=0附近的曲线

还可以尝试一些更小的误差限ε,如103,…,108,用下面的循环结构可以解出对应的边界δ,如表3-1所示。可见,不论选择多么小的ε都能找到对应的δ,并且可以发现,δ几乎与ε的选择呈现线性变化,而这些现象不借助计算机是不得而知的。

表3-1 选择不同ε时得出的δ

如果想进一步减小ε,利用fzero()这类双精度框架下的函数就很难完成了,必须使用符号运算实现,得出的δ=7.358×1011,仍然与ε的变化呈线性关系。再进一步减小ε,即使使用符号运算的框架也很难求出δ

     >> syms x; f=(1+x)^(1/x)-exp(sym(1))-1e-10; x1=vpasolve(f)

3.1.2 函数极限的计算机求解

如果从εδ定义求一个函数的极限是很麻烦的,所以在“高等数学”或“数学分析”课程中介绍了大量的极限求解方法、公式和技巧,例如,需要记忆两个基本的极限公式,需要灵活地运用各种各样的方法,如四则运算方法、中值定理等,还需要掌握学习了微分后才知道的L'Hôpital法则,甚至更高深的方法,如Taylor级数展开、定积分法、Stolz–Cesàro定理等,均需花费大量的时间反复练习,才能较好地学会极限求解问题。并且,在实际求解极限问题时,能不能得出问题的解,很大程度上取决于求解者掌握的公式与技巧。

在本书中我们尽量回避这些底层的问题,将极限问题直接用计算机理解的格式输入计算机,让计算机去完成这些烦琐的工作,剩下的任务就是等待和解释计算机给出的结果了。

重新考虑前面给出的极限问题

其中x0可以是一个确定的值,也可以是无穷大量,例如x→∞,还可以是另一个已知的函数或变量。极限问题在MATLAB符号运算工具箱中可以使用limit()函数直接求出,该函数的调用格式为

L=limit(f,x0), %默认符号变量

L=limit(f,x,x0), %一般求极限语句

在求解之前应该先申明自变量x,再用符号表达式的形式定义原函数f,若x0,则可以用inf直接表示。

如果函数中只有一个符号变量,或f(x)是由函数的格式给出的,则可以在调用语句中忽略自变量x。由symvar()函数可以提取出符号表达式f中符号变量的列表,该函数的调用格式为list=symvar(f)。

下面将通过例子演示基于MATLAB语言的求解极限的方法。

例3-3 求解另一个重要的极限问题

求解函数的极限问题需要下列三个步骤:

(1)申明必要的符号变量,这里需要申明的是x

(2)将f(x)=sin x/x函数用MATLAB描述出来;

(3)调用MATLAB函数limit()直接求解。

在MATLAB的工作窗口内可以直接给出下面的语句实现这三个步骤,得出原始问题的极限为L=1。

     >> syms x; f(x)=sin(x)/x; L=limit(f,0) %直接求解极限问题

由于函数f(x)在输入符号表达式f中已经使用了函数形式,所以在调用limit()函数时可以略去x直接求解。当然也可以调用下面的语句求解,得出完全一致的结果。

     >> L=limit(f,x,0)

有了MATLAB这样强有力的工具,还可以由下面的语句绘制出x∈(−0.1,0.1)区间的函数曲线,如图3-2所示,可以利用该曲线观察极限的逼近过程。由于x=0点函数没有定义,所以在生成x向量时有意引入一个小的偏移量,避开x=0点。

图3-2 x=0附近逼近极限值的过程

例3-4 试求解极限问题

利用MATLAB语言,应该首先申明abx为符号变量,然后定义函数表达式,最后调用limit()函数求出给定函数的极限,得出的极限为eab。从下面的语句看,求解这样的问题和例3-3对用户来说一样简单。

     >> syms x a b; f(x)=x*(1+a/x)^x*sin(b/x); L=limit(f,inf) %直接计算

虽然在原函数中使用了三个符号变量,由v=symvar(f)语句也可以提取出这三个符号变量v为向量[a,b,x],但由于原函数已经申明成了自变量x的函数,所以在语句调用时即使略去x,也可以准确地得出关于x的极限。

例3-5 试求极限

求解这个极限问题时,先申明符号变量,再将函数输入MATLAB工作空间,然后调用limit()函数即可以得出极限L=1/12。

     >> syms x; f(x)=1/2/(1-sqrt(x))-1/3/(1-x^(1/3)); L=limit(f,1)

例3-6 试求下面极限

尽管给出的函数看起来很复杂,仍可以使用MATLAB对其直接描述,然后调用limit()函数直接求解,得出的结果为L=7 ln 5e−a−b

3.1.3 复合函数的极限

如果给出某个复合函数,这个复合函数由若干个其他函数组成,若已知这些组成函数的极限,则可以求解复合函数的极限。

例3-7 已知,试求

由常规方法输入复合函数,并对其求导,再将已知的数值代入结果,则得出的结果为,在实函数领域,其结果应该为−6。

3.1.4 序列的极限

如果给出了某序列的表达式,也可以调用limit()函数直接求解。在一般情况下,没有必要刻意地将n设置为整型符号变量。

例3-8 试求出下面序列的极限

从给出的趋势看,第一项为21/2,第二项为,第三项为,第四项为,可以总结出,第n项为,显然,指数项为等比级数,首项为a0=1/2,公比为q=1/2,项数为n,这样第n项的指数为,所以可以直接由下面的语句求出其极限,为L=2。

这里,利用等比级数的公式求出了2的指数,事实上,MATLAB是可以计算有穷级数与无穷级数求和问题的,第6章将会介绍相关的内容。

如果取一系列的n值,则可以绘制出序列的演化过程,如图3-3所示,可以看出该序列到第七项就累计到极限1%的误差限之内了。

     >> n0=1:20; f=F(n0); stem(n0,f)

例3-9 试求出序列的极限

序列极限的求解方法与函数极限完全一致,先声明符号变量,然后用符号表达式描述序列,最后调用limit()函数直接求解。由下面的语句可以得出F=0。

图3-3 序列的演变

例3-10 试求出极限

该极限表达式既包括序列又包括函数,但这丝毫未给求解带来任何困难,可以申明两个符号变量nx,这样用下面语句可以直接得出问题的极限为ex/(x2+1)。该极限问题的求解容易程度对用户来说也与sin x/x极限相仿。

对序列极限而言,一般没有必要将符号变量n设置为整数型符号变量。

很多序列极限问题将涉及序列求和与求积的MATLAB函数,暂时不能求解,这类问题留待6.1节与6.3节叙述,这里只给出一个例子与求解代码,不作讲解。

例3-11 试求序列极限

由下面的代码将得出问题的解为L=n(n+1)/4。

     >> syms n x k; L=limit((1-symprod(cos(k*x)^(1/k),k,1,n))/x^2,x,0)

3.1.5 分段函数的极限

在学习手工推导函数或序列极限时,有的时候需要分几种情况考虑。如果使用MATLAB这样的工具,可以调用limit()函数直接求解,得出所需的极限,有时候得出的极限是由分段函数表示的。

例3-12 试求出

如果手工求解这样问题,需要分若干种情况分别讨论,如果使用MATLAB求解,只需直接给出下面的命令即可。

     >> syms x n real; f=x^n; L1=limit(f,n,inf), L2=limit(f,x,inf)

得出的结果均为分段函数,其中L2的描述为

     piecewise([n == 0,1],[0 < n,Inf],[n < 0,0])

这两个极限的结果可以解读成(其中L1结果最末一个条件有误,应该包括x=0,即−1<x<1)

3.1.6 无穷小量与无穷大量

这里首先给出几个相关的定义,然后介绍这类问题的求解方法。

定义3-2,则称f(x)为x→x0时的无穷小量(infinitesimal)。

定义3-3 对一个无穷小量的函数,如果,其中c为常数,p>0,则称f(x)为p阶无穷小量。

定义3-4 假设f(x)与g(x)都是无穷小量,如果,且c=0,则f(x)称为g(x)的高阶无穷小量,记作f(x)=o(g(x);如果c为非零常数,则f(x)与g(x)为同阶无穷小量,或f(x)与cg(x)等价,记作f(x)∼cg(x)。

定义3-5 如果,则称f(x)为x→x0时的无穷大量。

定义3-6,其中c为常数,p>0,则称f(x)为p阶无穷大量。

例3-13 试证明x→0时

如果想证明两个无穷小量函数等价,则应该求其比值的极限,如果这个极限等于有界非零常数,则两个无穷小量是等价的。这个例子可以用下面的语句直接验证,因为极限的值为−1,所以这个函数等价。

     >> syms x; f(x)=asin(x/sqrt(1-x^2))/log(1-x);  limit(f,0)