为了它的乐趣,我试过为复合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));
答案 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)