1.4 符号微积分
这一节讨论一些微积分符号计算,先从级数计算开始。symsum() 函数实现符号表达求和。比如,求解如下级数之和:
如下代码实现求和运算:
syms n sum_1 = symsum(1/2^n,n,0,Inf) % sum_1 = % 2
再如求解下列级数之和:
具体代码如下:
syms n sum_2 = symsum((-1)^(n-1)/n,n,1,Inf) % sum_2 = % log(2)
和symsum() 函数类似的还有symprod()。symprod() 可求解级数乘积。MATLAB帮助文档提供了两个例子:
对应代码如下:
syms k P1 = symprod(1 - 1/k^2, k, 2, Inf) % P1 = 1/2 P2 = symprod(k^2/(k^2 - 1), k, 2, Inf) % P1 = 2
在丛书第一册数学部分使用过limit() 求解极限,本节再简单介绍一下。表1.5总结了limit() 函数求解极限的典型情况。
表1.5 limit() 求解极限
下列代码实现了表1.5中的一部分极限运算:
syms x f1 = sin(x)/x; limit(f1,x,0) % ans = % 1 f2 = 1/x; limit(f2,x,Inf) % ans = % 0 limit(f2,x,0,'right') % ans = % Inf limit(f2,x,0,'left') % ans = % -Inf
丛书前文经常使用泰勒展开函数taylor(),下面展开讲解下这个函数。该函数默认前五阶展开,默认展开点为0,比如以下三个例子:
syms x T1 = taylor(exp(x)) % T1 = % x^5/120 + x^4/24 + x^3/6 + x^2/2 + x + 1 % T2 = taylor(sin(x)) % T2 = % x^5/120 - x^3/6 + x % T3 = taylor(cos(x)) % T3 = % x^4/24 - x^2/2 + 1
通过'ExpansionPoint' 可修改taylor() 展开点,而用'Order'则可修改taylor() 展开阶数。
syms x T1 = taylor(exp(x), x, , 1, 'Order', 9) T2 = taylor(sin(x), x, 'ExpansionPoint', 1, 'Order', 9) T3 = taylor(cos(x), x, 'ExpansionPoint', 1, 'Order', 9)
taylor() 还可以对多元函数进行泰勒展开,比如以下二元函数的例子:
syms x y f = x^2 + y^2 + x*y; T = taylor(f, [x, y], [1, 1], 'Order', 4) % T = % 3*x + 3*y + (x - 1)*(y - 1) + (x - 1)^2 + (y - 1)^2 – 3
丛书前文还经常用到diff()函数,这个函数用于求解符号微分式。这里也展开介绍一下diff(),比如下例:
如下代码获得上式结果。
syms f(x) f(x) = sin(x^2); df = diff(f,x) % df(x) = % 2*x*cos(x^2)
x = 2时,f(x)的一阶导数值计算如下:
syms f(x) format long f(x) = sin(x^2); df = diff(f,x); df_x2 = df(2) % df_x2 = % 4*cos(4) double(df_x2) % -2.614574483454448 eval(df_x2) % -2.614574483454448
diff() 还可求解不同阶数导数,比如下面几个例子。
syms f(x,t) f(x,t) = sin(x*t^2); diff(f(x,t),2) % diff(f,2) % ans = % -t^4*sin(t^2*x) diff(f(x,t),3) % diff(f,3) % ans = % -t^6*cos(t^2*x) diff(f(x,t),2,t) % diff(f,2,t) % ans = % 2*x*cos(t^2*x) - 4*t^2*x^2*sin(t^2*x) diff(f(x,t),3,t) % diff(f,3,t) % ans = % - 8*t^3*x^3*cos(t^2*x) - 12*t*x^2*sin(t^2*x)
与diff() 函数类似的还有functionalDerivative()。
int() 函数求解符号函数的不定积分和定积分。比如,用int() 计算下列积分式的不定积分、定积分和二重积分等:
具体代码如下:
syms f(x) f(x) = cos(x); indefinite_integral = int(f) % indefinite_integral(x) = % sin(x) definite_integral = int(f,0,pi/3) % definite_integral = % 3^(1/2)/2 definite_integral2 = int(f,a,b) % definite_integral2 = % sin(b) - sin(a) indefinite_integral_int = int(int(f)) % indefinite_integral_int(x) = % -cos(x)
对于多元函数,int()可对不同变量积分,比如下例可用int()对变量x,t分别积分。
具体代码如下:
syms f(x,t) f(x,t) = x/(1+t^2); Fx = int(f,x) % Fx(x, t) = % x^2/(2*(t^2 + 1)) Ft = int(f,t) % Ft(x, t) = % x*atan(t)
MATLAB还有一个专门计算积分的函数integral()。注意,integral() 的输入为函数句柄;如果函数表达式以符号表达定义,则需要用matlabFunction() 将符号表达转换为函数句柄。
syms x f_sym = exp(-x.^2).*log(x).^2; % Symbolic fun = matlabFunction(f_sym); Fx1 = integral(fun,0,Inf) % Fx1 = % 1.947522220295560 %% fun2 = @(x,t) x/(1+t^2); Fx2 = integral(@(x)fun2(x,5),0,5) % Fx = % 0.480769230769231 Ft = integral(@(t)fun2(t,2),0,2) % Ft = % 0.400000000000000
类似这样的积分函数还有integral2() 和integral3()。