|
|
Modellfit mittels fminunc basierend auf Messdaten |
|
MatlabNewbie2022 |
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 24.10.22
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.10.2022, 14:24
Titel: Modellfit mittels fminunc basierend auf Messdaten
|
|
Hi zusammen,
ich habe Messdaten, mit Hilfe derer ich ein Modell fitten möchte. Für den Fit möchte ich den Befehl "fminunc" verwenden, da ich später ein Modell mit mehreren Koeffizienten und Variablen haben werden. Um mein Skript aber überhaupt zum laufen zu bekommen, habe ich es reduziert und ihr findet es im folgenden als Minimalbeispiel:
Allerdings bekomme ich dafür nur eine Fehlermeldung. Kann mir jemand weiterhelfen, wo hier mein Fehler liegt?
Besten Dank im Voraus!
VG Sebastian
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 24.10.2022, 14:46
Titel:
|
|
Hallo,
fminunc möchte ein Function Handle, das ein Argument entgegennimmt. Zudem willst du wahrscheinlich über die Abweichungen summieren?
Für das Fitten von Modellen geeigneter wäre lsqcurvefit:
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
MatlabNewbie2022 |
Themenstarter
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 24.10.22
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.10.2022, 14:57
Titel:
|
|
Hallo,
vielen Dank für die schnelle Antwort. Ich habe mich nicht präzise ausgedrückt.
Der Ausdruck "A0 .* exp(EA/kB./x1)" ist nur ein Term, d.h. wenn mein Skript einmal läuft, werden später noch weitere derartige Terme hinzukommen. Insgesamt werden es 9 Koeffizienten und 5 Variablen sein. Meines Wissens kann "lsqcurvefit" das nicht mehr abbilden.
Diese Koeffizienten (in meinem Minimalbespiel sind das A0 und EA) sollen derart gefittet werden, dass die Funktion inkl. dieser gefitteten Koeffizienten das gesamte Ergebnis meiner Versuche bestmöglich abbildet (jeder Koeffizient ist eine Konstante für den gesamten Versuchsdatensatz). In meinem Minimalbeispiel hatte ich vier Versuchsdurchläufe bei verschiedenen Temperaturen (x1), woraus sich unterschiedliche Lebensdauern (x2) ergeben haben.
VG Sebastian
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 24.10.2022, 16:44
Titel:
|
|
Hallo,
stimmt, lsqcurvefit kann nur eine Variable.
Um dennoch den Least Squares - Aspekt nicht zu verlieren, würde ich zu
lsqnonlin
statt fminunc raten.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
MatlabNewbie2022 |
Themenstarter
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 24.10.22
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 25.10.2022, 12:25
Titel:
|
|
Habe es jetzt mal mit
lsqnonlin
probiert und das Skript läuft auch schon mal durch. Folgende Code habe ich dafür verwendet:
Allerdings habe ich noch das Problem, dass die zwei Koeffizienten A1 (=x(1)) und EA (=x(2)) nach dem Durchlauf weiterhin den Startwerten entsprechen (egal, welche Startwerte ich eingebe). Für einen Abgleich meines Minimalbeispiels habe ich die Lösung auch mal mit
lsqcurvefit
gefittet und auf dem Bild im Anhang sind die mit
lsqcurvefit
gefitteten Koeffizienten abgebildet. Die resultierende Kurve sieht auch plausibel aus.
lsqnonlin
findet aber diese Werte nicht. Kannst du dir vorstellen, woran das liegt?
Beschreibung: |
|
Download |
Dateiname: |
Fit_with_lsqcurvefit.png |
Dateigröße: |
43.94 KB |
Heruntergeladen: |
196 mal |
|
|
|
MatlabNewbie2022 |
Themenstarter
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 24.10.22
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 25.10.2022, 12:39
Titel:
|
|
Eine Korrektur von "fun" in
lsqnonlin
führt zumindest dazu, dass EA (=x(2)) sich verändert. A1 (=x(1)) bleibt jedoch weiterhin immer der Startwert:
Fehlt möglicherweise
lsqnonlin
noch eine Information?
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 25.10.2022, 12:41
Titel:
|
|
Hallo,
du solltest bei lsqnonlin auch das Quadrieren und Summieren weglassen:
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
MatlabNewbie2022 |
Themenstarter
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 24.10.22
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 25.10.2022, 12:58
Titel:
|
|
Guter Punkt! Wenn ich für A1 (=x(1)) jetzt den gefitteten Wert aus dem
lsqcurvefit
-Fit als Startwert einsetze, dann wird EA (x=(2)) richtig approximiert - selbst wenn der Startwert von EA ein gutes Stück daneben liegt
Wenn ich jedoch den Startwert von A1 verändere, wird lediglich EA (noch) bestmöglich gefittet, der gefittete Wert von A1 entspricht allerdings weiterhin dem Startwert (auch wenn ich den Wert nur knapp um den Zielwert variiere) - auch nachdem ich das Summieren und Quadrieren entfernt habe.
Hast du noch eine Idee woran das liegt?
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 25.10.2022, 14:20
Titel:
|
|
Hallo,
ich würde generell die Parameter in einer ähnlichen Größenordnung wählen. Man kann sich da so behelfen:
Generell ist es so, dass dahinter immer ein nichtlineares Optimierungsproblem steht und der Löser ausgehend vom Startwert ein lokales Minimum sucht. Es ist also wichtig, ausreichend gute Startwerte zu haben (was "ausreichend" ist, hängt stark vom Modell ab) oder man muss einen Ansatz für globale Optimierung verwenden, z.B. MultiStart.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
MatlabNewbie2022 |
Themenstarter
Forum-Newbie
|
|
Beiträge: 7
|
|
|
|
Anmeldedatum: 24.10.22
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 25.10.2022, 15:35
Titel:
|
|
Alles klar, sieht top aus und bzgl. globaler Optimierung schaue ich mal. Ich versuche jetzt mal, mein Modell mit mehreren Termen aufzubauen und dann mal abwarten, inwieweit es funktioniert. Vielen Dank für deine Hilfe!
Gruß Seb
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|