Verfasst am: 30.03.2015, 22:48
Titel: Nullstellenberechnung mit Newton- und Steffensenverfahren
Code:
% M-Script zur Bestimmung aller Schnittpunkte mittels Newtonverfahren
%***********************************************************
clearall closeall clc
% Werte eingeben disp = ('Eingabe:');
f = input('Funktion:');
df = input('Ableitung der Funktion:');
x0 = input('Startwert für die Iteration');
tol = input('Genauigkeit der Lösung');
nmax=20; %nmax - Maximale Zahl der Iterationen, Default = 20
flag =1; %Ausgabe der Zwischenwerte
% Rechnung
nullstelle =newton(f,df, x0,tol,nmax,flag);
x=x0:nmax;
plot(x,f,x,df) hold on
grid on
function[x0, y, n_it] = newton(f, df, x0, tol, nmax, flag)
%***********************************************************************
% Funktion newton.m % Nullstellensuche mittels Newton-Verfahren
%***********************************************************************
%
% [x0, y, n_it] = newton(f, df, x0, tol, nmax, 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) % nmax - Maximale Zahl der Iterationen, Default = 20 % flag - mit (flag = 0 oder Default) oder ohne (flag = 1) Ausgabe der Zwischenwerte % Output: % x0 - Nullstelle % y - Funktionswert bei x0 % n_it - Zahl der benötigten Iterationen
%*********************************
% Zahl der Eingabeparameter prüfen
%*********************************
ifnargin < 6, flag = 0; end ifnargin < 5, nmax = 20; end ifnargin < 4, tol = 1e-5; end
ytol = tol; % Toleranz der y-Werte (könnte bei Bedarf verändert werden)
%*******************************
% Iterationen
%*******************************
for n_it = 1:nmax
% Berechne neuen x-Wert x0(n_it)
x1 = x0 - feval(f,x0)/feval(df,x0);
y = feval(f,x0); % neuer Funktionswert if(flag == 1)% Zwischenwert anzeigen, falls flag gesetzt
string1 = sprintf('%3.i %2.8f %2.8f', n_it, x1, y);
disp(string1);
end
% Anzeige des Ergebnisses, falls Abbruchkriterium erreicht if(abs(y)<= ytol | abs(x1-x0) < tol) % Rechnung innerhalb x- oder y-Toleranz erfolgreich beendet if(flag == 1)% Komfort-Anzeige des Ergebnisses, falls flag gesetzt
string2 = sprintf('\nNäherungslösung x0 = %2.8e', x0);
disp(string2);
string2 = sprintf('mit f(x0) = %2.8e', y);
disp(string2);
string2 = sprintf('Zahl der Iterationen = %3.i, Toleranz = %0.8e\n', n_it, tol);
disp(string2);
end break% -> Abbruch der Schleife, wenn Genauigkeit erreicht else
x0 = x1;
if(n_it == nmax)
y = feval(f,x0);
% Rechnung nach Erreichen von nmax unvollständig abgebrochen, da zu wenige Iterationen
string2 = sprintf('\nDie 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 %1.6e\n', y, tol);
disp(string2);
end end end
Wie bekomme ich die Ableitung der Funktion? Da ich die Schnittstellen berechnen soll, muss ich dann anstatt der Ableitung die 2. Funktion eingeben? Wie g
Verfasst am: 31.03.2015, 10:18
Titel: Re: Nullstellenberechnung mit Newton- und Steffensenverfahre
Hallo Lizzie,
Bitte stelle Deine Frage vollständig im Body des Threads, nicht als Kommentar für ein angehängtes File. Danke.
Lasse unbedingt das "clear all" weg, denn das löscht alle Breakpoints des Debuggers - und auch alle geladenen Files aus dem Speicher zu entfernen ist eine sinnfreie Zeitvergeudung.
Verfasst am: 12.04.2015, 23:10
Titel: Ableitung einer Funktion zur Schnittstellenberechnung
Hallo,
also vielleicht ist die Aufgabenstellung so etwas klarer.
Ich habe folgende Funktion und Gerade gegeben:
g(x) = ((sin(3*x)/(x+1)))*(exp(cos(x).^2))
y(x) = (x/(2*pi))
Nun soll ich mittels Newton-Verfahren die Schnittstellen der beiden Gleichungen im Intervall 0-unendlich berechnen.
Das Newtonverfahren ist eine Methode zur Nullstellenberechnung. Dabei wird von einer Funktion f(x) die Tangente der Funktion gebildet. Der Schnittpunkt der Tangente mit der x-Achse bildet den ersten Näherungswert an die Nullstelle und so tastet man sich heran.
Die Formel des Newton-Verfahrens lautet: xn+1 = xn - (f(xn)/f'(xn))
Also benötige ich die Ableitung.
Um jetzt also die Schnittstelle der beiden Gleichungen zu berechnen, muss ich doch diese = 0 setzen, oder? Dann könnte ich doch das Newton-Verfahren anwenden, richtig?
Wäre das dann richtig?
((sin(3*x)/(x+1)))*(exp(cos(x).^2)) - (x/(2*pi)) =0
das wäre dann mein f(x).
Dann benötige ich aber davon die Ableitung.
Gibt es in Matlab eine Methode, wie ich leicht davon die Ableitung bekomme?
Verfasst am: 13.04.2015, 01:42
Titel: Re: Ableitung einer Funktion zur Schnittstellenberechnung
Hallo Lizzie,
Zitat:
Um jetzt also die Schnittstelle der beiden Gleichungen zu berechnen, muss ich doch diese = 0 setzen, oder?
Wie Du in der Gleichung richtig angegeben hast, musst Du die Differenz der beiden Gleichungen auf Null setzen.
Die Ableitung kannst Du entweder symbolisch berechnen, wenn das zur Aufgabenstellung passt und Du die Symbolic Toolbox hast, oder sie per finiten Differenz annähern. Du berechnest also:
mit einem geeigneten kleinen h, das grob geschätzt bei SQRT(EPS) liegen kann. Du kannst die Ableitung natürlich auch per Hand bestimmen.
Z.B. WikiPedia erklärt weiteres beim Thema Newton-Verfahren.
Gruß, Jan
Einstellungen und Berechtigungen
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.