- MATLAB金融風險管理師FRM(高階實戰)
- 姜偉生 涂升 李蓉
- 945字
- 2021-03-26 23:39:49
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()。