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

Nullstellensuche mit Newton Formel

 

Maya89

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2014, 11:05     Titel: Nullstellensuche mit Newton Formel
  Antworten mit Zitat      
Hallo zusammen,

ich bin noch recht neu im Umgang mit Matlab und habe ein wahrscheinlich für euch triviales Problem.

Ich soll mittels der Newton Formel die Nullstellen folgender Gleichung ermitteln:

Code:
x_f = inline('(sin(3*x)./(x+1))*exp((cos(x)).^2)-x./(2*pi)');


Die Ableitung lautet dementsprechend:

Code:
x_f_der = inline('(3*exp(cos(x).^2)*cos(3*x)-(2*exp(cos(x).^2)*cos(x)*sin(x)*sin(3*x))/(x+1))-((sin(3*x)*exp((cos(x)).^2)/(x+1).^2))-1./(2*pi)');
 

Mein Code lautet jetzt wie folgt:

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


%*******************************
% Iterationen
%*******************************
for n_it = 0:20
   % Berechne neuen x-Wert x0(n_it)
   x1 = x0 - feval(f,x0)/feval(df,x0);
   y = feval(f,x0);    % neuer Funktionswert
   x0 = x1;
   % Anzeige des Ergebnisses, falls Abbruchkriterium erreicht
   if(abs(y)<= ytol | abs(x1-x0) < tol)
      % Rechnung innerhalb x- oder y-Toleranz erfolgreich beendet
      string1 = sprintf('%3.i   %2.8f   %2.8f', n_it, x1, y);    
       disp(string1); % -> Anzeigen des Ergebnisses, wenn Genauigkeit erreicht
     else
      x0 = x1;
      if (n_it == 20)
         y = feval(f,x0);
      end
   end
end



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. Sad Kann mir jemand erklären, was ich falsch mache? Das wäre echt großartig!

VG
Maya

[EDITED, Jan, Bitte Code-Umgebung benutzen - Danke!]


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 06.02.2014, 12:31     Titel:
  Antworten mit Zitat      
Hallo,

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

Nullstellen = unique(xresult)

Nullstellen =

    -1
     1


Viele Grüße,
Nras
Private Nachricht senden Benutzer-Profile anzeigen
 
Maya89

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.02.2014, 09:07     Titel:
  Antworten mit Zitat      
Hey Nras,

super, danke für deine schnelle Hilfe.

Das mit der Schleife hat echt funktioniert. Smile Smile

VG
Maya
 
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 - 2025 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.