首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的辛普森算法怎么了?

我的辛普森算法怎么了?
EN

Stack Overflow用户
提问于 2014-08-14 18:43:35
回答 2查看 102关注 0票数 0

我试着用Simpson的方法来近似积分。然而,当我试图在日志图中绘制它时,我没有得到正确的精度顺序,即O(h^4) (我得到O(n))。但是我找不到任何错误。这是我的密码:

代码语言:javascript
复制
%Reference solution with Simpson's method (the reference solution works well)
yk = 0;
yj = 0;
href = 0.0001;
mref = (b-a)/href;

for k=2:2:mref-1
    yk=yk+y(k*href+a);
end

for j=1:2:mref
    yj=yj+y(href*j+a);
end
Iref=(href/3)*(y(a)+y(b)+2*yk+4*yj);

%Simpson's method
iter = 1;
Ehmatrix = 0;
for n = 0:nmax
    h = b/(2^n+1);
    x = a:h:b;
    xodd = x(2:2:end-1);
    xeven = x(3:2:end);
    yodd = y(xodd);
    yeven = y(xeven);
    Isimp = (h/3)*(y(x(1))+4*sum(yodd)+2*sum(yeven)+y(b));
    E = abs(Isimp-Iref);
    Ehmatrix([iter],1) = [E];
    Ehmatrix([iter],2) = [h];
    iter = iter + 1;
end

figure
loglog(Ehmatrix(:,2),Ehmatrix(:,1))

A和b是积分极限,y是我们想要逼近的被积。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-15 01:25:06

考虑到Geoff的建议,并做一些其他的修改,这一切都如预期的那样工作。

代码语言:javascript
复制
%Reference solution with Simpson's method (the reference solution works well)
a=0;
b=1;
y=@(x) cos(x);
nmax=10;

%Simpson's method
Ehmatrix = [];
for n = 0:nmax
    x = linspace(a,b,2^n+1);
    h = x(2)-x(1);
    xodd = x(2:2:end-1);
    xeven = x(3:2:end-1);
    yodd = y(xodd);
    yeven = y(xeven);
    Isimp = (h/3)*(y(x(1))+4*sum(yodd)+2*sum(yeven)+y(b));
    E = abs(Isimp-integral(y,0,1));
    Ehmatrix(n+1,:) = [E h];
end

loglog(Ehmatrix(:,2),Ehmatrix(:,1))

P=polyfit(log(Ehmatrix(:,2)),log(Ehmatrix(:,1)),1);    
OrderofAccuracy=P(1)

你得到了O(h)的准确性,因为xeven=x(3:2:end)是错的。用xeven=x(3:e:end-1)代替它可以修复代码,从而提高准确性。

票数 1
EN

Stack Overflow用户

发布于 2014-08-14 20:04:28

Djamillah -您的代码看起来很好,尽管h的初始化可能只在a==0的情况下有效,所以您可能希望将这一行代码更改为

代码语言:javascript
复制
h = (b-a)/(2^n+1);

我想知道x = a:h:b;是否总是有效的--有时b可能包括在列表中,有时可能不包括,这取决于h。您可能需要重新考虑使用linspace来代替

代码语言:javascript
复制
x = linspace(a,b,2^n+1);

这将保证x的2^n+1点在间隔[a,b]中均匀分布。然后可以将h初始化为

代码语言:javascript
复制
h = x(2)-x(1);

此外,在确定偶数和奇数指数时,我们需要忽略偶数和奇数的x的最后一个元素。所以而不是

代码语言:javascript
复制
xodd  = x(2:2:end-1);
xeven = x(3:2:end);

代码语言:javascript
复制
xodd  = x(2:2:end-1);
xeven = x(3:2:end-1);

最后,不要使用向量y (这是如何设置的?)我可能只是使用函数句柄来处理我正在集成的函数,并将上面的计算替换为

代码语言:javascript
复制
Isimp = delta/3*(func(x(1)) + 4*sum(func(xodd)) + 2*sum(func(xeven)) + ...
        func(x(end)));

除了这些微小的东西(可能可以忽略不计)之外,算法中没有任何东西可以表示问题。它产生了类似的结果,我有一个版本。

至于收敛的顺序,是O(n^4)还是O(h^4)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25315394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档