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

fsolve erzeugt "Stufenfunktion", aber keine Fehler

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2013, 10:10     Titel: fsolve erzeugt "Stufenfunktion", aber keine Fehler
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein Problem bei der Nullstellensuche für die im code aufgeführte Funktion. Gesucht ist S, wobei alle anderen Werte konstant sind und lediglich NT für jeden Schleifendurchlauf neue Werte annimmt. Da die Schleife aber keine Probleme bereitet (NT hat die Form einer Kurve), poste ich den eigenständigen Kernteil des Problems.

hier die Funktion:

Code:

function val = Meine_Funktion(S,symvar)
% ich haber hier mal Werte manuell eingetragen, sie werden sonst über die Struktur symvar übergeben

E = 20000;
nu = 0.3;
YS02 = 700;
N = 14;
lambda = 1.3;
NT = 1.5;  % <-- dieser Wert ist variabel und liegt etwa zwischen 0 und 2

C = (1-2*nu)/(3*E)*(lambda^2 - 1);
val = (NT-C*S^2)/S - S/E - 0.002*(S/YS02)^N;
 


und der Aufruf:

Code:

guess_S = 0.001; % <-- wenn ich hier 1000 eingebe, bekomme ich einen anderen, genauso unsinnigen Kurvenverlauf.. keine Treppen mehr, aber dennoch falsch
S(i) = fsolve(@(S)Meine_Funktion(S,symvar),guess_S);
 


Ich weiß, dass fsolve auf Gauss-Newton wechselt, wenn die Standardeinstellung nicht funktioniert. Wobei bei der quadratischen Problematik nichts gegen den Standard-fsolve sprechen würde... Es ist außerdem bekannt, dass der klassische Newtonalgorithmus zu korrekten Ergebnissen führt.

Nun meine Frage: Was tut es??? (fsolve) Und warum bekomme ich weder eine Fehler- noch eine Hinweismeldung, sondern einfach nur "Treppenfunktionen"? Ist fsolve nicht geeignet, muss ich es manuell optimieren oder empfiehlt es sich, Newton manuell zu programmieren?

Ich wäre euch sehr dankbar für eure Hilfe.

Viele Grüße


MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 01.02.2013, 11:12     Titel:
  Antworten mit Zitat      
Hallo,

ich hatte kürzlich auch ein solches Problem. Es wurde eine Treppenfunktion gezeichnet. Das lag an Singularitäten. Welche Werte kommen denn raus für S?

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.02.2013, 11:28     Titel:
  Antworten mit Zitat      
Hallo,

fsolve sollte hier genau einen Wert zurückgeben.

Wann bekommst du eine Treppenfunktion?
Wenn du den Startwert variierst und Startwerte auf x-Achse und Resultate auf y-Achse? Oder wenn du NT variierst?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 01.02.2013, 12:15     Titel:
  Antworten mit Zitat      
Wenn du meinst, dass deine Funktion stetig von NT abhängt, dann kannst du das aufgrund von Rundungsfehlern für kleine S vergessen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2013, 12:37     Titel:
  Antworten mit Zitat      
Der Abschnitt oben befindet sich in einer (funktionierenden) Schleife, sodass für die Funktion selbst nur ein Wert heraus kommt. Lasse ich die Schleife durchlaufen, erhalte ich aus einem parabelförmigem NT-Verlauf eine Stufenfunktion für S.

Das Thema mit den Singularitäten hört sich interessant an. Ich habe mal zu Fuß verschiedene S ausprobiert und folgendes festgstellt:

für (NT-C*S^2)/S können nur negative Werte herauskommen
für - S/E - 0.002*(S/YS02)^N kommen positive Werte für +S und negative Werte für -S heraus, allerdings mit imaginärem Anteil..

Das heißt aber, dass fsolve für den Ansatz grundsätzlich geeignet scheint, oder ist das falsch??? (Vorausgesetzt man "entsingularisiert" die Funktion. Very Happy )

Grüße und Danke schonmal

Katrin
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.02.2013, 13:14     Titel:
  Antworten mit Zitat      
Hallo,

ich würde mir bei fsolve immer exitflag ansehen.

Du kannst die Gleichung ja mal mit S durchmultiplizieren. Dann hat man eine polynomiale Gleichung in S von (hier) Grad 13, d.h. es gibt 13 Nullstellen und somit Lösungen.
Was nun passieren kann: fsolve sucht die "nächstgelegene" Lösung, d.h. es ist möglich, dass es bei Parameterveränderungen zu Verschiebungen kommt, so dass man in eine andere Lösung hineinläuft.

Meine Empfehlung: in der Schleife als Startwert die vorherige Lösung verwenden, das sollte diesen Effekt verringern.

Du wirst dir jedoch Gedanken darüber machen müssen, welche der verschiedenen Lösungen bzw. Lösungskurven denn die richtigen sind.

Mit den gegebenen Parametern sehe ich z.B. Lösungen bei ca. -877, -150 und 180.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2013, 14:14     Titel:
  Antworten mit Zitat      
Erstmal die exit-flag:

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the default value of the function tolerance, and
the problem appears regular as measured by the gradient.

<stopping criteria details>



Wäre eine manuell geschriebene Iteration über Newton dann empfehlenswerter?

Jetzt mach ich erstmal Feierabend, Montag gehts weiter.. Ich wünsche euch ein schönes Wochenende! Cool

Danke und Grüße

Katrin
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.02.2013, 15:25     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Erstmal die exit-flag:

Ich meinte das dritte Rückgabeargument von fsolve.
In der Schleife ist es durchaus möglich, dass der Verlauf der Optimierung je nach Parametern unterschiedlich ist, und du willst das ja nicht für jeden Wert einzeln anschauen.

Zitat:

Wäre eine manuell geschriebene Iteration über Newton dann empfehlenswerter?

Ich würde sagen: nein. Das Problem liegt ja nicht in der Newton-Iteration, sondern dem Startwert.

Ich habe mal ein kleines Beispiel geschrieben, aus dem die Problematik visuell klar werden sollte:

Code:
x = -10:0.1:10;
x0 = 2.45;
for offset = -3:0.2:3
    nullstellen = (1:4) + offset;
    p = @(x) (x - nullstellen(1)).* ...
        (x - nullstellen(2)).* ...
        (x - nullstellen(3)).* ...
        (x - nullstellen(4));
    y = p(x);
    subplot(2,1,1)
    plot(x,y)
    hold on
    [xs, fs] = fsolve(p, x0);
    plot([x0 xs], [p(x0) fs], 'r')
    plot(x0, p(x0), 'rx')
    plot(xs, fs, 'r*')
    hold off
    axis([-10 10 -2 2])
    subplot(2,1,2)
    plot(offset, xs, 'o')
    axis([-3 3 0 8])
    hold on
    drawnow
    pause(2)
    %x0 = xs;
end
hold off
 


Man sieht hier schön, dass fsolve zunächst zur größten, dann zur 2.-größten, dann zur 3.-größten und schließlich zur 4.-größten Nullstelle konvergiert. Wenn man das vermeiden möchte, muss man einen parameter-abhängigen Startwert wählen. Sinnvoll wäre meiner Meinung nach wie gesagt, die Lösung des vorherigen Schritts als Startwert zu nehmen. (das % vor x0 = xs entfernen)

Grüße,
Harald

P.S.: Feierabend um 13:14? Ich werd neidisch...
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 01.02.2013, 15:43     Titel:
  Antworten mit Zitat      
Man könnte natürlich, wie Harald schon vorschlug, mit S multiplizieren und dann einfach den Befehl roots verwenden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2013, 10:48     Titel:
  Antworten mit Zitat      
Vielleicht erstmal eine Funktion, deren Ausgang ich genau kenne, wobei aber der matlab nach wie vor spinnt..

aus der Funktion

a ist gesucht

0 = a/b + 0.002*(a/c)^d - e;

erzeugt matlab mir folgenden Kurvenverlauf mit fsolve.. Die Vorgabekurve ist auch eingezeichnet, ab einer Stelle steigt er einfach aus (geändert TolX oder TolFun haben keine Auswirkungen gehabt)..

fsolve-Problem.pdf
 Beschreibung:

Download
 Dateiname:  fsolve-Problem.pdf
 Dateigröße:  5.84 KB
 Heruntergeladen:  437 mal
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.02.2013, 10:51     Titel:
  Antworten mit Zitat      
Hallo,

bitte auf die Anregungen eingehen.

Füge doch zu deinem weiteren Beispiel den Code bei. Der Anhang lädt nicht.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2013, 10:56     Titel:
  Antworten mit Zitat      
Den Ansatz mit roots verstehe ich in sofern nicht, dass ich es ja nicht schaffe, die Funktion auf die entsprechende Form zu bringen.

0 = a/b + 0.002*(a/c)^d - e;

0 = a^2/b + a*(0.002*(a/c)^d-e);

--> r = roots[1/b 0.002*(a/c)^d-e)] enthält ja immer noch die Variable..
Und wenn ich das richtig verstehe geht roots immer von Exponentenschritten (n+1) aus, nicht?

Bitte entschuldigt, dass ich mich mit dem Mathezeugs etwas schwer tue.
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2013, 11:13     Titel:
  Antworten mit Zitat      
http://www.gomatlab.de/download,id,5958.html

Geht der link? Bei mir lädt der Anhang..

Aufruf:
Code:

guess_a = 450;

a = fsolve(@(a)Funktion(a,symvar),guess_a);
 


Funktion:
Code:

function [val] = Funktion(a,symvar)

% aus symvar
b = 170000;
c = 420;
d = 13.5;
e = 0.0053;

val = a/b + 0.002*(a/c)^d - e;
 


Es sollte ein Wert von etwa 430 herauskommen.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.02.2013, 12:07     Titel:
  Antworten mit Zitat      
Hallo,

jetzt habe ich den Anhang öffnen können.

Was ist hier symvar? Wie entsteht die Kurve? Bitte den kompletten relevanten Code posten.

Wie bereits gesagt wird MATLAB per Gradientenmethode das nächstgelegene Minimum suchen. Wenn es mehrere Minima gibt, kann es bei Parameterstudien zu Sprüngen kommen, wenn man die Startwerte nicht anpasst. Ich meine, in meiner Nachricht von 01.02.2013, 14:25 ein sehr anschauliches Beispiel für das Problem gegeben zu haben, inkl. einer Beschreibung wie man es behebt.

Was den Ansatz mit roots angeht: nutze (a/c)^d = (1/c^d) * a^d.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2013, 12:32     Titel:
  Antworten mit Zitat      
Ich habe die Startwerte angepasst, so wie vorgeschlagen, das gibt ja bis zu dem Punkt, wo es offensichtlich Konvergenzprobleme zu geben scheint, ganz gut. Mittlerweile habe ich Newton nochmal selbst geschrieben, weil ich denke, dass ich da eine bessere Überschaubarkeit behalte, ohne über roots arbeiten zu müssen (da rechnet er ewig und drei tage dran...).

Die symvar ist eine Struktur, deren Inhalte ich in der Funktion entpacke, ich habe hier die Werte manuell eingefügt, um nicht die ganze Tapete posten zu müssen.

Ich hangel mich mal weiter durch, danke für die geduldigen Hilfestellungen.


Viele Grüße
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.