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

LSQnonlin und ODE-Solver

 

Arthur

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2011, 10:33     Titel: LSQnonlin und ODE-Solver
  Antworten mit Zitat      
Hi,
und zwar möchte ich 15 Parameter an Messdaten anpassen.
Dazu wird in meinem Code ein Differentialgleichungssystem mit dem ODE-Solver (ode15s) gelöst und anschließend mit LSQnonlin optimiert.
Ich habe vorgegebene Startwerte, muss diese allerdings so begrenzen, dass mein ODE-Solver durchläuft - erweitere ich diese Grenzen oder verwende "zufällige" Startwerte (was ich austesten soll) bringt er eine Fehlermeldung:

Warning: Failure at t=... . Unable to meet integration tolerances
without reducing the step size below the smallest value allowed (...)
at time t.

Das Problem ist, dass ein Teil der Parameter in e-Funtionen im jeweiligen Nenner stehen und es bei gewissen Kombinationen von Parameterwerten wohl dazu kommt, dass die Lösung "explodiert".

Hat da zufällig jmd eine Idee, was man tun könnte?

Danke!
Gruß


Arthur

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.12.2011, 11:17     Titel:
  Antworten mit Zitat      
Hi,

ich bins nochmal Wink

Und zwar hieß es in einem anderen Beitrag, dass LSQnonlin versucht mit Differenzenquotienten zu arbeiten und man deshalb "DiffMinChange" in den Optionen verändern sollte.
Kann mir denn jmd erklären, was diese Option genau macht?

Gruß!
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 19.12.2011, 12:01     Titel:
  Antworten mit Zitat      
Hallo Arthur,

Die Dokumentation erklärt:
[quote]DiffMinChange: Minimum change in variables for finite-difference gradients (a positive scalar). The default is 1e-8.[/code]

Wenn man finite Differencen verwendet um einen Gradienten zu berechnen, muss man ja eine sinnvolle Schrittweite wählen. Wenn sie zu groß ist, führen die nicht-linearen Anteile zu starken Abweichungen, wenn man sie zu klein wählt treten wegen der Auslöschungsfehler große Ungenauigkeiten auf. Beispiel:
Berechne den Gradienten bei SIN(1):
Code:
g1 = (sin(1.5) - sin(0.5)) / 1
g2 = (sin(1+eps) - sin(1-eps))  / (2*eps)
cos(1)

DiffMinChange und DiffMaxChange limitieren die Schrittweite. Innerhalb dieser Limits wird aber (wahrscheinlich) eine spezielle Methode angewendet, um eine optimal Schrittweite zu erhalten.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Es ist die eine Sache, dass man DiffMinChange eventuell vergrößern sollte, wenn die Funktionsauswertungen fehlerbehaftet sind.

In deinem Fall denke ich aber eher, dass das Problem darin liegt, dass lsqnonlin unsinnige Parameter bzw. Parameterkombinationen verwendet. Ich würde es zunächst mal über Einschränkungen durch obere und untere Schranken versuchen (lb, ub).

Sollte es weitere Nebenbedingungen geben, könnte man auch über fmincon gehen.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.12.2011, 13:06     Titel:
  Antworten mit Zitat      
Hi,

Danke schon mal für eure Antworten!
Das Problem liegt schon an unsinnigen Parameter(kombinationen) - ich hatte anfangs auch schon Fmincon verwendet, da es allerdings keine weiteren Nebenbedingungen außer obere und untere Schranken gibt, bin ich auf LSQnonlin gestoßen.
Das Problem mit dem ODE-Solver hat sich nun auch erledigt, da ich die Schranken so gewählt habe, dass er keine Fehlermeldungen mehr bringt.
Jetzt könnte es halt nur sein, dass die besten Parameter außerhalb der Schranken liegen, allerdings erhalte ich auch so schon ein recht gutes Ergebnis.
"DiffMinChange" werde ich jetzt auch mal noch genauer testen, evtl werde ich mich dann nochmal melden Wink

Danke!
Gruß
 
Harald
Forum-Meister

Forum-Meister


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

du kannst ja mal sehen, ob die Lösung in einer Komponente an die Grenzen lb oder ub stößt. Falls das der Fall ist, kannst du versuchen, diese Grenzen etwas großzügiger zu machen (natürlich ohne dass es deswegen zu Fehlermeldungen durch ode15s kommt).

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2012, 16:42     Titel:
  Antworten mit Zitat      
Hi,

jetzt muss ich mich doch nochmal melden Wink

Und zwar habe ich mit den bisherigen Messdaten und der LSQnonlin ganz gute Ergebnisse erzielen können.
Allerdings habe ich nun neue Messdaten mit anderem Kurvenverlauf bekommen.
Diese Kurvenverläufe enthalten vor allem Peaks, die von der LSQnonlin nicht angepasst werden können.
Kann es einfach sein, dass die zu optimierende Funktion für diese Messdaten/Kurvenverläufe nicht geeignet ist?

Gruß
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.02.2012, 17:35     Titel:
  Antworten mit Zitat      
Hallo,

eine ganz pauschale Antwort auf eine ganz pauschale Frage: ja, das kann sein.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2012, 10:33     Titel:
  Antworten mit Zitat      
Hi,
nochmal Danke an Harald, allerdings habe ich nun doch noch eine Frage ...

Ich habe meine unteren und oberen Schranken ja so gewählt, dass LSQnonlin ohne Probleme durchläuft bzw. der ODE-Löser eben nicht abbricht.
Nun habe ich mit denselben Einstellungen auch die Fmincon nochmals zum Vergleich laufen, allerdings bricht nun der ODE-Löser wieder ab.

Weiß da zufällig jmd woran das liegen kann?

Danke und Gruß!
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.02.2012, 19:56     Titel:
  Antworten mit Zitat      
Hallo,

es nutzt ja nun nicht jeder Solver den gesamten möglichen Wertebereich aus. Es scheint einfach so, dass du im einen Fall Glück hattest und im anderen nicht.

Eine Möglichkeit wäre: wenn der Solver abbricht trotzdem einen Zielfunktionswert zurückgeben, aber eben einen sehr hohen um klar zu machen, dass das ein schlechter Punkt war.

Grüße,
Harald
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.