如何使这个算法稳定

时间:2012-10-23 14:24:47

标签: algorithm matlab numerical

我必须计算这个公式的迭代版本:

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);

我尝试了以下尝试:我从0到1计算积分(x ^ 100 /(4x + 1)),然后存储结果。然后我从这个结果开始计算f(i),使用迭代版本。
但是由于错误太大,我得错了结果 该错误仅对于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

使用此功能我从来没有得到一个确切的值,因为累积的误差太高。我得到一个接近的值(但即使高3或4倍,所以不可接受)如果我使用i = 15和max = 18.I需要这个公式的稳定版本。

1 个答案:

答案 0 :(得分: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开始,然后用i-1调用函数,直到它达到i = 0.

积分(100)将给出最终答案,而无需存储部分结果。