Matlab中幾個數值積分函數的比較和優缺點


一、Z = trapz(X,Y,dim)
梯形數值積分,通過已知參數x,ydim維使用梯形公式進行積分

1 計算int(sin(x),0,pi)

%by dynamic
%all rights reserved by www.matlabsky.com
>>x=0:pi/100:2*pi;
>>y=sin(x);
>>z=trapz(x,y)%
或者說使用z = pi/100*trapz(y)
z =

1.0300e-017

>>z = pi/100*trapz(y)

二、[q,fcnt]= quad(fun,a,b,tol,trace,p1,p2...)
自適應simpson公式數值積分,適用於精度要求低,被積函數平滑性較差的數值積分

注意事項:
1.
被積函數fun必須是函數句柄
2.
積分限[a,b]必須是有限的,因此不能爲inf
3.p1
爲其他需要傳遞的參數,一般是數值

可能警告:
1.'Minimum step size reached'
意味着子區間的長度與計算機舍入誤差相當,無法繼續計算了。原因可能是有不可積的奇點
2.'Maximum function count exceeded'
意味着積分遞歸計算超過了10000次。原因可能是有不可積的奇點
3.'Infinite or Not-a-Number function value encountered'
意味着在積分計算時,區間內出現了浮點數溢出或者被零除。

2 計算積分1/(x^3-2*x-p),其中參數p=5,積分區間爲[0,2]

%by dynamic
%all rights reserved by www.matlabsky.com
>>F = @(x,n)1./(x.^3-2*x-n);
>>Q = quad(@(x)F(x,5),0,2)%
或者使用 quad(F,0,2,[],[],5)效果是一樣的,只是前者使用的函數嵌套

Q =

-0.4605

>>quad(F,0,2,[],[],5)

ans =

-0.4605

三、[q,fcnt] = quadl(fun,a,b,tol,trace,p1,p2...)
自適應Lobatto數值積分,適用於精度要求高,被積函數曲線比較平滑的數值積分

注意事項:
quad

可能警告:
quad

3 計算積分1/(x^3-2*x-p),其中參數p=5,積分區間爲[0,2]

%by dynamic
%all rights reserved by www.matlabsky.com
>>F=@(x,p)1./(x.^3-2*x-p);
>>Q = quadl(F,0,2,[],[],5)%
或者Q = quadl(@(x)F(x,5),0,2)

Q =

-0.4605

四、[q,errbnd] = quadgk(fun,a,b,param1,val1,param2,val2,...)
自適應Gauss-Kronrod數值積分,適用於高精度和震盪數值積分,支持無窮區間,並且能夠處理端點包含奇點的情況,同時還支持沿着不連續函數積分,複數域線性路徑的圍道積分法

注意事項:
1.
積分限[a,b]可以是[-inf,inf],但必須快速衰減
2.
被積函數在端點可以有奇點,如果區間內部有奇點,將以奇點區間劃分成多個,也就是說奇點只能出現在端點上
3.
被積函數可以劇烈震盪
4.
可以計算不連續積分,此時需要用到'Waypoints'參數,'Waypoints'中的點必須嚴格單調
5.
可以計算圍道積分,此時需要用到'Waypoints'參數,並且爲複數,各點之間使用直線連接
6.param,val
爲函數的其它控制參數,比如上面的'waypoints'就是,具體看幫助

出現錯誤:
1.'Reached the limit on the maximum number of intervals in use'
2.'Infinite or Not-a-Number function value encountered'

4 計算有奇點積分int(exp(x)*log(x),0,1)

%by dynamic
%all rights reserved by www.matlabsky.com
>>F=@(x)exp(x).*log(x);%
奇點必須在端點上,否則請先進行區間劃分
>>Q = quadgk(F,0,1)

Q =

-1.3179

5 計算半無限震盪積分int(x^5*exp(-x)*sin(x),0,inf)

%by dynamic
%all rights reserved by www.matlabsky.com
>>F=@(x)x.^5.*exp(-x).*sin(x);
>>fplot(F,[0,100])%
繪圖,看看函數的圖形
>>[q,errbnd] = quadgk(F,0,inf,'RelTol',1e-8,'AbsTol',1e-12)%
積分限中可以有inf,但必須快速收斂

q =

-15.0000


errbnd =

9.4386e-009

6 計算不連續積分,積分函數爲f(x)=x^5*exp(-x)*sin(x),但是人爲定義f(2)=1000f(5)=-100,積分區間爲[1 10]

%by dynamic
%all rights reserved by www.matlabsky.com
>>F=@(x)x.^5.*exp(-x).*sin(x);
>>[q,errbnd] = quadgk(F,1,10,'Waypoints',[2 5])%
顯然25爲間斷點

q =

-10.9408


errbnd =

3.2296e-014

7 計算圍道積分,在複數域內,積分函數1/(2*z-1),積分路徑爲由[-1-i 1-i 1+i -1+i -1-i]圍成的矩形邊框

%by dynamic
%all rights reserved by www.matlabsky.com
>>Waypoints=[-1-i 1-i 1+i -1+i -1-i];
>>plot(Waypoints);%
繪製積分路徑
>>xlabel('Real axis');ylabel('Image axis');axis([-1.5 1.5 -1.5 1.5]);grid on;
>>Q = quadgk(@(z)1./(2*z - 1),-1-i,-1-i,'Waypoints',[1-i,1+i,-1+i])%
注意各點間使用直線連接

ans =

0.0000 + 3.1416i

>> quadgk(@(z)1./(2*z - 1),-1-i,-1-i,'Waypoints',Waypoints)%
使用這個的效果也是一樣的,就是說始末點可以隨便包不包含在Waypoints

ans =

0.0000 + 3.1416i

五、[Q,fcnt] = quadv(fun,a,b,tol,trace)
矢量化自適應simpson數值積分

注意事項:
1.
該函將quad函數矢量化了,就是一次可以計算多個積分
2.
所有的要求完全與quad相同

8 計算下面積分,分別計算n=1,2...,5時的5個積分值,被積函數1/(n+x),積分限爲[0,1]

%by dynamic
%all rights reserved by www.matlabsky.com
>>for k = 1:5, Qs(k) = quadv(@(x)1/(k+x),0,1);end;Qs

Qs =

0.6931 0.4055 0.2877 0.2231 0.1823

>>F=@(x,n)1./((1:n)+x);%
定義被積函數
>>quadv(@(x)F(x,5),0,1)%
我們可以完全使用quadv函數替換上面循環語句的,建議使用後者

ans =

0.6931 0.4055 0.2877 0.2231 0.1823

六、q = dblquad(fun,xmin,xmax,ymin,ymax,tol,method)
矩形區域二重數值積分,一般區域二重積分參見NIT(數值積分工具箱)quad2dggen函數

9 計算下面二重積分

%by dynamic
%all rights reserved by www.matlabsky.com
>>F = @(x,y)y*sin(x)+x*cos(y);
>Q = dblquad(F,pi,2*pi,0,pi)

Q =

-9.8696

七、q=triplequad(fun,xmin,xmax,ymin,ymax,zmin,zmax,tol,method)
長方體區域三重數值積分,注意此時沒有一般區域的三重積分

10 計算下面三重積分

%by dynamic
%all rights reserved by www.matlabsky.com
>>F = @(x,y,z)y*sin(x)+z*cos(x);
>>Q = triplequad(F,0,pi,0,1,-1,1)

Q =

2.0000

八、超維長方體區域多重積分
quadndgNIT工具箱函數,可以解決多重超維長方體邊界的定積分問題,但沒有現成的一般積分區域求解函數


下面總結下:
(1)quad
:採用自適應變步長simpson方法,速度和精度都是最差的,建議不要使用
(2)quad8
:使用8Newton-Cotes算法,精度和速度均優於quad,但在目前版本下已被取消
(3)quadl
:採用lobbato算法,精度和速度均較好,建議全部使用該函數
(4)quadg
NIT(數值積分)工具箱函數,效率最高,但該工具箱需要另外下載
(5)quadv
quad的矢量化函數,可以同時計算多個積分
(6)quadgk
:很有用的函數,功能在Matlab中最強大
(7)quad2dggen
:一般區域二重積分,效率很好,需要NIT支持
(8)dblquad
:長方形區域二重積分
(9)triplequadL
:長方體區域三重積分
(10)quadndg
:超維長方體區域積分,需要NIT支持

NIT數值積分工具箱下載參見這裏http://www.matlabsky.com/thread-225-1-2.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章