小小知識點(十二)利用MATLAB計算定積分


 一重定積分

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

%舉例說明1

clc clear all % int(sin(x),0,pi) x=0:pi/100:pi; %積分區間 y=sin(x); %被積函數 z = trapz(x,y) %計算方式一 z = pi/100*trapz(y) %計算方式二
 

運行結果

被積函數曲線

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

      [q,fcnt] = quadl(fun,a,b,tol,trace,p1,p2...) 

自適應龍貝格數值積分,適用於精度要求高,積分限[a,b]必須是有限的,被積函數曲線比較平滑的數值積分 

%舉例說明2
% 被積函數1/(x^3-2*x-p),其中參數p=5,積分區間為[0,2]
clc
clear all
F = @(x,n)1./(x.^3-2*x-n); %被積函數
Q1 = quad(@(x)F(x,5),0,2)   %計算方式一
Q1 = quad(F,0,2,[],[],5)    %計算方式二
Q2 = quadl(@(x)F(x,5),0,2)   %計算方式一
Q2 = quadl(F,0,2,[],[],5)    %計算方式二

運行結果

被積函數曲線

可能警告: 
1.'Minimum step size reached' 
意味着子區間的長度與計算機舍入誤差相當,無法繼續計算了。原因可能是有不可積的奇點

2.'Maximum function count exceeded'  
意味着積分遞歸計算超過了10000次。原因可能是有不可積的奇點

3.'Infinite or Not-a-Number function value encountered'

意味着在積分計算時,區間內出現了浮點數溢出或者被零除。

3、[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'

%舉例說明3
%(1)計算有奇點積分
clc
clear all
F=@(x)exp(x).*log(x);
Q = quadgk(F,0,1)   

運行結果

 

被積函數曲線

 

%舉例說明3
%(2)計算半無限震盪積分
clc
clear all
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,但必須快速收斂  

 運行結果

被積函數曲線

%舉例說明3
%(3)計算不連續積分
clc
clear all
F=@(x)x.^5.*exp(-x).*sin(x); 
[q,errbnd] = quadgk(F,1,10,'Waypoints',[2 5])%顯然2,5為間斷點 

運行結果

被積函數曲線

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

注意事項: 
1.該函將quad函數矢量化了,就是一次可以計算多個積分

2.所有的要求完全與quad相同 

 

%舉例說明4
% 計算下面積分,分別計算n=1,2...,5時的5個積分值,被積函數1/(n+x),積分限為[0,1]
clc
clear all
%計算多個積分值(一)
for k = 1:5,        
    Qs(k) = quadv(@(x)1/(k+x),0,1)
end;
%同時%計算多個積分值的方法(二)
F=@(x,n)1./((1:n)+x);%定義被積函數 
quadv(@(x)F(x,5),0,1)%我們可以完全使用quadv函數替換上面循環語句的,建議使用(二)

運行結果:

二重積分 

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

% 例 計算下面二重積分  

F = @(x,y)y*sin(x)+x*cos(y);

Q = dblquad(F,pi,2*pi,0,pi) 

三重定積分

q=triplequad(fun,xmin,xmax,ymin,ymax,zmin,zmax,tol,method)

長方體區域三重數值積分,注意此時沒有一般區域的三重積分

%例 計算下面三重積分

F = @(x,y,z)y*sin(x)+z*cos(x);

Q = triplequad(F,0,pi,0,1,-1,1) 

超維長方體區域多重積分 

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

總結

quad:采用自適應變步長simpson方法,速度和精度都是最差的,建議不要使用 

quad8:使用8階Newton-Cotes算法,精度和速度均優於quad,但在目前版本下已被取消

quadl:采用lobbato算法,精度和速度均較好,建議全部使用該函數

quadg:NIT(數值積分)工具箱函數,效率最高,但該工具箱需要另外下載

quadv:quad的矢量化函數,可以同時計算多個積分

quadgk:很有用的函數,功能在Matlab中最強大 
quad2dggen:一般區域二重積分,效率很好,需要NIT支持

dblquad:長方形區域二重積分 (

triplequadL:長方體區域三重積分 
quadndg:超維長方體區域積分,需要NIT支持

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM