Newton- / Steffensen-Verfahren < Numerik < Hochschule < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 14:33 So 22.03.2015 | Autor: | Leondema |
Aufgabe | Schnittpunktberechnung zweier Funktionen |
Hallo,
ich habe 2 Funktionen vorgegeben, deren Schnittpunkt ich mit Hilfe des Newton- und Steffenson-Verfahren berechnen soll.
Die Gerade schneidet die Kurve an drei Stellen.
Durch das Steffens-Verfahren erhalte ich bei Eingabe von entsprechenden Startwerten auch genau diese Schnittpunkte. Wenn ich aber das Newton-Verfahren anwende erhalte ich immer nur einen Schnittpunkt, egal welchen Startwert ich wähle.
Kann mir jemand sagen, wieso das so ist ?
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
Liebe Grüße
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 15:17 So 22.03.2015 | Autor: | DieAcht |
Hallo Leondema und !
> ich habe 2 Funktionen vorgegeben, deren Schnittpunkt ich
> mit Hilfe des Newton- und Steffenson-Verfahren berechnen
> soll.
Wir können dir mehr helfen, wenn du uns beide Funktionen zeigst.
> Die Gerade schneidet die Kurve an drei Stellen.
Welche Gerade? Kann es sein, dass die eine der zwei Funktionen
eine affine Funktion der Form [mm] $f(x)=a*x+b\$ [/mm] ist?
> Durch das Steffens-Verfahren erhalte ich bei Eingabe von
> entsprechenden Startwerten auch genau diese Schnittpunkte.
Okay, aber du erhälst zunächst nur die [mm] $x\$-Koordinaten [/mm] der Schnitt-
punkte. Wir haben zwei Funktionen [mm] $f\$ [/mm] und [mm] $g\$ [/mm] und wollen die
Schnittpunkte berechnen. Wir suchen demnach alle *möglichen* [mm] $x\$,
[/mm]
so dass gilt: [mm] $f(x)=g(x)\$. [/mm] Für die Verfahren betrachten wir dem-
nach die Hilfsfunktion [mm] $h(x):=f(x)-g(x)\$. [/mm] Die Schnittpunkte er-
halten wir erst nach der Berechnung der Nullstellen von [mm] $h\$. [/mm] Ist
dir das klar? Kannst du das sauber modellieren?
> Wenn ich aber das Newton-Verfahren anwende erhalte ich
> immer nur einen Schnittpunkt, egal welchen Startwert ich
> wähle.
Diese Aussage ist falsch. Wähle zum Beispiel als Startwert eine
der anderen Nullstellen. Es kann aber durchaus sein, dass das
Verfahren für alle andere *mögliche* Startwerte nur gegen die
eine Nullstelle konvergiert. Hast du denn schon das Newton-Ver-
fahren auf Konvergenz überprüft?
Gruß
DieAcht
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 22:15 So 22.03.2015 | Autor: | Leondema |
Hallo DieAcht,
Danke für Deine schnelle Antwort.
Genau eine der beiden Funktionen ist die Gerade und die andere eine Kurve.
( [mm] y(x)=x/pi^2; [/mm] f(x) =(sin(3.*x)./(x+1)).*exp((cos(x)).^2) )
Ja das mit der Hilfsfunktion ist mir klar und ich habe bereits mithilfe dieser den einen Schnittpunkt bestimmen können. Da ich das ganze mit Matlab modelliert habe, kann ich durch den Aufruf des Plots auch sehen, dass es noch zwei weitere Schnittpunkte gibt. Außerdem gelingt es mir durch das Steffensenverfahren alle dieser Punkte zu bestimmen.
Ich habe gelesen, dass es möglich ist dass das Newtonverfahren möglicherweise divergiert oder immer nur zu einer Nullstelle konvergiert. Aber was genau meinst Du mit auf Konvergenz überprüft? Dass die Toleranz eingehalten wird ??
Vielleicht liegt genau in dieser Überprüfung der Schlüssel zum Erfolg
Danke
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 22:17 So 22.03.2015 | Autor: | Leondema |
y(x) = x/ 2*pi heißt die Funktion sorry..
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 01:15 Mo 23.03.2015 | Autor: | rmix22 |
Also mit
[mm] $y(x)=\br{x}{2*\pi}$
[/mm]
und
[mm] $f(x)=\br{sin(3*x)}{x+1}*e^{cos^2(x)}$
[/mm]
hat $y(x) - f(x)$, wie dieAcht schon geschrieben, sieben Nullstellen. Eine davon ist trivialerweise x=0, drei sind negativ und drei sind positiv. Hast du bei deiner Aussage, es gäbe nur drei Lösungen, vielleicht nur die positiven gesehen/gemeint.
Ich hab mir jedenfalls schnell den Newton Vierzeiler geschrieben und erhalte für geeignete Startwerte alle sieben Lösungen:
[mm] $\vektor{-4 \\ -3\\-2\\0\\1\\2\\3}$\to\vektor{-3.805\\-3.299\\-2.004\\0\\0.972\\2.381\\2.883}$
[/mm]
An der Konvergenz liegts hier also nicht.
Wie hast du denn das Newton-Verfahren implementiert? In Matlab? Dann poste doch einfach den Code.
Hast du Matlab das Differenzieren überlassen oder hast du es selbst erledigt? Vielleicht ist dabei ein Fehler passiert.
Gruß RMix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 22:23 Mo 23.03.2015 | Autor: | Leondema |
Hallo rmix22
Du hast vollkommen Recht.. ich habe die Grenzen nicht erwähnt. Es geht mir nur um die positiven Schnittpunkte.
Genau diese drei Punkte habe ich auch bestimmen können. Leider aber nur mit dem Steffensenverfahren. Für das Newtonverfahren komme ich nur auf die erste.
Gerne poste ich den Code, vielleicht kannst du meinen Fehler entdecken
function [x0, y, n_it] = Newtonschnittp(f, df, x0, tol, nmax)
%***********************************************************************
% Nullstellensuche mittels Newton-Verfahren
%***********************************************************************
%
% Input:
% f - Funktion
% df - Ableitung von f
% x0 - Startwert
% tol - gewünschte Toleranz der x-Werte
% nmax - Maximale Zahl der Iterationen
%
% Output:
% x0 - Nullstelle
% y - Funktionswert bei x0
% n_it - Zahl der benötigten Iterationen
%*******************************
for n_it = 1: nmax
x1 = x0 - (f(x0)-(x0/(2*pi)))/((df(x0)-(1/(2*pi))));
y = f(x0); % neuer Funktionswert
if(abs(y)<= tol || abs(x1-x0) < tol)
% Rechnung innerhalb x- oder y-Toleranz beendet
break % -> Abbruch der Schleife, wenn Genauigkeit erreicht
else
x0 = x1;
if (n_it == nmax)
y = f(x0);
% Rechnung nach Erreichen von nmax unvollständig abgebrochen, da zu wenige Iterationen
string2 = [mm] sprintf('\nDie [/mm] Zahl von %3.i Iterationen', nmax);
disp(string2);
string2 = sprintf('ergab die Näherung x0= %2.8e', x0);
disp(string2);
string2 = sprintf('fun(x0) = %2.8e nicht innerhalb der Toleranz [mm] %1.6e\n', [/mm] y, tol);
disp(string2);
end
end
end
Vielen Dank und liebe Grüße
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 00:34 Di 24.03.2015 | Autor: | rmix22 |
> Hallo rmix22
>
> Du hast vollkommen Recht.. ich habe die Grenzen nicht
> erwähnt. Es geht mir nur um die positiven Schnittpunkte.
Ja, derartige Informationen können enorm hilfreich sein. Ebenso wie die Verwendung des korrekten Formelsatzes. Ich entnehme deinem fehlenden Protest, dass die Funktionsgleichungen tatsächlich so sind, wie von mir angegeben.
> Gerne poste ich den Code, vielleicht kannst du meinen
> Fehler entdecken
> for n_it = 1: nmax
>
> x1 = x0 - (f(x0)-(x0/(2*pi)))/((df(x0)-(1/(2*pi))));
Mir ist nicht klar, was du da mit dem pi aufführst.
Sollte es nicht einfach
x1 = x0 - f(x0)/df(x0);
lauten?
>
> y = f(x0); % neuer Funktionswert
Dann sollte das wohl eher
y = f(x1);
sein.
> if(abs(y)<= tol || abs(x1-x0) < tol)
Dieses Abbruchkriterium ist ein durchaus übliches. Es kann allerdings sinnvoll sein, für y und x unterschiedliche Toleranzen zu verwenden.
Manchmal ist es zweckmäßiger, auf relative Präzision abzuzielen und nicht auf absloute. Man berechnet also etwa den Absolutbetrag des geschätzten relativen Fehlers [mm] $\left|{\br{x_1-x_0}{x_1}}\right|$ [/mm] und prüft, ob er kleiner als ein vorgegebener epsilon-Wert ist.
Ein weiteres, gelegentlich eingesetztes Abbruchkriterium ist, wenn die Norm von y(x1) nicht mehr kleiner als die Hälfte der Norm von y(x0) ist, dieses dann UND-verknüpft mit der Forderung, dass die Norm von x1-x0 kleiner als ein Toleranzwert ist.
> if (n_it == nmax)
> y = f(x0);
Kannst du dir schenken, da y weiter oben schon den Wert f(x1) erhalten haben sollte.
Gruß RMix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 10:51 Mi 25.03.2015 | Autor: | Leondema |
Hallo,
ich habe nun deine Änderungen in den Code aufgenommen.
Die Funktionseingabe soll allerdings den Toleranzwert enthalten und hat kein vorgegebenes epsilon, sodass diese Variante nicht möglich ist.. oder habe ich etwas falsch verstanden?
Letztendlich erhalte trotz der Anpassungen nach wie vor nur den einen Wert von 0.9724...
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 17:55 Mi 25.03.2015 | Autor: | rmix22 |
> Hallo,
>
> ich habe nun deine Änderungen in den Code aufgenommen.
>
> Die Funktionseingabe soll allerdings den Toleranzwert
> enthalten und hat kein vorgegebenes epsilon, sodass diese
> Variante nicht möglich ist.. oder habe ich etwas falsch
> verstanden?
>
> Letztendlich erhalte trotz der Anpassungen nach wie vor nur
> den einen Wert von 0.9724...
>
Kaum zu glauben , aber so nicht zu überprüfen.
Poste nochmals die Funktion und vor allem die Ableitung, die du verwendest (diesmal bitte eindeutig lesbar) und auch dein Matlab Skript in der aktuellen Fassung.
Ich gehe davon aus, dass du in etwa die Startwerte verwendest, die ich auch angegeben hatte.
Kann es sein, dass vl durch einen Schreibfehler dein Skript nicht das übergebene Argument x0 als Startwert verwendet sondern eine feste globale Variable?
Gruß RMix
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 00:15 Mo 23.03.2015 | Autor: | DieAcht |
> Hallo DieAcht,
>
> Danke für Deine schnelle Antwort.
>
> Genau eine der beiden Funktionen ist die Gerade und die
> andere eine Kurve.
>
> ( [mm]y(x)=x/pi^2;[/mm] f(x) =(sin(3.*x)./(x+1)).*exp((cos(x)).^2)
> )
*Ich* lese letzteres als
[mm] f(x)=\frac{\sin(3x)}{x+1}*\exp(cos^2(x)).
[/mm]
Ist [mm] y(x)=\frac{x}{2\pi}, [/mm] so hat die Gleichung [mm] $f(x)=y(x)\$ [/mm] sieben Lösungen.
Ist [mm] y(x)=\frac{x}{2}*\pi, [/mm] so hat die Gleichung [mm] $f(x)=y(x)\$ [/mm] vier Lösungen.
(Beide Aussagen folgen aus einem Plot durch WolframAlpha.)
Demnach stimmt irgendetwas oben nicht, denn du sprichst von drei
Schnittpunkten.
(Mit der Maus sind übrigens die Formeln anklickbar, so dass du
das auch ziemlich schnell richtig aufschreiben kannst.)
> Ja das mit der Hilfsfunktion ist mir klar und ich habe
> bereits mithilfe dieser den einen Schnittpunkt bestimmen
> können. Da ich das ganze mit Matlab modelliert habe, kann
> ich durch den Aufruf des Plots auch sehen, dass es noch
> zwei weitere Schnittpunkte gibt.
Du kannst auch gerne deine Matlab-Datei hier hochladen. Es kann
natürlich sein, dass irgendwo ein kleiner Fehler ist.
> Außerdem gelingt es mir
> durch das Steffensenverfahren alle dieser Punkte zu
> bestimmen.
Okay, dann geht es nur noch um das Newton-Verfahren.
> Ich habe gelesen, dass es möglich ist dass das
> Newtonverfahren möglicherweise divergiert oder immer nur
> zu einer Nullstelle konvergiert. Aber was genau meinst Du
> mit auf Konvergenz überprüft? Dass die Toleranz
> eingehalten wird ??
Es gibt verschiedene Arten Konvergenz des Newton-Verfahrens zu
zeigen. Wenn es zum Beispiel in einem Intervall [mm] $I=(a,b)\$ [/mm] genau
eine Nullstelle gibt und [mm] $h'>0\$ [/mm] bzw. [mm] $h''<0\$ [/mm] auf [mm] $I\$ [/mm] gilt, sowie
der Startwert [mm] $x_0\in [/mm] I$ links von der Nullstelle liegt, so kon-
vergiert das Verfahren gegen die Nullstelle. (In diesem Fall
sogar streng monoton wachsend.) Es gibt aber verschiedene Mö-
glichkeiten die Konvergenz zu zeigen und es gibt auch viele
Bücher dazu... Genauer kann man dir nur mit mehr und genauerem
Input helfen.
|
|
|
|