|
|
看推薦的帖子,積分用 quadgk,出結果了~~
【http://blog.sina.com.cn/s/blog_8138d87601013wrk.html】
四、[q,errbnd] = quadgk(fun,a,b,param1,val1,param2,val2,...)
自適應Gauss-Kronrod數(shù)值積分,適用于高精度和震蕩數(shù)值積分,支持無窮區(qū)間,并且能夠處理端點包含奇點的情況,同時還支持沿著不連續(xù)函數(shù)積分,復數(shù)域線性路徑的圍道積分法。
注意事項:
1.積分限[a,b]可以是[-inf,inf],但必須快速衰減;
2.被積函數(shù)在端點可以有奇點,如果區(qū)間內(nèi)部有奇點,將以奇點區(qū)間劃分成多個,也就是說奇點只能出現(xiàn)在端點上;
3.被積函數(shù)可以劇烈震蕩;
4.可以計算不連續(xù)積分,此時需要用到'Waypoints'參數(shù),'Waypoints'中的點必須嚴格單調(diào);
5.可以計算圍道積分,此時需要用到'Waypoints'參數(shù),并且為復數(shù),各點之間使用直線連接;
6.param,val為函數(shù)的其它控制參數(shù),比如上面的'waypoints'就是,具體看幫助。
出現(xiàn)錯誤:
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)。
>>F=@(x)exp(x).*log(x);%奇點必須在端點上,否則請先進行區(qū)間劃分。
>>Q = quadgk(F,0,1)
Q =
-1.3179
例5 計算半無限震蕩積分int(x^5*exp(-x)*sin(x),0,inf)。
>>F=@(x)x.^5.*exp(-x).*sin(x);
>>fplot(F,[0,100])%繪圖,看看函數(shù)的圖形
>>[q,errbnd] = quadgk(F,0,inf,'RelTol',1e-8,'AbsTol',1e-12)%積分限中可以有inf,但必須快速收斂
q =
-15.0000
errbnd =
9.4386e-009
例6 計算不連續(xù)積分,積分函數(shù)為f(x)=x^5*exp(-x)*sin(x),但是人為定義f(2)=1000,f(5)=-100,積分區(qū)間為[1 10]。
>>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 計算圍道積分,在復數(shù)域內(nèi),積分函數(shù)1/(2*z-1),積分路徑為由[-1-i 1-i 1+i -1+i -1-i]圍成的矩形邊框。
>>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 |
|