一、數值微分
(1)數值差分與差商
微積分中,任意函數f(x)在x0點的導數是通過極限定義的:
如果去掉極限定義中h趨向於0的極限過程,得到函數在x0點處以h(h>0)為步長的向前差分、向後差分和中心差分差分公式:
向前差分:
向後差分:
中心差分:
當步長h充分小時,得到函數在x0點處以h(h>0)為步長的向前差商、向後差商和中心差商公式:
向前差商:
向後差商:
中心差商:
函數f(x)在點x0的微分接近於函數在該點的差分,而f在點x的導數接近於函數在該點的差商。
(2)數值微分的實現
MATLAB提供了求向前差分的函數diff,其調用格式有三種:
①dx=diff(x):計算向量x的向前差分,dx(i)=x(i+1)-x(i),i=1,2,...,n-1。
②dx=diff(x,n):計算向量x的n階向前差分。例如,diff(x,2)=diff(diff(x))。
③dx=diff(A,n,dim):計算矩陣A的n階差分,dim=1時(默認狀態),按列計算差分;dim=2,按行計算差分。
注意:diff函數計算的是向量元素間的差分,故差分向量元素的個數比原向量少了一個。同樣,對於矩陣來說,差分後的矩陣比原矩陣少了一行或一列。
另外,計算差分之後,可以用f(x)在某點處的差商作為其導數的近似值。
【例】設f(x)=sin x,在[0,2π]範圍內隨機採樣,計算f』(x)的近似值,並與理論值f』(x)=cos x進行比較。
>> x=[0,sort(2*pi*rand(1,5000)),2*pi];>> y=sin(x);>> f1=diff(y)./diff(x);>> f2=cos(x(1:end-1));>> plot(x(1:end-1),f1,x(1:end-1),f2);>> d=norm(f1-f2)
d =
0.0456
二、數值積分
(1)數值積分基本原理
在高等數學中,計算定積分依靠微積分基本原理,只要找到被積函數f(x)的原函數F(x),則可用牛頓—萊布尼茲(Newton-Leibinz)公式:
在有些情況下,應用牛頓—萊布尼茲公式有困難,例如,當被積函數的原函數無法用初等函數表示,或被積函數是用離散的表格形式給出的。這是就需要用數值解法來求定積分的近似值。
求定積分的數值方法多種多樣,如梯形法、辛普森法,高斯求積公式等。它們的基本思想都是將積分區間[a,b]分成n個子區間[xi,xi+1],i=1,2,...,n,其中x1=a,xn+1=b,這樣求定積分問題就分解為下面的求和問題:
在每一個小的子區間上定積分的值可以近似求得,從而避免了牛頓—萊布尼茲公式需要尋求原函數的困難。
(2)數值積分的實現
①基於自適應辛普森方法
[I,n]=quad(filename,a,b,tol,trace)
②基於自適應Gauss-Lobatto方法
[I,n]=quadl(filename,a,b,tol,trace)
其中,filename是被積函數名;a和b分別是定積分的下限和上限,積分限[a,b]必須是有限的,不能為無窮大(Inf);tol用來控制積分精度,默認時取tol=10-6;trace控制是否展現積分過程,若取非0則展現積分過程,取0則不展現,默認時取trace=0;返回參數I即定積分的值,n為被積函數的調用次數。
【例】分別用quad函數和quadl函數求定積分的近似值,並在相同的積分精度下,比較被積函數的調用次數。
>> format long>> f=@(x) 4./(1+x.^2);>> [I,n]=quad(f,0,1,1e-8)
I =
3.141592653733437
n =
61
>> [I,n]=quadl(f,0,1,1e-8)
I =
3.141592653589806
n =
48
>> (atan(1)-atan(0))*4
ans =
3.141592653589793
>> format short
③基於全局自適應積分方法
I=intergral(filename,a,b)
其中,I是計算得到的積分;filename是被積函數;a和b分別是定積分的下限和上限,積分限可以為無窮大。
【例】求定積分。
被積函數文件fe.m:
function f=fe(x)f=1./(x.*sqrt(1-log(x).^2));
>> I=intergral(@fe,1,exp(1))>> I=integral(@fe,1,exp(1))
I =
1.5708④基於自適應高斯—克朗羅德方法
[I,err]=quadgk(filename,a,b)
其中,err返回近似近似誤差範圍,其他參數的含義和用法與quad函數相同。積分上下限可以是無窮大(-Inf或Inf),也可以是複數。如果積分上下限是複數,則quadgk函數在複平面上求積分。
【例】求定積分。
被積函數文件fsx.m:
function f=fsx(x)f=sin(1./x)./x.^2;
>> I=quadgk(@fsx,2/pi,+Inf)
I =
1.0000⑤基於梯形積分方法
已知(xi,yi)(i=1,2,...,n),且a=x1<x2<...<xn=b,求近似值。
I=trapz(x,y)
其中,向量x、y定義函數關係y=f(x)。
trapz函數採用梯形積分法則,積分的近似值為:
其中,hi=xi+1-xi
可以用以下語句實現:
sum(diff(x).*(y(1:end-1)+y(2:end))/2)
【例】設x=1:6,y=[6,8,11,7,5,2],用trapz函數計算定積分。
>> x=1:6;>> y=[6,8,11,7,5,2];>> plot(x,y,'-ko');>> grid on>> axis([1,6,0,11]);>> I1=trapz(x,y)
I1 =
35
>> I2=sum(diff(x).*(y(1:end-1)+y(2:end))/2)
I2 =
35
(3)多重定積分的數值求解
求二重積分的數值解:
I=integral2(filename,a,b,c,d)
I=quad2d(filename,a,b,c,d)
I=dblquad(filename,a,b,c,d,tol)
求三重積分的數值解:
I=integral3(filename,a,b,c,d,e,f)]
I=triplequad(filename,a,b,c,d,e,f,tol)
【例】分別求二重積分和三重積分。
>> f1=@(x,y)exp(-x.^2/2).*sin(x.^2+y);>> I1=quad2d(f1,-2,2,-1,1)
I1 =
1.5745
>> f2=@(x,y,z)4*x.*z.*exp(-z.*z.*y-x.*x);>> I2=integral3(f2,0,pi,0,pi,0,1)
I2 =
1.7328