我试着用Simpson的方法来近似积分。然而,当我试图在日志图中绘制它时,我没有得到正确的精度顺序,即O(h^4) (我得到O(n))。但是我找不到任何错误。这是我的密码:
%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是我们想要逼近的被积。
发布于 2014-08-15 01:25:06
考虑到Geoff的建议,并做一些其他的修改,这一切都如预期的那样工作。
%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)代替它可以修复代码,从而提高准确性。
发布于 2014-08-14 20:04:28
Djamillah -您的代码看起来很好,尽管h的初始化可能只在a==0的情况下有效,所以您可能希望将这一行代码更改为
h = (b-a)/(2^n+1);我想知道x = a:h:b;是否总是有效的--有时b可能包括在列表中,有时可能不包括,这取决于h。您可能需要重新考虑使用linspace来代替
x = linspace(a,b,2^n+1);这将保证x的2^n+1点在间隔[a,b]中均匀分布。然后可以将h初始化为
h = x(2)-x(1);此外,在确定偶数和奇数指数时,我们需要忽略偶数和奇数的x的最后一个元素。所以而不是
xodd = x(2:2:end-1);
xeven = x(3:2:end);做
xodd = x(2:2:end-1);
xeven = x(3:2:end-1);最后,不要使用向量y (这是如何设置的?)我可能只是使用函数句柄来处理我正在集成的函数,并将上面的计算替换为
Isimp = delta/3*(func(x(1)) + 4*sum(func(xodd)) + 2*sum(func(xeven)) + ...
func(x(end)));除了这些微小的东西(可能可以忽略不计)之外,算法中没有任何东西可以表示问题。它产生了类似的结果,我有一个版本。
至于收敛的顺序,是O(n^4)还是O(h^4)?
https://stackoverflow.com/questions/25315394
复制相似问题