0 Daumen
290 Aufrufe

Aufgabe: Hey ich soll ein Matlab Programm zu folgender Aufgabe schreiben:

Mit Hilfe des Newton-Verfahrens bestimme man Näherungslösungen des Gleichungssystems
x+y+z = 3 x2+y2+z2 =5
ex+xy−xz = 1.
Für jede der beiden zu approximierenden exakten Lösungen (x∗,y∗,z∗) = (0,1,2) und (x∗,y∗,z∗) = (0,2,1) wähle man geeignete Startvektoren (x0,y0,z0). Man verwende entsprechende Matlab-Befehle zur Lösung der enstehenden linearen Gleichungssysteme. In einer Tabelle gebe man zu wachsendem Iterationszähler n die Komponenten der Näherung (xn, yn, zn) an, ferner die Norm des entsprechenden Defektvektors sowie die Norm des Fehlervektors zur exakten Lösung (x∗,y∗,z∗). Als Norm ist dabei die Euklidische Norm zu wählen. Das Newton-Verfahren soll abgebrochen werden, wenn die Norm des Fehlers kleiner als 10^−12 ist. Man vergleiche die Konvergenzeigenschaften der Iterationen für die beiden exakten Lösungen.
Problem/Ansatz:

Für die erste exakte Lösung habe ich folgenden Ansatz kann mir jemand sagen was dort fehlt oder falsch ist?


% Newton-Verfahren zur Lösung des Gleichungssystems
format long

% Funktionen und deren partielle Ableitungen
% Das rechnet die erste Funktion aus.
f1 = @(x, y, z) x + y + z -3;
% Diese drei stellen die Ableitungen der ersten Funktion dar
df1_dx = @(x, y, z) 1;  %@ sagt ist von der Variable abhängig
df1_dy = @(x, y, z) 1;
df1_dz = @(x, y, z) 1;

f2 = @(x, y, z) x^2 + y^2 + z^2 -5;
df2_dx = @(x, y, z) 2*x;
df2_dy = @(x, y, z) 2*y;
df2_dz = @(x, y, z) 2*z;

f3 = @(x, y, z) exp(x) + x*y - x*z -1;
df3_dx = @(x, y, z) exp(x) + y - z;
df3_dy = @(x, y, z) x;
df3_dz = @(x, y, z) -x;

% Newton-Verfahren
tolerance = 1e-12; % Abbruchtoleranz

% Erste exakte Lösung (0, 1, 2)
x_ex= (0; 1; 2)'

% Startvektor (x0, y0, z0)

xold = (0.1, 1.1, 1.9)

X = [x0; y0; z0]; % Anfangswert
n = 0; % Iterationszähler

disp('Erste exakte Lösung (0, 1, 2):')
disp(' n       x         y         z     ||F(X)||   ||X - X*||')

while true
% Auslesen aus xold
x= xold(1);
y= xold(2);
z= xold(3);

%1. Newton Schritt

  F = [f1( x,y,z);    f2( x,y,z);    f3(x,y,z)];
 
  J = [df1_dx(x,y,z);    df1_dy(x,y,z);  df1_dz(x,y,z);
      df2_dx(x,y,z);    df2_dy(x,y,z);  df2_dz(x,y,z);
      df3_dx(x,y,z);    df3_dy(x,y,z);  df3_dz(x,y,z)];
 
v = J\ F; % Löse das lineare Gleichungssystem J * v = F(X)
  xnew = xold - v;
 
  error_norm = norm(F);
  solution_error_norm = norm(x - [0; 1; 2]);
 
  fprintf('%2d %10.12f %10.12f %10.12f %10.12f %10.12f\n', n, X, error_norm, solution_error_norm);
  xold = xnew     %Vorbereitung nächster Itertionsschritt
  if error_norm < tolerance
      break;
  end
 
  n = n + 1;
end

iterations_solution1 = n + 1; % Anzahl der Iterationen für die erste Lösung
error_solution1 = solution_error_norm; % Fehler der ersten Lösung

Avatar von

1 Antwort

0 Daumen

Ich sag mal was dazu, obwohl ich kein MatLab-Kenner bin.

Numerisch wird man wohl ehr auf die Bestimmung der Inversen verzichten und über das LGS

\(\vec f(\vec x_i)+J_{\vec f}(\vec x_i)\cdot(\vec x-\vec x_i)\stackrel!=\vec b\)

gehen?

Sollte tolerance nicht die Differenz aufeinanderfolgender Iterationsschritte sein?

Damit (CAS-Beispiel mit/ohne Matrix)

https://www.geogebra.org/m/ak9yd6yn

komme ich auf

\(\small N_{\Delta} \, :=  \, \left(\begin{array}{rrr}1&1&-1\\-0.269&3.769&-0.5\\-0.105&2.644&0.461\\-0.029&2.157&0.873\\-0.003&2.014&0.989\\0&2&1\\\end{array}\right)\)

Mit Deinem Startvector

\(\small N_{\Delta} \, :=  \, \left(\begin{array}{rrr}0.1&1.1&1.9\\-0.649&2.442&1.207\\-0.394&1.674&1.72\\-0.17&1.35&1.82\\-0.088&1.175&1.913\\-0.044&1.088&1.956\\-0.022&1.044&1.978\\-0.011&1.022&1.989\\-0.005&1.011&1.995\\-0.003&1.005&1.997\\-0.001&1.003&1.999\\-0.001&1.001&1.999\\0&1.001&2\\0&1&2\\\end{array}\right)\)

Avatar von 21 k

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

0 Daumen
1 Antwort
0 Daumen
2 Antworten
Gefragt 24 Okt 2020 von Mel93
+1 Daumen
4 Antworten

Willkommen bei der Mathelounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community