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

Nullstellenberechnung mit Newton- und Steffensenverfahren

 

Lizzie
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 22.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.03.2015, 22:48     Titel: Nullstellenberechnung mit Newton- und Steffensenverfahren
  Antworten mit Zitat      
Code:

% M-Script zur Bestimmung aller Schnittpunkte mittels Newtonverfahren
%***********************************************************
clear all
close all
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
 


Code:

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
%*********************************
if nargin < 6, flag = 0; end
if nargin < 5, nmax = 20; end
if nargin < 4, tol = 1e-5; end
ytol = tol;  % Toleranz der y-Werte (könnte bei Bedarf verändert werden)

%*********************************
% Startwerte
%*********************************

% Toleranz prüfen
% ----------------
if (tol <= 0), error( 'Toleranz muss positiv sein'); end
if (nmax <= 0), error( 'nmax muss positiv sein'); end

%*******************************
% Überschrift für Ausgabe
%*******************************

if (flag == 1)            %   Anzeige aller Zwischenschritte
   disp(' '); disp( 'Alle Zwischenschritte:');
   string1 = sprintf(' n_it       x0           f(x0)');    
   disp(string1);
   string1 = sprintf('-------------------------------');    
   disp(string1);
end

%*******************************
% 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
 


Nullstellenberechnung_Newton_Steffensen.JPG
 Beschreibung:
Hallo,

ich bekomme die Aufgabe im Anhang nicht gelöst.

g(x) =((sin(3*x)/(x+1)))*(exp(cos(x).^2))

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

Download
 Dateiname:  Nullstellenberechnung_Newton_Steffensen.JPG
 Dateigröße:  104.96 KB
 Heruntergeladen:  372 mal
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 31.03.2015, 10:18     Titel: Re: Nullstellenberechnung mit Newton- und Steffensenverfahre
  Antworten mit Zitat      
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Lizzie
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 22.03.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.04.2015, 23:10     Titel: Ableitung einer Funktion zur Schnittstellenberechnung
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.04.2015, 01:42     Titel: Re: Ableitung einer Funktion zur Schnittstellenberechnung
  Antworten mit Zitat      
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:
Code:
D = (f(x + h) - f(x)) / h;

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
Private Nachricht senden Benutzer-Profile anzeigen
 
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 - 2024 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.