一重定積分
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)
超維長方體區域多重積分
quadndg:NIT工具箱函數,可以解決多重超維長方體邊界的定積分問題,但沒有現成的一般積分區域求解函數
總結
quad:采用自適應變步長simpson方法,速度和精度都是最差的,建議不要使用
quad8:使用8階Newton-Cotes算法,精度和速度均優於quad,但在目前版本下已被取消
quadl:采用lobbato算法,精度和速度均較好,建議全部使用該函數
quadg:NIT(數值積分)工具箱函數,效率最高,但該工具箱需要另外下載
quadv:quad的矢量化函數,可以同時計算多個積分
quadgk:很有用的函數,功能在Matlab中最強大
quad2dggen:一般區域二重積分,效率很好,需要NIT支持
dblquad:長方形區域二重積分 (
triplequadL:長方體區域三重積分
quadndg:超維長方體區域積分,需要NIT支持