2016-04-26 48 views
0

绘制错误我想绘制在复合辛普森法则 错误...这里是我的代码如何在复合辛普森的统治方法

for r=1:100 
n=600; 
a=0; 
b=5; 
err=[]; 
x=zeros(1,n); 
[email protected](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 

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

感谢

+1

'plot'之前'r'和'x'的尺寸是多少?我认为从最后的第4行重新定义了'x'使它成为'1x1'双... – Crowley

回答

-1

最简单的解决方法是后把hold on;代码之前这里hold off;。这样,您拨打plot的每个电话都会为现有情节添加一个点,而不是创建新情节。 (什么此刻正在发生的事情是,你正在策划一个点与r=1,然后用一个取代该地块为r=2等,所以你最终什么是表示r=100只是会发生什么阴谋。)

尽管如此,你可能会做得更好,在你的循环运行时建立一个包含你的x的数组,最后做一个单独的plot(1:100, xs, '*');

-1

您的代码中存在一个概念性问题:您想绘制x变量,该变量不是r的函数,并且每个r值都不会发生变化。因此,您将绘制一排具有固定值xr点。 此外,我认为,如果可能的话,避免在Matlab中出现循环是很好的,因为有更强大和最优化的方法来处理你所做的事情。例如,我会以这种形式编写代码:

function [x, err] = compSimp(n, a, b) 
    err = []; 
    x=zeros(1,n+1); 
    [email protected](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函数。