如何在复合simpson规则方法中绘制误差

时间:2016-04-26 13:03:07

标签: matlab

我想在复合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

当我运行代码时,我在情节中得到一点......我想在情节中绘制所有点,如何做?

感谢

2 个答案:

答案 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函数。