2012-10-23 93 views
0

我要計算這個公式的迭代版本:如何使這種算法穩定

f(i)=integral (x^i/(4x+1)) from 0 to 1 

使用這些公式:

f(0)=ln(5)/4; 
f(i)=1/(i+1) - 4*f(i+1); 

我試圖嘗試以下內容:我計算積分(X^100 /(4x + 1))從0到1,並存儲結果。然後我使用迭代版本計算f(i)從這個結果開始。
但我得到錯誤的結果,因爲錯誤太大。
該錯誤僅適用於我< = 25。
我想知道,爲什麼這個算法不穩定,如果有解決方案來計算從i = 100或更高開始的結果。

這是代碼:

function y=Integral(i,max) 

if i==0 
    y=1/4*log(5); 
elseif i==max 
    y=0.0; 
else 
    y=1/(i+1)-4*Integral(i+1,max); 
end 


end 

有了這個功能,我從來沒有得到一個確切的數值,因爲累積誤差過high.I得到關閉值(但即使是3或4倍以上,所以不能接受)如果我使用i = 15和max = 18。我需要這個公式的穩定版本。

+1

不想確認這一點;是這樣的:「f(i)= 1 /(i + 1)-4 * f(i + 1)」的定義是否確切?另外,你可否請你發佈你的代碼,我對你做了什麼以及f(i)的意思有點困惑,因爲你定義了兩次...... – phil13131

+1

它看起來更像是一個數學作業而不是編程問題。 ... – Oli

+0

我同意,除非他提供的代碼是好的,並且錯誤的原因來自使用錯誤的變量,並且計算機上的某些計算結果不夠「確切」...... – phil13131

回答

2

這個遞歸函數應該做的工作,而不需要存儲的方式,以100分的結果:

function y = Integral(i) 

if i==0 
    y=log(5)/4; 
else 
    y = (-Integral(i-1) + 1/i)/4; 
end 
end 

遞歸工作,你需要開始從i = 100,然後調用函數與我-1直到它達到i = 0。

積分(100)將給出最終答案,而不需要存儲部分結果。

+0

是,這很有效。但只有一個問題:如果我是負面的,我該怎麼辦?拋出異常或返回南?你能告訴我如何處理這種價值觀嗎? –

+1

如果我沒有弄錯,對於i的負值,積分發散到inf,所以沒有必要爲它們計算,只需返回inf。 –