2016-04-26 5 views
0

ich den Fehler in der Verbund Simpsonsche Regel ... ist mein Code Hier zeichnen möchtenWie Fehler plotten in Verbund Simpsonsche Regel Methode

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 

Wenn ich den Code ausführen ich einen Punkt in der Handlung erhalten .. Ich möchte alle Punkte in der Handlung geplottet haben, Wie geht das?

dank

+1

Welche Abmessungen haben 'r' und' x' kurz vor dem 'Plot'? Ich denke, die vierte Zeile vom Ende definiert das 'x' neu und macht es zu '1x1' doppelt ... – Crowley

Antwort

-1

Die einfachste Lösung ist hold on;, bevor Sie Ihren Code hier und hold off;, nachdem es zu setzen. Auf diese Weise fügt jeder Ihrer Aufrufe an plot einen Punkt zu einem vorhandenen Plot hinzu, anstatt einen neuen Plot zu erstellen. (Was im Moment passiert, ist, dass Sie einen Punkt mit r=1 verschwören, und dann das Grundstück mit einer für r=2 ersetzen usw. Also, was Sie am Ende mit ist eine grafische Darstellung zeigt genau das, was für r=100 passiert.)

Sie können jedoch besser ein Array erstellen, das Ihre x enthält, während Ihre Schleife ausgeführt wird, und dann am Ende eine einzelne plot(1:100, xs, '*');.

-1

Es ist ein konzeptionelles Problem in Ihrem Code: Sie können die x Variable darstellen mögen, die nicht in Abhängigkeit von r ist und das wird nie für jeden r Wert ändern. Sie zeichnen also eine Reihe von r Punkten mit einem festen x Wert. Darüber hinaus denke ich, dass, wenn möglich, es gut ist, for-Schleifen in Matlab zu vermeiden, weil es leistungsfähigere und optimierte Möglichkeiten gibt, Dinge zu tun, die man mit ihnen macht. Zum Beispiel werde ich diesen Code in dieser Form schreiben:

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 

Wie Sie sich einig Code-Logik geändert haben sehen können, folgende wikipedia für Theorie. Wenn Sie möchten, können Sie auch Code ändern, so dass Sie eine benutzerdefinierte f-Funktion an die CompSimp-Funktion übergeben können.