我想在复合simpson规则中绘制错误 ......这是我的代码
for r=1:100
n=600;
a=0;
b=5;
err=[];
x=zeros(1,n);
f=@(x)cos(x)+x.^2;
h=(b-a)/n;
xexact=integral(f,a,b);
p=0;
q=0;
for i=1:n
x(i)=a+(i-1)*h;
end
for i=1:n-1
p=p+2*(f(x(i)))+4*(f(x(i)+h/2));
end
x=(h/6)*(f(a)+f(a+h/2)+p+f(b))
err(end+1)=x-xexact;
plot(r,x,'*')
end
当我运行代码时,我在情节中得到一点......我想在情节中绘制所有点,如何做?
感谢
答案 0 :(得分:-1)
最简单的解决方法是将hold on;
放在您的代码之前,然后放置hold off;
。这样,您对plot
的每次调用都会为现有情节添加一个点,而不是创建新情节。 (目前正在发生的事情是你正在用r=1
绘制一个点,然后用r=2
替换该点,等等。所以你最终得到的是一个显示发生了什么的情节r=100
。)
你可能会做得更好,在你的循环运行时建立一个包含你x
的数组,然后在最后做一个plot(1:100, xs, '*');
。
答案 1 :(得分:-1)
您的代码中存在一个概念性问题:您希望绘制x
变量,该变量不是r
的函数,并且对于每个r
值都不会更改。因此,您将绘制一行具有固定r
值的x
点。
此外,我认为,如果可能的话,最好避免使用Matlab中的循环,因为有更强大和优化的方法来处理你用它们做的事情。例如,我将以这种形式编写此代码:
function [x, err] = compSimp(n, a, b)
err = [];
x=zeros(1,n+1);
f=@(x)cos(x)+x.^2;
h=(b-a)/n;
xexact=integral(f,a,b);
% x_0 = a
x(1)=a;
% x_n = b
x(n+1)=b;
p=0;
% x_j = a + j*h with j = 1, 2, ... , n-2, n-1 (no need to set again x_0 and x_n)
x(2:n)= a + (1:(n-1))*h;
% summations
for i=2:2:n
p = p + 2*(f(x(i+1))) + 4*(f(x(i)));
end
x=(h/3)*(f(a) + p + f(b));
err(end+1)=x-xexact;
end
正如您所看到的,我已经改变了一些代码逻辑,遵循维基百科的理论。如果需要,还可以更改代码,以便将自定义f
函数传递给compSimp函数。