|
|
Rekursive Funktion erstellen und mit fminsearch lösen |
|
Pinguin222 |
Forum-Newbie
|
|
Beiträge: 3
|
|
|
|
Anmeldedatum: 23.01.13
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 23.01.2013, 14:22
Titel: Rekursive Funktion erstellen und mit fminsearch lösen
|
|
|
|
|
Hallo ihr Lieben,
ich bitte um Hilfe von Matlabexperten.
Mein Problem ist folgendes.
Ich habe Messkurven für Temperaturerwärmungen im Motor.
Die Messkurve liegt in Form von diskreten Punkten vor,
d.h. tmess(i),Tmess(i);
Ich möchte diese Messkurve mit einer rekursiven Erwärmungsfunktion nachbilden:
T0 = (TEnd TStart ) * (1-e^-kt0) + TStart;
T1 = T0 * (1-e^-kt1) + T0;
T2 = T1* (1-e^-kt2) + T1
usw.
Konstanten z.B.: TStart = 20 und TEnd = 120;
Mein Problem ist nun, dass ich es nicht verstehe, wie man in Matlab eine rekursive Funktion definiert, die man dann verwenden kann und in einer Minimumsuche mit z.B. fminsearch() den Parameter k bestmöglich zu bestimmen.
Meine Idee war die Funktion in einem Array zu definieren. Allerdings habe ich es nicht geschafft, dass Matlab z.B. in T1 auch die Gleichung für T0 einsetzt.
Am Ende müsste ich ein Gütemaß aufstellen, der Form:
J = ∑_(i=0)^200〖Tmess(i)-T(i)〗, wobei k immer noch unbekannter Parameter ist, der dann mit fminsearch bestimmt werden kann.
Ich hoffe mal mein Problem ist verständlich
Habt ihr eine Lösung??
Vielen Dank schon im Vorraus
PS: Klar könnte man das für eine Kurve auch per Hand durch Probieren rausbekommen. Habe aber viele Kurven und möchte evetuell auch weiterführend über Kurvenkombinationen optimieren.
Gruß
Michael
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 23.01.2013, 21:29
Titel:
|
|
Hallo,
ich würde es so machen:
Du hast es ja im Grunde schon dastehen und musst nur noch T0 durch T(1), T1 durch T(2) etc. ersetzen, da in MATLAB die Indizierung bei 1 beginnt.
Zur Optimierung würde ich dann lsqnonlin verwenden.
Grüße,
Harald
|
|
|
Pinguin222 |
Themenstarter
Forum-Newbie
|
|
Beiträge: 3
|
|
|
|
Anmeldedatum: 23.01.13
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.01.2013, 09:19
Titel:
|
|
|
|
|
Hallo Harald,
danke für dein Feedback.
Soweit ist das klar. Auch mit dem Index.
Nur genau diese Syntax/Logik, wie man das aufstellt ist mir nicht klar.
Da ich ein unbekannten Parameter habe, muss ich mit math. Funktionen in Matlab arbeiten, d.h. mit inline oder @(..).
Beispiel:
Funktionen muss man generell in einem Array definieren:
z.B.
T{1} = @(k) exp(-k)
-> wenn ich jetzt T{1}(2) eintippe-> rechnet Matlab die Formel für k = 2 und spuckt mir das richtige Ergebnis aus
T{2} = @(k) exp(-k) + T{1}
-> wenn ich jetzt T{2}(2) fordere kommt der Fehler:
"??? Undefined function or method 'plus' for input arguments of type 'function_handle'.
Error in ==> @(k)exp(-k)+T{1}"
Matlab versteht es nicht für T{2} auch T{1} "als Formel" zu verwenden und für k = 2 einzusetzen.
Würde man folgendes eintippen funktioniert die Rechnung:
a=2;
T{2} = @(k) exp(-k) + a;
in diesem Fall ermittelt Matlab wieder das richtige Ergebnis.
Wie macht man das richtig?
Wie kann man Matlab beibringen das T{0} ebenfalls eine Funktion ist die er einsetzten soll und den Parameter k mit 2 belegen soll?
Danke im Voraus
Michael
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 24.01.2013, 10:01
Titel:
|
|
Hallo Pinguin222,
Es ist grundlegend bei der Programmierung, dass man Werte und Funktionen auseinanderhält, oder mit anderen Worten Formeln und Zahlen.
Du möchtest hier einen Zahlenwert für k numerisch bestimmen. Dann erstellst Du am besten eine Funktion, die von k als Input-Argument abhängt, sowie von den fixen Parametern TStart und TEnd, und den Wert für T zurückgibt. Siehe Harald's Vorschlag.
Gruß, Jan
|
|
|
Pinguin222 |
Themenstarter
Forum-Newbie
|
|
Beiträge: 3
|
|
|
|
Anmeldedatum: 23.01.13
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.01.2013, 10:48
Titel:
|
|
Hallo Jan,
gibt es also keine Möglichkeit Funktionen mit gleichem Parameter zu addieren??
Für mein Problem müsste ich das meiner Meinung nach aber machen können, da ich k über alle Messpunkte optimieren/bestimmen will und daher nicht die 1. Rekursion ausrechnen kann und in die 2. einsetzten kann.
Nochmal die Idee rein mathematisch wäre für 3 Zeitschritte:
t=0; T(1) = 20
t=1; T(2) = (120-20)*(1-e^-k*1) + 20
t=2; T(3) = (120-T(2)) *(1-e^k*2) + T(2)
k optimal:
J = Tmess(1) - 20 + (Tmess(2) - (120-20)(1-e^-k) +20) + (Tmess(3) - (120-[(120-20)*(1-e^-k) +20] ) * (1-e^k*2) + [(120-20)*(1-e^-k)+20]
k müsste jetzt mit Hilfe eines Least Squares Schätzer optimal bestimmt werden, d.h. für Min(J).
Haralds Vorschlag würde da meiner Meinung nach nicht funktionieren, da Matlab die Funktionen nicht addieren lässt.
Vielleicht kann man das mit meinem Ansatz auch garnicht mit Matlab lösen!!
Gruß
Michael
|
|
|
MaFam |
Forum-Meister
|
|
Beiträge: 799
|
|
|
|
Anmeldedatum: 02.05.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 24.01.2013, 10:49
Titel:
|
|
Hallo,
diese simple Rekursion lässt sich explizit darstellen (Exponentialfunktion). Die Optimierung läuft nach Differentiation auf ein lineares Gleichungssystem hinaus. Bis zum Lösen deselbigen kann man alles ohne Numerik analytisch angehen.
Grüße, Marc
|
|
|
MaFam |
Forum-Meister
|
|
Beiträge: 799
|
|
|
|
Anmeldedatum: 02.05.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 24.01.2013, 14:23
Titel:
|
|
Eine kleine Hilfestellung:
Das ergibt in expliziter Darstellung
Und als Funktion
Wenn t von n abhängt, kann man noch ein t(n) definieren.
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 24.01.2013, 16:37
Titel:
|
|
|
|
|
Hallo Pinguin222,
Zitat: |
gibt es also keine Möglichkeit Funktionen mit gleichem Parameter zu addieren?? |
Nein, man kann Funktionen schlechthin nicht so ohne weiteres addieren. Was wäre denn z.B. "sin + 1" oder "tan + sin"? Stattdessen möchtest Du die Werte addieren, also "sin(1) + cos(1)".
Zitat: |
Da ich ein unbekannten Parameter habe, muss ich mit math. Funktionen in Matlab arbeiten, d.h. mit inline oder @(..).
Beispiel: Funktionen muss man generell in einem Array definieren: ... |
Diesen beiden Behauptungen würde ich widersprechen.
Zitat: |
Haralds Vorschlag würde da meiner Meinung nach nicht funktionieren, da Matlab die Funktionen nicht addieren lässt. |
Die Addition von Funktionen ist wie bereits geschildert hier auch gar nicht hilfreich oder sinnvoll. Harald hat einen einfachen und leicht zu implementierenden Vorschlag gemacht. Probiere das doch einfach mal aus und verlasse Dich auch seine profunden Erfahrungen und Kenntnisse bzgl. der effizienten Lösung mathematischer Probleme in Matlab.
Das Problem ist offenbar deutlich einfacher zu lösen als Du vermutest.
Gruß, Jan
|
|
|
|
|
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.
|
|