2016-09-20 16 views
1

Ich arbeite derzeit an einer Hausaufgabe, die mich auffordert, einen Wert mithilfe der falschen Position Methode zu schätzen. Ich habe das Gefühl, dass ich fast alles dort habe, aber ich werde auf meiner if-Aussage aufgehängt. Also muss ich die postive reelle Wurzel der Funktion bestimmen: ln (x^2) = 0.7 mit der falschen Positionsmethode mit 3 Iterationen, xl = 0.5 und xu = 2. Ich habe unten die richtigen Antworten angebracht, damit ich meine Fragen besser erklären kann. Ich habe drei spezifische Fragen, in denen ich Hilfe brauche.Matlab False-Position-Methode

1). Erstens behandelt mein Code in der dritten Iteration für den Wert von X1 ihn immer noch als 1,625 anstelle der korrekten 1,25. Ich verstehe nicht, warum es das tut, da meine if-Aussage das verhindern sollte. Dieser Wert wird in der zweiten Iteration korrekt geändert, nicht in der dritten.

2). Ich brauche auch Hilfe, um den Fehler zu finden. Dieser Teil bin ich ziemlich fest. Ich kenne die Gleichung, um den Fehler zu finden, aber meine Frage ist, wie man verfolgt, was xr_new und xr_old ist. Ich bin nicht sicher, ob ich etwas vergleichen möchte, um zu sehen, ob es sich vor der Berechnung ändert oder was.

3). Ich möchte auch meinen Wert ausgeben und eine Tabelle wie die gelieferte Lösung erstellen. Meine vorherige Erfahrung mit der Tabelle ist hart codieren die Werte direkt in es und ich habe eine schwierige Zeit, die Tabelle zu bauen, wenn Werte gefunden werden. Ich weiß, ich brauche die Tabelle in der for-Schleife und ich baue sie Zelle für Zelle, aber habe keine Erfahrung in diesem Bereich, um zu beginnen.

Ich hoffe, das ist nicht zu viel Hilfe zu fragen, ich habe Matlab Fähigkeiten intermitate und das ist eine der schwierigeren Fragen, die ich tun musste. Jede Hilfe wird sehr geschätzt.

clc; clear; 
f= @(x) log(x.^2) - 0.7; 
x = -3: .005 : 3; 
figure(1) 
grid on 
hold on 
plot (x,f(x)) 

% bisection method with 3 iterations 
xl = 0.5 
xu = 2 

%Table = table(iteration, xl , f(xl), xu, f(xu), xr, f(xr), Ea) 

for i = 1:1:3 

    F_xl = f(xl) 
    F_xu = f(xu) 
    xr = .5*(xl+xu) 
    F_xr = f(xr) 

    if ((F_xu*F_xl) < 0) 
     xl = xr 

    else 
     xu = xr 
    end 


    %Error = abs(xr_new-xr_old)/xr_new 
end 

The correct soluton displayed in a table below:

Antwort

0

Der folgende Code gibt den gewünschten Ausgang und wird durch den Code, bis die, wie Sie F_xl statt F_xr verwendet fehlgeschlagen

  1. Der if Zustand plot() voraus. if ((F_xu*F_xr) < 0) gibt das gewünschte Ergebnis.
  2. Wir können einen Vektor für xr verwenden, um die Werte von xr in jeder Iteration zu speichern und den Ausdruck abs(xr_new-xr_old)/xr_new) zu verwenden, um den Fehler zu finden. Ich habe nur den ersten Fehlerwert auf Null belassen.
  3. Da wir Vektoren, table() können außerhalb der Schleife verwendet werden, um den gewünschten Ausgang

-Code zu erhalten:

iterations = (1:3)'; 
xl = zeros(3,1); 
xu = zeros(3,1); 
xr = zeros(3,1); 
F_xl = zeros(3,1); 
F_xu = zeros(3,1); 
F_xr = zeros(3,1); 
Error = zeros(3,1); 
% bisection method with 3 iterations 
xl(1) = 0.5; 
xu(1) = 2; 
for i = 1:3 
    F_xl(i) = f(xl(i)); 
    F_xu(i) = f(xu(i)); 
    xr(i) = .5*(xl(i)+xu(i)); 
    F_xr(i) = f(xr(i)); 
    if(i<3) 
     if ((F_xu(i)*F_xr(i)) < 0) 
      xl(i+1) = xr(i); 
      xu(i+1) = xu(i); 
     else 
      xu(i+1) = xr(i); 
      xl(i+1) = xl(i); 
     end 
    end 
    if(i>1) 
     Error(i) = abs(xr(i)-xr(i-1))*100/xr(i); 
    end 
end 
T = table(iterations,xl,F_xl,xu,F_xu,xr,F_xr,Error); 
+0

Ich habe keine Ahnung, warum die Linie Iterationen = (1: 3) '; ist nicht innerhalb des Codes. Fügen Sie diese Zeile hinzu, wenn Sie diesen Code ausprobieren. – nahomyaja

+0

Vielen Dank! Ich hätte gedacht, xl, xu und xr als 3 leere Räume zu starten. – jake

+0

Gern geschehen. Hoffentlich hast du verstanden, was im Code gemacht wird. Ich habe nicht viel erklärt, als du gesagt hast, dass du ein erfahrener MATLAB-Programmierer bist. – nahomyaja