7.6 符号微积分
微积分运算在数学计算中的重要性是不言而喻的,整个高等数学就是建立在微积分运算的基础上的。同时微积分运算也是后面求解符号微分方程的必要知识储备。
在符号数学工具箱中提供了一些常用的函数来支持具有重要基础意义的微积分运算,涉及求极限、微分、积分、级数求和和泰勒级数等。下面将具体介绍符号运算在微积分中的使用方法。
7.6.1 符号表达式的极限
求微分的基本思想是当自变量趋近某个值时,求函数值的变化。“无穷逼近”是微积分的一个基本思想,求极限是非常普遍的。事实上,导数就是由极限给出的:
在MATLAB中,用函数limit来求符号表达式的极限。函数limit的调用格式如下。
● limit(F,x,a):求当x→a时,符号表达式F的极限。
● limit(F,a):符号表达式F采用默认自变量(可由函数findsym求得),该函数求F的自变量趋近于a时的极限值。
● limit(F):符号表达式F采用默认自变量,并以a=0作为自变量的趋近值,从而求符号表达式F的极限值。
● limit(F,x,a,'right')或limit(F,x,a,'left'):分别求取符号表达式F的左极限和右极限,即自变量从左边或右边趋近于a时的函数极限值。
例7-25:求符号表达式的极限示例。
在命令行窗口中输入:
syms x; f1 = sym((cos(x) + sin(x) - x) / x) limit(f1, x, inf)
输出结果:
f1 = (cos(x) - x + sin(x))/x ans = -1
在命令行窗口中输入:
limit(f1, x, -inf)
输出结果:
ans = -1
在命令行窗口中输入:
limit(f1, x, 0)
输出结果:
ans = NaN
在命令行窗口中输入:
f2 = sym((sin(x) - x) / x) limit(f2, x, 0, 'right')
输出结果:
f2 = -(x - sin(x))/x ans = 0
在命令行窗口中输入:
limit(f2, x, 0, 'left')
输出结果:
ans = 0
7.6.2 符号表达式的微分
MATLAB提供的函数可以完成一元及多元符号表达式函数的各阶微分,功能函数diff可以完成一元或多元函数的任意阶数的微分。对于自变量的个数多于一个的符号矩阵,微分为Jacobian矩阵,采用功能函数jacobian实现微分。
1.diff函数
当创建符号表达式后,就可以利用diff函数对它进行微分运算。diff函数的调用格式如下。
● diff(S,'v'):将符号“v”视作变量,对符号表达式或符号矩阵S求取微分。
● diff(S,n):将S中的默认变量进行n阶微分运算,其中默认变量可以用findsym函数确定,参数n必须是正整数。
● diff(S,'v',n):将符号“v”视作变量,对符号表达式或矩阵S进行n阶微分运算。
2.jacobian函数
jacobian函数的调用格式如下。
● R=jacobian(w,v):其中w是一个符号列向量,v是指定进行变换的变量所组成的行向量。
例7-26:求符号表达式的微分示例。
在命令行窗口中输入:
syms x y z; f1 = sym(exp(x * sin(y)) + log(z)) diff(f1, x)
输出结果:
f1 = exp(x*sin(y)) + log(z) ans = exp(x*sin(y))*sin(y)
在命令行窗口中输入:
diff(f1, y)
输出结果: ans = x*exp(x*sin(y))*cos(y)
在命令行窗口中输入:
diff(f1, z)
输出结果:
ans = 1/z
在命令行窗口中输入:
diff(f1, x, 2)
输出结果:
ans = exp(x*sin(y))*sin(y)^2
在命令行窗口中输入:
f2 = sym([x^2 + y^2; y * z]) J = jacobian(f2, [x, y])
输出结果:
f2 = x^2 + y^2 y*z J = [ 2*x, 2*y] [ 0, z]
7.6.3 符号表达式的积分
在数学中,积分和微分是一对互逆的运算。符号数学工具箱中提供了函数int来求符号表达式的积分,其调用格式如下。
● R=int(S):用默认变量求符号表达式S的不定积分,默认变量可用函数findsym确定。
● R=int(S,v):用符号标量v作为变量求符号表达式S的不定积分值。
● R=int(S,a,b):符号表达式采用默认变量,该函数求默认变量从a变到b时符号表达式S的定积分值。如果S是符号矩阵,那么积分将对各个元素分别进行,而且每个元素的变量也可以独立地由函数findsym来确定,a和b可以是符号或数值标量。
● R=int(S,v,a,b):符号表达式采用符号标量v作为标量,求当v从a变到b时,符号表达式S的定积分值。其他参数和上一种调用格式相同。
例7-27:求符号表达式的积分示例。
在命令行窗口中输入:
syms x y; f1 = sym(x + x^-1) int(f1)
输出结果:
f1 = x + 1/x ans = log(x) + x^2/2
在命令行窗口中输入:
f2 = sym(x * y + (x * y)^-1) int(f2, y)
输出结果:
f2 = 1/(x*y) + x*y ans = log(y)/x + (x*y^2)/2
在命令行窗口中输入:
int(f1, 1, 2)
输出结果:
ans = log(2) + 3/2
在命令行窗口中输入:
int(f2, y, 1, 2)
输出结果:
ans = (3*x)/2 + log(2)/x
7.6.4 符号表达式的级数求和
MATLAB提供的函数symsum用于对符号表达式进行求和,该函数的调用格式如下。
● r=symsum(s,a,b):求符号表达式s中默认变量从a变到b时的有限和。
● r=symsum(s,v,a,b):求符号表达式s中变量v从a变到b时的有限和。
例7-28:符号表达式级数求和示例。
在命令行窗口中输入:
syms x y n; f1 = sym(x^2) symsum(f1, 0, n - 1)
输出结果:
f1 = x^2 ans = (n*(2*n - 1)*(n - 1))/6
在命令行窗口中输入:
f2 = sym(x^n) symsum(f2, n, 0, inf)
输出结果:
f2 = x^n ans = piecewise(1 <= x, Inf, abs(x) < 1, -1/(x - 1))
在 MATLAB 中,piecewise 函数用于定义分段函数。它允许你以一种简洁的方式描述函数在不同区间上的不同定义。
在上述得到的结果中,piecewise(1 <= x, Inf, abs(x) < 1, -1/(x - 1)) 表示了一个分段函数。它包含两个部分:
第一个部分是条件 1 <= x,当满足这个条件时,函数的值被设置为 Inf,表示正无穷大。
第二个部分是条件 abs(x) < 1,当满足这个条件时,函数的值被设置为 -1/(x - 1)。
换句话说,这个分段函数在 x >= 1 的区间上的值为正无穷大,而在 -1 < x < 1 的区间上的值为 -1/(x - 1)。对于其他的 x 值,该函数没有给出明确的定义。
7.6.5 符号表达式的泰勒级数
MATLAB提供函数taylor用来求符号表达式的泰勒级数展开式,该函数的调用格式如下。
● r=taylor(f):f是符号表达式,其变量采用默认变量,该函数将返回f在变量等于0处作5阶泰勒展开时的展开式。
● r=taylor(f,n,v):符号表达式f以符号标量v作为自变量,返回f的n-1阶麦克劳林级数(在v=0处作泰勒展开)展开式。
● r=taylor(f,n,v,a):返回符号表达式f在v=a处作n-1阶泰勒展开时的展开式。
● r=taylor(f,x,x0,'Order',n):对函数f在点x0处进行n阶泰勒展开。
例7-29:符号表达式的泰勒级数展开示例。
在命令行窗口中输入:
syms x y; f1 = sym(sin(x) / (2 + sin(x))) taylor(f1)
输出结果:
f1 = sin(x)/(sin(x) + 2) ans = - (13*x^5)/480 + x^4/48 + x^3/24 - x^2/4 + x/2
在命令行窗口中输入:
f2 = sym(sin(x) + 1 / cos(y)) taylor(f2, y, 0, 'order', 8)
输出结果:
f2 = sin(x) + 1/cos(y) ans = (61*y^6)/720 + (5*y^4)/24 + y^2/2 + sin(x) + 1
在命令行窗口中输入:
taylor(f2, x, 1, 'order', 4)
输出结果:
ans = sin(1) - (sin(1)*(x - 1)^2)/2 + 1/cos(y) + cos(1)*(x - 1) - (cos(1)*(x - 1)^3)/6