Mehrdimensionales Newtonverfar < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 19:30 So 04.06.2006 | Autor: | Markustt |
Hallo Ich sitze jetzt schon eine ganze Weile vor folgender Aufgabe und komme nicht weiter ,muss darüber aber ein Referat halten
f(x,y):= 2x³-x²y² =0
g(x,y):=3xy³ + x³y²-5 =0
In der folgenden Aufgabe soll eine Lösung (x,y) für das nichtlineare GLS bestimmt werden .Jede Lösung bestimmt eine krumme Kurve in der xy-Ebene. Deren Schnittpunkt S ist die gesuchte Lösung, siehe Skizze. Aus dieser liest man ganz grob ab : S liegt in der Nähe von (x0;y0) = (0.8;1.2). Dieser Wert soll jetzt verbessert werden. Linearisieren sie dazu die beiden Funktionen f und g im Punkt (x0;y0) (Tangentialebene). Setzen sie nun statt der ursprünglichen beiden nichtlinearen Gleichungen die beiden Linearisierungen gleich 0. Dies liefert ein lineares GLS dessen Lösungen (x1;y1) sich leicht bestimmen lässt, und die unter sehr allgemeneinen Bedingungen eine bessere Näherungfür den gesuchten Punkt S darstellt als (x0;y0). Bestimmen sie zur Probe die Werte f(x1;y1) und g(x1;y1).
Diese müssen näher bei 0 liegen als die WErte f(x0;y0) und g(x0;y0). Das geschilderte Verfahren kann man jetzt wieder auf (x1;y1) anwenden und erhält noch genauere Werte (x2;y2) usw. (for Schleife). Programmieren sie eine Schleife , die 5 Schritte des Newton Verfahrens automatisch , d.h ohne manuelle Eingriffe in das Programm ausführt.
(Zur Kontrolle die Lösung auf 9 Stellen genau : x=0.763406231, y = 1.23564253).
Wäre echt für jede Hilfe dankebar da ich mit Maple meine argen Probleme habe.
MFG und danke schon mal Markus
* Ich habe diese Frage auch in folgenden Foren auf anderen Internetseiten gestellt:
* Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Hallo,
schauen wir uns das doch mal an:
Zuerst solltest du wissen, dass man Funktionen in Maple folgendermaßen zuweisen sollte:
f:=(x,y) -> [mm] 2*x^3-x^2*y^2; [/mm]
g:=(x,y) -> [mm] 3*x*y^3 [/mm] + [mm] x^3*y^2-5;
[/mm]
Nun weiß ich nicht, ob du nur Probleme mit Maple hast oder auch mit dem Ansatz. Also in aller Kürze:
Die erste Linearisierung erhalten wir durch Auswerten der Funktion an der Stelle [mm] (x_0,y_0) [/mm] und Addition der partiellen Ableitungen an dieser Stelle gewichtet mit den x- bzw. y-Differenzen. Also (Der Striche bedeute mal Linearisierung):
[mm] \overline{f}_0 [/mm] = [mm] f(x_0,y_0) [/mm] + [mm] (x-x_0)*\bruch{\partial{f(x,y)}}{\partial{x}}|_{(x_0,y_0)} [/mm] + [mm] (y-y_0)*\bruch{\partial{f(x,y)}}{\partial{y}}|_{(x_0,y_0)}
[/mm]
Das müssen wir noch nicht mal ausrechnen. Das macht Maple natürlich für uns. Und damit wir nicht in jedem Schritt die Linearisierung neu ausrechnen müssen. versehen wir die Linearisierungsfunktion mit einem Parameter "step":
f_lin := (step,x,y) -> f(X[step],Y[step]) + (x - X[step])*eval(diff(f(x_,y_),x_),[x_=X[step],y_=Y[step]]) + (y - Y[step])*eval(diff(f(x_,y_),y_),[x_=X[step],y_=Y[step]]);
Entsprechend für g:
g_lin := (step,x,y) -> g(X[step],Y[step]) + (x - X[step])*subs([x_=X[step],y_=Y[step]],diff(g(x_,y_),x_)) + (y - Y[step])*subs([x_=X[step],y_=Y[step]],diff(g(x_,y_),y_));
Du siehst die Variablen x_ und y_, die ich eingeführt habe, damit Maple sie nicht mit den Funktionsvariablen verwechselt. Ebenso ist zu beachten, dass die Näherungen groß geschrieben werden, damit sie sich nicht ebenfalls mit den anderen Variablen vermischen. Also: X[0] und Y[0] !
Nun können wir beginnen:
step := 0;
X[0] := 0.8;
Y[0] := 1.2;
Nun erstellen wir das Gleichungssystem mit den linearisierten Funktionen, lösen diese und aktualisieren die Näherungswerte in einem Schritt:
assign(solve([f_lin(step,X[step+1],Y[step+1]),g_lin(step,X[step+1],Y[step+1])]));
Nach jedem Schritt muss nactürlich der Wert von step um 1 erhöht werden!
Nun kannst du die letzte Zeile z.B. in eine For-Schleife einbauen, die step von 0 bis 5 durchlaufen lässt und du hast deine Lösung.
Denkbar wäre etwas in der Art:
for step from 0 while step <= 5 do
assign(solve([f_lin(step,X[step+1],Y[step+1]),g_lin(step,X[step+1],Y[step+1])]));
[mm] printf("(x[\%d],y[\%d]) [/mm] = [mm] (\%f,\%f)\backslash{n}",step,step,X[step],Y[step]);
[/mm]
end do;
Wenn du noch Fragen hast, dann melde dich. Sieh dir aber ruhig mal den Quelltext an und schlage ruhig die unbekannten Funktionen in der Maple-Hilfe nach.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 00:15 Mo 05.06.2006 | Autor: | Markustt |
Also ich habe soweit ich glaub schon mal alles hinbekommen für einen Durchlauf
Nur mit der For Schleife komme ich noch nicht zu recht wäre nett wenn jemand da mal nen Blick drauf werfen könnte
Ich habe die Datei mal hochgeladen
http://rapidshare.de/files/22222946/Maple_Ref.mws.html
danke und mfg markus
|
|
|
|
|
Hallo,
wichtig ist, dass du bei der Eingabe nicht <RETURN> sondern <SHIFT>+<RETURN> benutzt. Dann wird die Zeile nicht sofort ausgeführt und du kannst einen ganzen Block tippen.
Sonst gibt es bei der For-Schleife nix Kompliziertes:
for i from 0 while i <= 5 do
TuDiesTuJenes...
end do;
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 00:53 Mo 05.06.2006 | Autor: | Markustt |
Ja ich habe ja bei meinem Programm die Endwerte in den Variablen [mm] Erg_X [/mm] und [mm] Erg_Y [/mm] gespeichert wie kann ich die Werte jetzt beim nächsten Durchlauf wieder verwenden ?
mfg und danke Markus
|
|
|
|
|
Am Ende jedes Schleifendurchlaufs einfach:
X_Wert := [mm] Erg_X;
[/mm]
Y_Wert := [mm] Erg_Y;
[/mm]
Und weiter geht's mit den neuen Werten!
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 01:15 Mo 05.06.2006 | Autor: | Markustt |
fehlt da noch viel bei dem programm wo ich schon haben ?
mfg markus
|
|
|
|
|
Hi,
du bist praktisch fertig!
Du musst noch Folgendes tun:
1. Schreib alles ab dem for... in eine Execution Group, will heißen: Jedesmal, wenn du in die nächste Zeile springst, musst du <SHIFT>+<RETURN> benutzen.
Am Ende muss die gesamte For-Schleife hinter einem einzigen >-Zeichen stehen. Bei dir steht dieses Zeichen im Moment vor jeder Zeile!
2. Ergänze die beiden Zeilen von meinem vorigen Beitrag, damit die Näherungswerte aktualisiert werden.
3. Schließe die Schleife mit "end do;" ab.
FERTIG! Schon funktioniert dein Code!
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:28 Mo 05.06.2006 | Autor: | Markustt |
So hab das jetzt mal gemacht so wie ich denke , aber irgendwie klappt da was noch ned wirklich
http://rapidshare.de/files/22272755/Maple_Re_forf.mws.html
wär super wenn du nochmal nen blick drauf werfen könntest
betsen dank markus
|
|
|
|
|
Den Code hast du ja nun komplett zusammen, aber du musst ihn im richtigen Format eingeben.
Also nochmal: <SHIFT> + <RETURN> benutzen!
1. Markiere die Zeile "F_eing := ...."
2. Schneide sie aus
3. Klicke mit der Maus hinter das For-Statement
4. Drücke <SHIFT>+<RETURN>
5. Füge in die neue Zeile den eben ausgeschnittenen Inhalt ein
nun mit der nächsten Zeile fortfahren
1. Markiere die Zeile "G_eing :=. ..."
2. Schneide sie aus
3. Klicke mit der Maus hinter die "F_eing := ...."-Zeile
4. Drücke <SHIFT>+<RETURN>
5. Füge in die neue Zeile den eben ausgeschnittenen Inhalt ein
usw. usf.
Die For-Schleife wird wirklich nur dann funktionieren, wenn alle Zeilen ab der For-Zeile in EINEM Block stehen.
Gruß
Martin
|
|
|
|