复合Simpson规则的MatLab算法

时间:2012-10-29 21:15:25

标签: matlab numerical-integration

为了它的乐趣,我试过为复合Simpson规则编写MatLab代码。据我所知,代码是正确的,但我的答案并不像我想的那么准确。如果我在函数f = cos(x)+ e ^(x ^ 2)上尝试我的代码,a = 0,b = 1和n = 7,我的答案大约是1,9,当它应该是2时, 3。如果我使用维基百科提供的算法,我得到一个非常近似的n = 7,所以我的代码显然不够好。如果有人能在我的代码中看到任何错误,我会非常感激!

function x = compsimp(a,b,n,f)
% The function implements the composite Simpson's rule

h = (b-a)/n;
x = zeros(1,n+1);
x(1) = a;
x(n+1) = b;
p = 0;
q = 0;

% Define the x-vector
for i = 2:n
    x(i) = a + (i-1)*h;
end

% Define the terms to be multiplied by 4
for i = 2:((n+1)/2)
    p = p + (f(x(2*i -2)));
end

% Define the terms to be multiplied by 2
for i = 2:((n-1)/2)
    q = q + (f(x(2*i -1)));
end

% Calculate final output
x = (h/3)*(f(a) + 2*q + 4*p + f(b));

4 个答案:

答案 0 :(得分:1)

您的时间间隔[a,b]应分为n个时间间隔。这会导致n+1的{​​{1}}值构成每个分区的边界。您的向量x仅包含x个元素。您的代码似乎只根据需要处理n条款而不是n

编辑::现在你已根据上述内容修改了问题,试试这个

n+1

答案 1 :(得分:0)

您创建的代码工作得很好。我看到的唯一问题是n。根据我的经验,对任何函数都尝试n> = 10000。

答案 2 :(得分:0)

function x = compsimp(a,b,n,f)

我不知道这是否重要,但不应该是f第一个字母:

function x = compsimp(f,a,b,n)

答案 3 :(得分:0)

更正应位于p1p2p3部分。我试了一下,得到了大致确切的结果:

enter image description here