Issac Newton(1643–1727)和Gottfried Wilhelm Leibniz(1646–1716)创立的微积分学是很多科学分支的基础。单变量与多变量函数微积分、函数极限、级数求和、Taylor级数展开、 Fourier 级数展开、常微分方程等问题直接求解是微积分学的重要内容。MATLAB的符号运算工具箱可以直接求解这样问题的解析解。本章 3.1节中给出基于MATLAB 符号运算工具箱中函数的单边、多边极限问题及多变量函数极限问题的求解方法,3.2节介绍各种微分问题的计算机求解方法,3.3节介绍各种积分问题的解析求解方法。3.4将介绍给定单变量函数与多变量函数的 Taylor 幂级数展开、给定函数的 Fourier 级数逼近方法,利用 MATLAB 的绘图功能研究有限项拟合的拟合效果和适用范围;还介绍一般级数的求和与求积方法等。 3.5节中将介绍的两类曲线积分和两类曲面积分及其 MATLAB 求解方法补充了微积分学的计算机求解方式,这部分内容大部分均应该是解析求解和解析推导,属于计算机代数研究的领域,用传统的数值分析方法是不能求解的。对不熟悉计算机代数系统开发的读者来说,用C这样的底层语言直接进行解析解推导有极大难度,而必须使用计算机数学语言(如MATLAB语言)完成这类问题的分析与求解。
在实际科学与工程研究中,微积分问题解析求解有时也面临困难。例如,若函数本身未知,只有由科学实验测出的一些实验数据,则无法用推导的方式通过数据对其代表的函数求导或求积分,而需要通过数值的方式进行数值微分与数值积分的运算等。3.6节中将介绍实用的中心差分数值微分算法及其 MATLAB 语言实现,还将介绍多变量函数的偏微分求解方法与实例。在实际应用中还有很多函数积分的解析解不存在,所以需要通过数值积分的算法进行近似。3.7节中将介绍用数值算法求取函数积分及重积分问题的求解方法。若给出的数据点较稀疏,则基于数据直接求取数值微积分会有很大的误差,但可以结合第8章中介绍的样条插值方法对其求解。具体内容请参见第8章8.2节。
1.极限问题的解析解
应用 MATLAB 语言的符号运算工具箱,可以很容易地求解极限问题、微分问题、积分问题等微积分基本问题。利用本节和后面两节介绍的方法,读者应该能立即具备依赖MATLAB 语言及其符号运算工具箱中提供的强大函数直接求解一般微积分运算问题的能力。本节主要侧重各种极限问题的求解方法,包括单变量极限、单边极限和多重极限问题。
1.1单变量函数的极限
L = limit(f ,x,x0) %求极限
L = limit(f ,x,x0,'left' 或 'right') %求单边极限
1.2区间函数的极限运算
1.3多变量函数的极限
在 MATLAB 下,函数的累极限可以通过下面的语句直接求出,该函数嵌套地使用了limit() 函数:
L1 = limit(limit(f ,x,x0),y,y0)或 L1 = limit(limit(f ,y,y0),x,x0)
2.函数导数的解析解
2.1函数的导数和高阶导数
如果函数和自变量都已知,且均为符号变量,则可以用diff()函数解出给定函数的各阶导数。diff()函数的调用格式为f1 = diff(f ,x,n),其中,f为给定函数,x 为自变量,这两个变量均应该为符号型的,n为导数的阶次,若省略n则将自动求取一阶导数;如果f表达式中只有一个符号变量,还可以省略变量x。
2.2参数方程的导数
MATLAB 并没有提供可以直接用于参数方程的高阶导数求取的函数,所以我们应该自己编写一个通用函数来完成这项工作。
2.3多元函数的偏导数
MATLAB 的符号运算工具箱中并未提供求取偏导数的专门函数,这些偏导数仍然可以通过 diff() 函数直接实现。
2.4隐函数的偏导数
由于f对xi、xj的偏导数可以分别由 diff() 函数求出,故整个偏导数可以由它们的除法获得,所以这样的问题可以由 F1 = −diff(f ,xj)/diff(f ,xi) 直接得出。
2.5多元函数的 Jacobi 矩阵
Jacobi 矩阵可以由MATLAB的符号运算工具箱中的jacobian()函数直接求得,其调用格式为 J = jacobian(y,x)
2.4Hess 偏导数矩阵
新版 MATLAB 提供了 hessian() 函数可以直接求出原函数的Hess矩阵,调用格式为H = hessian(f ,x)
3.积分问题的解析解
3.1不定积分的推导
MATLAB 符号运算工具箱中提供了一个 int() 函数,可以直接用来求取符号函数的不定积分。该函数的调用格式为 F = int(f ,x) 。
3.2定积分与无穷积分计算
在 MATLAB 语言中仍然可以使用 int() 函数来求解定积分或无穷积分问题,该函数的具体调用格式为 I = int(f ,x,a,b)
3.3多重积分问题的MATLAB求解
多重积分问题也可以在MATLAB语言环境中直接求解,但需要根据实际情况先选择积分顺序,可积的部分作为内积分,然后再处理外积分。每步积分均采用 int()函数处理,如果交换积分顺序后仍然不能积出解析解,则说明原积分问题没有解析解,而需要采用数值方法求解原始的积分问题。
4.函数的级数展开与级数求和问题求解
本节将介绍给定的单变量函数与多变量函数的Taylor幂级数展开、各种函数的 Fourier级数展开、有穷级数与无穷级数求和、序列乘积等问题的计算机求解方法。
4.1Taylor 幂级数展开
Taylor 幂级数展开可由符号运算工具箱的 taylor() 函数直接导出,其调用格式为
F = taylor(f ,x,a,'Order',k), %关于 x = a 点进行 k 次 Taylor 幂级数展开
新版 MATLAB 的符号运算工具箱的 taylor() 函数可以直接进行多变量函数 Taylor 幂级数展开。该函数的调用格式为
F = taylor(f ,[x1,x2,· · · ,xn],[a1,a2,· · · ,an],'Order',k)
4.2Fourier 级数展开
MATLAB 语言未直接提供求解Fourier系数与级数的现成函数。我们为该函数编写了一个下级支持函数default vals()
[F ,A,B] = fseries(f ,x,p,a,b)
4.3级数求和的计算
符号运算工具箱中提供的symsum()可以用于已知通项的有穷或无穷级数求和。该函数调用格式为S = symsum(fk,k,k0,kn),其中,fk为级数的通项,k为级数自变量,k0和kn为级数求和的起始项与终止项,它们也可以是无穷量inf。
4.4序列求积问题
新版的 MATLAB符号运算工具箱提供了求解函数symprod()直接求取序列求积问题,其语句格式为 P = symprod(fn,n,a,b)
5.曲线积分与曲面积分的计算
5.1曲线积分及 MATLAB 求解
第一类曲面积分
曲线积分在高等数学中一般分为第一类曲线积分和第二类曲线积分。其中,第一类曲线积分问题起源于对不均匀分布的空间曲线总质量的求取
第二类曲面积分
第二类曲线积分问题又称为对坐标的曲线积分,它起源于变力?f (x, y, z) 沿曲线l移动时作功的研究。
5.2曲面积分与 MATLAB 语言求解
6.数值微分问题
前面介绍了已知原型函数,可以通过 diff() 函数求取各阶导数解析解的方法,并得出结论,高达 100 阶的导数也可以用 MATLAB 语言在几秒钟的时间内直接求出。应该指出,前面介绍的解析解方法的前提是原型函数为已知的。如果函数表达式未知,只有实验数据,在实际应用中经常也有求导的要求,这样的问题就不能用前面的方法获得问题的解析解。要求解这样的问题,需要引入数值算法得出所需问题的解。
6.1数值微分算法
基于前向和后向差分的数值微分算法求取高阶微分时的精度一般都是很低的,介绍两种中心差分的算法
6.2中心差分方法及其 MATLAB 实现
编写的 M-函数调用格式为[dy,dx] = diff_ctr(y,?t,n)
6.3二元函数的梯度计算
如果给定二元函数的函数值矩阵z,其中z为网格数据,则可以由gradient() 函数求取二元函数的梯度。该函数的调用格式为[fx,fy] = gradient(z)
7.数值积分问题
本节将分几种情况介绍数值积分问题的求解方法。首先,如果被积函数的数学表达式未知,则需要由实测数据通过梯形算法求出积分的近似值;如果被积函数已知,则将分别介绍一元函数积分、一元函数广义积分、二重积分以及多重积分问题。采用前面介绍的解析解方法和vpa()函数,可以得出任意一元函数的积分值,所以若安装了符号运算工具箱,则没有太大必要采用本节介绍的纯数值方法;对于重积分问题来说,如果内重积分是解析不可积的,则解析解方法是不能得出积分值的,必须采用数值积分方法.
7.1由给定数据进行梯形求积
假设已经建立起向量 x = [x1, x2, · · · , xN]T, y = [y1, y2, · · · , yN]T,则由 MATLAB 的trapz() 函数可以直接用梯形法求解积分问题,该函数调用格式为S = trapz(x,y)
7.2单变量数值积分问题求解
MATLAB 8.0 版开始引入新的自适应变步长数值积分求取函数 integral(),其调用格式为 I = integral(f ,a,b,属性设置对)
7.3广义数值积分问题求解
前面介绍的integral() 可以直接用于广义积分的求取,但该函数只能在 MATLAB 8.0 及后续版本下运行。早期版本中可以采用quadgk()函数求无穷积分,该函数采用了Gauss–Kronrod 算法。函数的调用格式与前面介绍的完全一致,直接在积分限位置给出-inf或inf即可。
7.4积分函数的数值求解
绘制出函数的积分函数曲线函数的调用格式为 [x,f1] = intfunc(f ,a,b,n)
7.5双重积分问题的数值解
使用 MATLAB 提供的 integral2() 函数就可以直接求出上述双重定积分的数值解。该函数的调用格式为 I = integral2(f ,xm,xM,ym,yM, 属性参数对)
7.6三重定积分的数值求解
可以由 MATLAB 提供的 integral3() 函数得出。该函数调用格式为
I = integral3(f ,xm,xM,ym,yM,zm,zM,属性参数对)
7.7多重积分数值求解
NIT 工具箱还可以解决多重超长方体边界的定积分问题,例如,使用 quadndg() 函数,但对一般积分区域来说则没有现成的求解函数。
该问题的求解语句为 I = quadndg(f ,[x1m, x2m, · · · , xpm],[x1M, x2M, · · · , xpM],?)