Matlab中幾個數值積分函數的比較和優缺點(轉載Matlab技術論壇)

本帖由Matlab技術論壇原創,原帖參見 http://www.matlabsky.com/thread-359-1-9.html


具體參數的意義我這里不詳細說明,大家可以看幫助系統,我們這里只是討論各大函數的區別比較和注意
一、Z = trapz(X,Y,dim)
梯形數值積分,通過已知參數x,y按dim維使用梯形公式進行積分
例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)=1000,f(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])%顯然2,5為間斷點
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

八、超維長方體區域多重積分
quadndg:NIT工具箱函數,可以解決多重超維長方體邊界的定積分問題,但沒有現成的一般積分區域求解函數
下面總結下:
(1)quad:采用自適應變步長simpson方法,速度和精度都是最差的,建議不要使用
(2)quad8:使用8階Newton-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
登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP