WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Referat über das Newton-Verfahren!

 

chikobongo27
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 25.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2012, 20:27     Titel: Referat über das Newton-Verfahren!
  Antworten mit Zitat      
Hallo Leute,

ich muss demnächst in meinem Matlab-Fach ein Referat über das Newtonverfahren halten. Ich will mich nicht blamieren und wollte euch deshalb fragen, wie ich das Referat am besten strukturieren soll?

Wie sollte eurer Meinung nach der Aufbau aussehen? Was sollte ich beachten? Vielleicht habt ihr irgendwelche Vorschläge welche Aufgaben ich vorrechnen soll usw?

Vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen


chikobongo27
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 25.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.12.2012, 12:18     Titel:
  Antworten mit Zitat      
Ich habe hier eine Aufgabe in der das Newtonverfahren anhand eines Beispiels erklärt wird. Nur verstehe ich nicht, warum man 2 M-Files benutzt. Eine für die Funktion und eine für die erste Ableitung der Funktion.

Aufgabe:

Implementieren wir jetzt das Newton-Verfahren in MATLAB für die Funktion „f(x)=sin(x) − x/2“. Die Definition der Funktion und ihre Ableitung „f '(x) = cos(x) − 1/2“ packen wir in separate M-Files:

Code:
function  y = f0( x )
y = sin(x) - x/2;

function y = f1( x )
y = cos(x) - 1/2;


Unsere Funktion newton für das Newton-Verfahren hat den Startwert x0 als Übergabeparameter und versucht immer bessere Approximationen x_next (= xn+1) für die Nullstelle zu finden, bis der zugehörige Funktionswert y_next näher als die MATLAB-Genauigkeit eps an null liegt. Um im Fall der Nicht-Konvergenz eine Endlosschleife zu vermeiden, wird die Zahl der Iterationen auf n = 1000 begrenzt.

Code:
function newton( x0 )
x_n = x0;
n = 0; %Start bei n = 0, mit x_n = x0
gefunden = 0;

% bis Nullstelle gefunden oder Zahl der Iterationen zu groß
while( gefunden == 0 && n < 1000 )
n = n + 1; % Zahl der Iterationen
y_n = f0( x_n ); % = y(xn) Wert der Funktion bei x_n
y_1 = f1( x_n ); % = y'(xn) Wert der Ableitung

x_next = x_n - y_n / y_1; % Iterationsformel: n -> n+1

y_next = f0( x_next ); % y-Wert zu x_next
fprintf( 'x_n = %g, \t y_n = %g \n', x_next, y_next );

% Check, ob y_next nahe an 0 liegt:
if( abs( y_next ) < eps )
fprintf( '\nNullstelle bei x = %g \n', x_next );
fprintf( 'f(x) = %g, nach %d Iterationen \n', y_next, n );
gefunden = 1;

end

x_n = x_next; % neuer Wert fu&#776;r x_n: n -> n+1

end

if( gefunden == 0 ) % Iteration war nicht erfolgreich
fprintf( 'Keine Lösung nach %d Iterationen \n', n );

end
 

Für den Startwert x0 = 3 erhalten wir nachstehende Iterationsfolge, die nach 5 Schritten gegen die Nullstelle x = 1.89549 konvergiert:
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.12.2012, 18:21     Titel:
  Antworten mit Zitat      
Hallo chikobongo27,

Das kann man genauso gut auch in einem M-File machen. Das ist nur eine Frage des Geschmacks.
Häufig ist aber bei realen Anwendungen die Ableitung nicht explizit vorhanden. Dann wird die Ableitung numerisch bestimmt (siehe Differenzen-Quotienten). Dies kann auch hilfreich sein, wenn die Ableitung zwar analytisch vorliegt, die enthaltenen Ausdrücke aber dermassen kompliziert sind, dass die Berechnung des Differenzen-Quotienten viel schneller ist.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 05.12.2012, 08:14     Titel:
  Antworten mit Zitat      
Hallo,

zur eigentlichen Frage. Um dir Tipps zur Struktur des Referats zu geben, müssten wir wissen, wo du stehst. Wenn du bereits eine Numerikvorlesung besucht hast, könnte man ganz anders herangehen. Ich würde dann beispielsweise den Banach'schen Fixpunktsatz erwähnen und einen Beweis für die Konvergenz des Verfahrens angeben.

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
chikobongo27
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 25.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2012, 17:33     Titel:
  Antworten mit Zitat      
Ich habe hier noch ein Beispiel gefunden, vielleicht ist es ein wenig verständlicher.

Würde sich jemand bereit erklären, Zeile für Zeile mit mir durchzugehen um mir die einzelnen Schritte zu erklären.

Ich wäre euch sehr dankbar dafür, denn ich muss am Montag das Referat halten und würde das gerne verstehen.

Ein Beispiel für die Implementierung eines iterativen Algorithmus' ist das folgende Programm, das die Nullstelle einer Funktion mit dem Newton-Verfahren bestimmt.

Code:
function x = newton(f, df, x)

% Newtonverfahren zur Bestimmung einer Nullstelle
% einer Funktion f mit Ableitung df nahe bei x

max_iter = 100; tol = 1.0e-10;            

for k=1:max_iter;
   fx = f(x); dfx = df(x);
   if abs(fx) < tol
      display('Nullstelle bestimmt');
      return;
   elseif abs(dfx) < tol
      display('waagrechte Tangente');
      return;
   end;
   x = x - fx/dfx;
end;
display('keine Konvergenz');


Die Funktion und ihre Ableitung werden als function-handles übergeben. Ein Beispiel ist

Code:
f = @(x) x^3-x; df = @(x) 3*x^2-1;

Der Programmaufruf

Code:
x = newton(f, df, 4)


liefert dann


x = 1.0000

als berechnete Nullstelle.

Ist die Konvergenz für den übergebenen Startwert gesichert, so könnte der Algorithmus sehr kurz durch das Programmsegment

Code:
while abs(f(x)) > eps
   x = x - f(x)/df(x);
end

realisiert werden. Allerdings muss im allgemeinen auch mit einem Fehlschlagen des Verfahrens gerechnet werden. Es ist daher sinnvoll, die maximale Iterationszahl zu beschränken (max_iter) und auch eine größere Toleranz (tol) als die Maschinengenauigkeit eps zu wählen, um Rundungsfehler zu berücksichtigen. Auch soll ein Fehlschlagen ( $ f^\prime(x) = 0$ oder Divergenz) durch entsprechende Meldungen angezeigt werden. Die obige Programmversion zeigt, wie dies üblicherweise bei einem iterativen Verfahren realisiert wird.

Eine flexiblere Programmversion erhält man, wenn die Parameter max_iter und tol als optionale Eingabevariablen übergeben werden können. Ebenso können die Fehlermeldungen auch in einer optionalen Ausgabevariablen ausgegeben werden.

(Autor: K. Höllig)

[EDITED, Jan: Bitte Code-Umgebung verwenden - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 07.12.2012, 19:53     Titel:
  Antworten mit Zitat      
Hallo,

bitte meine Rückfragen beantworten, bitte nicht vorkauen lassen, bitte konkrete Fragen stellen.

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.