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

Rekursive Funktion erstellen und mit fminsearch lösen

 

Pinguin222
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 23.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2013, 14:22     Titel: Rekursive Funktion erstellen und mit fminsearch lösen
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.01.2013, 21:29     Titel:
  Antworten mit Zitat      
Hallo,

ich würde es so machen:

Code:
function T = Gleichung(k)

T(1) = % Anfangswert
for i = 2:N
T(i) = ... % Abhängigkeit von vorherigem Wert
end


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
Private Nachricht senden Benutzer-Profile anzeigen
 
Pinguin222
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 23.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2013, 09:19     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.01.2013, 10:01     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Pinguin222
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 23.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2013, 10:48     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 24.01.2013, 10:49     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 24.01.2013, 14:23     Titel:
  Antworten mit Zitat      
Eine kleine Hilfestellung:


<br />
T_{n+1} = T_n* (1-e^{-k*t_n}) + T_n = T_n*(2-e^{-k*t_n})
<br />

Das ergibt in expliziter Darstellung


<br />
T_n=T_0*(2-e^{-k*t_n})^n .
<br />

Und als Funktion

Code:

T=@(t,n,k) T0*(2-exp(-k*t))^n
 


Wenn t von n abhängt, kann man noch ein t(n) definieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.01.2013, 16:37     Titel:
  Antworten mit Zitat      
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
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.