matlab積分為什麼答案不對?


quad所採用的演算法是adaptive Simpson quadrature,

簡單來說這個演算法在提高計算速度的同時,會有可能損失一定的數值精度。因此,對於區間很大,但是「密度」很小積分問題不是很適用。

為驗證這一點,你可以嘗試把積分上界逐漸增大,然後從第二個輸出變數觀察函數被evaluate的次數。

比如:

1)

&>&> [Q,FCNT] = quad("1.437/2.*exp(-1.437*t).*(1.437*t).^2",0,10)

Q =

0.9999

FCNT =

65

(結果是0.9999,被積函數執行次數是65)

2)

&>&> [Q,FCNT] = quad("1.437/2.*exp(-1.437*t).*(1.437*t).^2",0,100)

Q =

1.0000

FCNT =

77

(結果是1,被積函數執行次數是77)

3)

但是把上界提到1000以後

&>&> [Q,FCNT] = quad("1.437/2.*exp(-1.437*t).*(1.437*t).^2",0,1000)

Q =

2.8043e-37

FCNT =

13

被積函數的調用次數只有13次了。一旦出現這樣的下降,就說明數值精度可能受到了影響。這個時候你可以考慮把幾個區間分開進行計算然後把結果相加,而不是使用這個區間用於一次計算。

最後,quad函數在今後的版本中會逐漸被integral取代。後者會有更好的準確性。quadgk也可以嘗試,它使用adaptive Gauss-Kronrod quadrature演算法,相對於quad來講,有更多的參數可以用於調整計算的過程。


quad是老版本的數值積分函數,精度不高,不適用的積分也比較多,目前版本建議使用integral函數

如果是老版本沒有這個函數的話可以使用quadgk計算這個積分

稍微解釋下:

quad的收斂的判斷依據是5點Simpson積分法和三點Simpson積分法的結果做差,小於一個容差就認為收斂。所以當函數值正好在區間劃分點很小而區間上存在較大值時這種判斷顯然是不正確的。舉個更直觀的例子:

&>&> quad(@(x)(x&>0).*(x&<1),0,1e5) ans = 0

這個被積函數值只有在0到1(不包含0,1)上為1,其餘部分皆為0,正確結果顯然為1,而區間的劃分點正好都取在其他部分,所以quad得到的結果為0

如果改一下

&>&> quad(@(x)(x&>=0).*(x&<1),0,1e5) ans = 0.999986321810219

這裡僅僅只是包含了初始的端點,這就會使得第一次計算不收斂而進行遞歸,最後結果就準確很多

其實包括integral在內的其他數值積分函數也有類似問題,不過它們的演算法相對而言更加健壯,檢測處理也要複雜一些,所以出錯的可能性小一些


應用MATLAB中的函數還是要看幫助文件的。

搞清楚每一種積分演算法的適用範圍。

通常而言,我會用一個while循環,逐步增加採樣點數,得到較好的近似解。


推薦閱讀:

matlab 函數返回值列表太長,覺得醜陋,怎麼辦?
Mathematica 為什麼沒有像matlab一樣的clear 和clc功能?
如何優雅地使用gams、matlab、AIMMS、LINGO?

TAG:MATLAB | Matlab2013A |