function[x0, y, n_it] = newton(f, df, x0, tol)
%***********************************************************************
% Funktion newton.m % Nullstellensuche mittels Newton-Verfahren
%***********************************************************************
%
% [x0, y, n_it] = newton(f, df, x0, tol, flag) % Input: % f - Name der Funktion, deren Nullstelle gesucht wird (in Hochkomma oder mit @) % df - Name der Ableitung von f (in Hochkomma oder mit @) % x0 - Startwert % tol - gewünschte Toleranz der x-Werte (Default = 1e-5)
% Output: % x0 - Nullstelle % y - Funktionswert bei x0 % n_it - Zahl der benötigten Iterationen
%*********************************
% Zahl der Eingabeparameter prüfen
%*********************************
ifnargin < 4, tol = 1e-5; end
ytol = tol; % Toleranz der y-Werte (könnte bei Bedarf verändert werden)
Damit bekomme ich auch die Nullstelle 0 angezeigt und die Zwischenschritte, aber es gibt noch eine 2. Nullstelle und die gibt mir Matlab leider nicht aus. Kann mir jemand erklären, was ich falsch mache? Das wäre echt großartig!
das Problem, das du beschreibst, liegt in der Natur des Newton-Verfahrens, denn das Newton-Verfahren kann konvergieren, muss es aber nicht - das hängt von deinem Startwert ab. Wenn es konvergiert, dann wird es dir, ebenfalls abhängig vom Startwert, nur eine der vorhandenen Nullstellen liefern. Ein einfaches Beispiel:
f(x) = -x^2 + 1;
Für Startwerte kleiner als 0 findest du die Nullstelle bei -1. Für Startwerte größer als 0 findest du die Nullstelle bei der 1. Für den Startwert x0 = 0 findest du nichts (könntest du mal testen, ich habe das nun nicht gemacht).
Eine Möglichkeit, wie du deine Chancen erhöhen kannst, alle (mehrere) Nullstellen zu finden, ist mehrere Startwerte zu wählen. Dabei könnte dein x0 dann einfach ein Vektor mit Startwerten sein, über den du eine Schleife laufen lässt. Deine Rückgabe y ist dann ebenfalls ein Vektor mit den gefundenen Nullstellen.
Andernfalls könntest du auch mehrere Funktionsaufrufe für verschiedene Startwerte machen
Edit: Hab nun doch ein kleines Beispiel mit deiner Funktion getestet:
Code:
f = inline('-x.^2+1');
df = inline('-2*x');
x0range = linspace(-5,5,100);
xresult = NaN(100,1);
tol = 1e-10;
for i = 1:100 [x0, y, n_it] = newton(f, df, x0range(i), tol);
xresult(i) = x0;
end
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
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.