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

Newton-Iteration Programmierung drigend Hilfe !!!

 

Juli88

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.01.2014, 00:15     Titel: Newton-Iteration Programmierung drigend Hilfe !!!
  Antworten mit Zitat      
Hallo ich brauche unbedingt Hilfe Sad
Bitte ich habe versucht alles zu machen was ich nur machen kann, aber komme leider NIE zu einem Ergebnis. Habe Hilfe gesucht, auch leider gescheitert.
Meine letzte Hoffnung ist nur noch dieses Forum Sad

Meine Aufgabe :
Ich soll eine Matlabfunktion NewtonV(x0,tol,maxiter) schreiben, welche für eine fest vorgegebene Funktion f:R^n->R^nausgehend vom Startwert x0 elemenr R^n solange Newton-Iteration durchführt, bis das Abbruchkriterium ||x_k+1 - x_k|| <= tol erreicht wurde oder eine maximale Anzahl an Iterationen maxiter überschritten wurde. Die Funktion soll in z element R^n die letzte Newton-Iterierte, in iter element N die Anzahl der durchgeführten Iterationen sowie eine Variable b element {0,1}, 0 falls maximale Anzahl Iterationen erreicht wurde und 1 sonst, zurückgeben.

Verwenden Sie die Approximation der Jacobimatrix der zentrierten Differenzen:
df_i / dx_j ~ ( f_i(x+e_j*h) - f_i(x-e_j*h) ) / 2*h
mit h = 10^(-6)

Die Funktion soll wie folgt aussehen:
function [z,iter,b] = NewtonV[x_0,tol,maxiter]
...
end

Ich habe leider Null Ahnung
Für jegliche Hilfe wäre ich wirklich sehr dankbar.

Vielen Dank !


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.01.2014, 12:41     Titel:
  Antworten mit Zitat      
Hallo Juli88,

so soll die Funktion sicher nicht aussehen, denn das ist keine gültige Matlab-Syntax. Sollte die Funktion f nicht auch als Parameter übergeben werden?

Kannst Du folgende Fragen beantworten:
1. Wie sieht denn das Newton-Verfahren für n=1 aus? Schreib doch erstmal dafür eine Funktion.
2. Stelle mal die Jakobi-Matrix auf.
3. Wie beschreibt man mit Matlab einen Iterationsschritt?

Wenn Du soweit bist, ist der Rest so gut wie erledigt. Wenn Du Fragen hast, kannst Du ja nochmal fragen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.01.2014, 14:14     Titel:
  Antworten mit Zitat      
Hallo Sirius3
Vielen Dank erstmal für deine Antwort Smile
Die Matlab-Funktion wurde uns aber so vorgegeben, so soll die Funktion aussehen.
Die Funktion f soll in einem seperaten MAtlab-Funktion f(x) für Eingabewerte x element R^n und Rückgabewerte y = ( f_1(x),...,f_n(x) )^T element R^n umgesetzt werden und so aufgestellt sein, dass mit obiger Funktion eine Lösung des folgenden Gleichungssytems (mit n=2) ermittelt werden kann :
(x_1)^2 + (x_2)^2 + (3/5)x_2 = (4/25)
(x_1)^2 - (x_2)^2 - (8/5)x_2 = (7/50)

1. NV für n=1 : x_k+1 = x_k - f(x_k)/ f ' (x_k)

den Iterationsschritt würde ich so aufstellen:
for n = 1 : maxiter
iter = n + 1
stimmts ?

Gruß
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2014, 01:13     Titel:
  Antworten mit Zitat      
Hallo Juli88,
das ist jetzt aber noch nicht Matlab-Code, sondern die mathematische Beschreibung der Iteration. Außerdem mußt Du die Ableitung noch durch einen Differenzenquotienten ersetzen. Und was soll iter sein?
Private Nachricht senden Benutzer-Profile anzeigen
 
Juli88

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2014, 14:04     Titel:
  Antworten mit Zitat      
Also iter ist ja die iteration, das brauch ich ja um iteration abzubrechen mit 0 und 1.
ich verstehe grad nicht so wirklich was du meinst Sad
ich muss das programm schreiben habe aber wirklich keine ahnung wie ich das machen soll. Die Überlegungen helfen mir m it Matlab leider auch nicht auf die Sprünge Sad
Gruß
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.01.2014, 15:55     Titel:
  Antworten mit Zitat      
Was hast Du in Deinem Matlabkurs bisher gelernt? Solche Aufgaben bauen ja auf zuvor gelerntes auf.
Dass
Code:
x_k+1 = x_k - f(x_k)/ f ' (x_k)

kein korrektes Matlab ist, merkst Du spätestens, wenn Du es mal in die Matlabkonsole eintippst.
Wenn Du nicht weißt, wo Du anfangen sollst, dann lass Matlab erst so rechnen, wie Du es mit Papier und Bleistift auch tun würdest:
Code:
f = @(x)x.^2-sin(x);  % Eine Beispielfunktion
x1 = 1; % Der Startwert zum Nullstelle finden
x2 = x1 - ... % Wie sieht die Formel aus um einen Schritt der Iteration zu machen also aus f und x1 ein x2 zu berechnen?
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Juli88

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2014, 14:51     Titel:
  Antworten mit Zitat      
also ich denk mal so :
x2=x1- f(x1)/f ' (x1)
x3=x2- f(x2)/f ' (x2)
....

stimmts oder ?

noch eine Verständnisfrage
was heißt denn dieses @ in deiner Funktion f ?
Lieben Gruß
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2014, 14:59     Titel:
  Antworten mit Zitat      
ob es stimmt, kannst Du doch mit Matlab selbst überprüfen.
Und nein, es stimmt nicht. Matlab kann keine Funktionen transponieren. Du brauchst den Differenzenquotienten, wie er auch in Deiner Aufgabenstellung angegeben ist.

Mit @ erstellt man in Matlab Functionhandles, in diesem Fall zu einer anonymen Funktion. Function-Handles kann man in Variablen verarbeiten und wie Funktionen aufrufen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Juli88

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2014, 14:25     Titel:
  Antworten mit Zitat      
Mein Problem ist folgendes Sad
Ich kann leider nicht programmieren...das muss ich jetzt programmieren und und abgeben habe aber wirklich vorne und hinten leider keine Ahnung.
Ich weiß nicht vielleicht kann mir ja jemand der/die so nett ist und mir wenigstens den Ansatz mal schreiben, sodass ich versuche wirklich so gut es geht selber zu programmieren.
Weil ich habe echt keine Ahnung wie ich die Aufgabe angehen soll.
Danke wirklich für deine Hilfe, aber irgendwie bin ich voll durcheinander gekommen Sad
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2014, 02:50     Titel:
  Antworten mit Zitat      
Ich löse normalerweise nur die Hausaufgaben meiner eigenen Studenten:
Im Aufgabentext steht doch
Verwenden Sie die Approximation der Jacobimatrix der zentrierten Differenzen:
df_i / dx_j ~ ( f_i(x+e_j*h) - f_i(x-e_j*h) ) / 2*h
mit h = 10^(-6)

Das heißt also:
Code:

h = 1e-6;
f = @(x)x.^2-sin(x);
x1 = 1;
x2 = x1 - f(x1) / ( f(x1+h) - f(x1-h) ) * 2 * h
f(x2)
x3 = x2 - f(x2) / ( f(x2+h) - f(x2-h) ) * 2 * h
f(x3)
 

Du siehst, f(x) strebt ziemlich schnell gegen 0:
Code:

x2 =  0.89140
ans =  0.016637
x3 =  0.87698
ans =  2.8815e-04
x4 =  0.87673
ans =  9.2541e-08
 

Jetzt wäre es ja ziemlich umständlich, jede Zeile zu kopieren, und die Indizes hochzuzählen. Da man an den Zwischenschritten sowieso nicht interessiert ist, kann man aber einfach statt x1,x2,x3 überall x nehmen und den alten jeweils mit dem neuen Wert überschreiben. Das macht man am besten in einer Schleife:
Code:
function [x,iter] = NewtonV(f, x0, tol, maxiter)
  h = 1e-6;
  x = x0;
  for iter = 1:maxiter
    x = x - f(x) / ( f(x+h) - f(x-h) ) * 2 * h;
    if abs(f(x))<tol, break;end
  end
end

> [x, iter] = NewtonV(@(x)sin(x)-x.^2, 1, 1e-16, 7)
x =  0.87673
iter =  6
 

Das Erweitern auf n Dimensionen ist dann die eigentliche Aufgabe.
Private Nachricht senden Benutzer-Profile anzeigen
 
Juli88

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2014, 15:32     Titel:
  Antworten mit Zitat      
Boah super vielen dank !!
Ich habe das jetzt auch so hinbekommen hab nochmal verglichen bis auf eine kleinigkeit hat das bei mir auch gestimmt Smile
Hab das mit ner While schleife gemacht Smile
Vielen lieben dank nochmal
Lieben Gruß
Verschoben: 10.01.2014, 15:33 Uhr von denny
Von Off Topic nach Programmierung
 
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 - 2025 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.