MATLAB金融风险管理师FRM(高阶实战)
上QQ阅读APP看书,第一时间看更新

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时,fx)的一阶导数值计算如下:

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()对变量xt分别积分。

具体代码如下:

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()。