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

Verwendung lsim in Fitness function - Fehler input data

 

student_VS
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 02.04.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.04.2018, 12:39     Titel: Verwendung lsim in Fitness function - Fehler input data
  Antworten mit Zitat      
Liebe Community!

Habe eine Fitness Function erstellt, in der ich den Befehl lsim verwende.
Versuche gerade die Fitness Function über das command window zum Laufen zu bringen, jedoch leider ohne Erfolg. Mit meiner Parameterübergabe passt was nicht, welche ich als Startwerte verwende.
Erhalte folgenden Fehler:

Error using DynamicSystem/lsim (line 84)
When simulating the response to a specific input signal, the input data U must be a matrix of numeric values with at least two
rows (samples) and without any NaN or Inf.

Error in myFitness02 (line 40)
[y,t_out,x] = lsim(sys_ss, data.InputData, t, x0);

Code:
function mse = myFitness02(par,y_ref,u_ref)

R_re=par(1);
R_h=par(2);
R_ea=par(3);
A_w=par(4);
A_e=par(5);
C_r=par(6);
C_h=par(7);
C_e=par(8);

x0=[40,20,0];
t=1:length(y_ref);


% Dynamikmatrix / Zustandsmatrix A von Modell 2
A = [(-R_re-R_h)/(C_r*R_h*R_re), 1/(R_re*C_r) , 1/(R_h*C_r); ...
    1/(R_re*C_r), (-R_ea-R_re)/(C_e*R_re*R_ea) , 0 ; ...
    1/(R_h*C_h), 0 , -1/(R_h*C_h)];
% Eingangsmatrix B von Modell 2
B = [0, A_w/C_r, 0 ; 1/(R_ea*C_e), A_e/C_e, 0; 0, 0, 1/C_h ];
% Ausgangsmatrix C
C = [1,0,0];
% Durchgangsmatrix D
D = zeros(1,3);

Ts=0; %Sampling time, 0 indicates a continuous-time model

sys_ss=ss(A,B,C,D,Ts); % State Space Modell

data = iddata(y_ref,u_ref,10);
data.TimeUnit='seconds';
% data.InputName = {'Außentemperatur T_a', 'solare Einstrahlung q_rad_sol', 'Heizleistung Waermepumpe q_h'};
% data.InputUnit = {'°C'; 'W'; 'W'};
% data.OutputName = 'Raumtemperatur T_r';
% data.OutputUnit = '°C';

%data.InputData = zeros(length(y_ref),length(t))

[y,t_out,x] = lsim(sys_ss, data.InputData, t, x0);
 
mse = sum((y-y_ref).^2) / length(y)

end
 


Die par, y_ref und u_ref habe ich vor Ausführung der Fitness Function im command window als Zahlenwerte definiert.

par= [1 64 364 22 22 30 108 9]
y_ref = 22
u_ref = [5 200 3000]

habs auch schon mit mehreren Varianten probiert (y_ref als 1x3 Matrix, u_ref als 3x1 bzw. 2x3)

Was mach ich nur falsch bzw. kapier ich nicht? Freue mich über jede Unterstützung.
Vielen Dank im Voraus.
Private Nachricht senden Benutzer-Profile anzeigen


vega1013
Forum-Century

Forum-Century


Beiträge: 162
Anmeldedatum: 26.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.04.2018, 20:19     Titel:
  Antworten mit Zitat      
Hallo,

was soll denn die Eingangvariable für dein state space System sein, u_ref?

Die benötigten Dimensionen leiten sich von den Zustandsmatritzen ab.
Zu beachten ist, dass der Eingangsvektor natürlich so viele Einträge wie der entsprechende Zeitvektor haben muss.

Sonst wenn möglich Beispieldaten zur Verfügung stellen (idealerweise als mat-file)

Gruß
vega
Private Nachricht senden Benutzer-Profile anzeigen
 
student_VS
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 02.04.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.04.2018, 21:55     Titel:
  Antworten mit Zitat      
Hi vega! Danke für dein Interesse. Im state space Modell sind die Matrizen (welche ein Gebäude abbilden) definiert. Diese Parameter R, C, A von den Matrizen sollen in weiterer Folge im Main Script mittels genetic Algorithmus optimiert werden.
Es werden die Parameter R, C, A und y_ref und u_ref übergeben.
Hab im main script excel Werte welche ich als y und u einlese.
U besteht aus drei Variablen (1x3 Matrix), Außentemperatur, solare Einstrahlung und Heizleistung einer Wärmepumpe.
Hoffe dir damit irgendwie weiter geholfen zu haben. Mein main Script kennst du aus meinem alten Forumbeitrag. Kann es sonst morgen nochmal in dieses Forum stellen.
Private Nachricht senden Benutzer-Profile anzeigen
 
vega1013
Forum-Century

Forum-Century


Beiträge: 162
Anmeldedatum: 26.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.04.2018, 11:34     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:

U besteht aus drei Variablen (1x3 Matrix), Außentemperatur, solare Einstrahlung und Heizleistung einer Wärmepumpe.

genau darauf wollte ich hinaus, dass dem nicht so ist. lsim berechnet anhand deines Eingangsvektors (oder Matrix) den zeitlichen Verlauf der Ausgangsgröße. Dafür muss allerdings (in deinem Fall) die Eingangsgröße die Dimension "length(t)x3" haben.

Ansonsten wie gesagt einfach Beispieldaten bereitstellen. Idealerweise als .mat File, da das Excel File bei mir als potentiell unsicher eingestuft wird...

Gruß
vega
Private Nachricht senden Benutzer-Profile anzeigen
 
student_VS
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 02.04.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.04.2018, 17:14     Titel:
  Antworten mit Zitat      
Danke. Das hab ich mir auch schon so gedacht. Aber jetzt nur zwecks dem Verständnis....

Wenn ich NUR meine Fitness Function testen will, ohne jegliches main skript mit Messdaten, etc.
Dann kann ich ja in meinem Command Window die Parameter definieren, den y_ref Wert ( Anzahl 1) und u_ref ( 1x3).
Und anschließend die Fitness Function aufrufen,. Dann müsste das ja trotzdem ausführbar sein, oder nicht?
Private Nachricht senden Benutzer-Profile anzeigen
 
vega1013
Forum-Century

Forum-Century


Beiträge: 162
Anmeldedatum: 26.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.04.2018, 20:10     Titel:
  Antworten mit Zitat      
Hallo,

theoretisch schon, allerdings macht das mit nur einem "Messwert" nicht sehr viel Sinn.
Das besagt auch die Fehlermeldung, die du dann erhalten solltest:

Error using DynamicSystem/lsim (line 85)
When simulating the response to a specific input signal, the input data U must be a matrix of numeric values with at least two rows
(samples) and without any NaN or Inf.

Versuchs mal mit einem Messdatenausschnitt...

Gruß
vega
Private Nachricht senden Benutzer-Profile anzeigen
 
student_VS
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 02.04.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.04.2018, 19:27     Titel:
  Antworten mit Zitat      
Grüß dich vega!
Vielen lieben Dank, dass du mir bei meinem Standpunkt-Wechsel "auf der Leitung stehen" geholfen hast. Smile
Ich habe die fitness function erstellt und im main script über
Code:
fitfcn = @(par) myFitness02(par,y_ref,u_ref);


eingelesen und ich bekomme keine Fehlermeldung. Very Happy
Somit sollte die fitness function ja eigentlich funktionieren.

Weißt du wie ich berechnete Werte (z.B. mse) aus der Fitness function heraus bekomme, sodass sie mir im Workspace angezeigt werden?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.425
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.04.2018, 20:40     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Somit sollte die fitness function ja eigentlich funktionieren.

Das ist ein absoluter Fehlschluss. Du kannst die Fitness Function auch so definieren, und wirst keine unmittelbare Fehlermeldung bekommen.
Code:
f = @(quark) mist(a,b,c);


Wenn eine Funktion nicht funktioniert, dann wird sie auch nicht funktionieren, wenn du sie als Fitness Function verwendest. Dass das Problem in der Implementierung der Fitness Function und genau genommen in deiner Verwendung von lsim liegt, war doch im vorherigen Thread klar, und deswegen hast du ja diesen aufgemacht.

Um Werte innerhalb der Fitness Function zu sehen, kannst du den Debugger verwenden. Es ist aber nicht sinnvoll, die Fitness Function zu debuggen, solange die Funktion für sich genommen nicht funktioniert.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 02.04.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.04.2018, 21:22     Titel:
  Antworten mit Zitat      
Hallo Harald! Danke für deinen Einwand.
Das Problem beim alleinigen Testn meiner Fitness Function war, dass ich für yref nur einen Wert vorgegeben habe und dann damit die Größe von uref nicht übereingestimmt hat.
Lasse gerade die FitFcn in Kombination mit ga

Code:
[optPar, fval] = ga(fitfcn,nvars);


laufen und bekomme Werte für optPar. Somit läuft die Fitness Function, aber wahrscheinlich noch nicht 100% fehlerfrei.
Private Nachricht senden Benutzer-Profile anzeigen
 
vega1013
Forum-Century

Forum-Century


Beiträge: 162
Anmeldedatum: 26.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.04.2018, 22:09     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Vielen lieben Dank, dass du mir bei meinem Standpunkt-Wechsel "auf der Leitung stehen" geholfen hast. Smile

..sehr gerne Smile

Zitat:
Weißt du wie ich berechnete Werte (z.B. mse) aus der Fitness function heraus bekomme, sodass sie mir im Workspace angezeigt werden?


Während der Optimierung kannst du innerhalb der Funktion einfach mse ohne Semikolon eingeben, dann wirst du die zeitliche Entwicklung des Wertes sehen.
Als weitere Idee könnte assignin (-> doc assignin) eine Alternative sein, oder natürlich die unschöne Variante mittels globale Variablen.
Oder über die ga Optionen:
Code:

options = gaoptimset;
options = gaoptimset(options,'Display', 'diagnose')
ga(..., options);
 


Wie Harald bereits schrieb, muss das nicht Auftreten von Fehlern nicht bedeuten dass die Funktion das tut, was sie soll. Aber mit dem Ansatz, die mse zu prüfen und natürlich der anschließende Vergleich der optimierten Funktionswerte mit den Messwerten solltest du einen Eindruck bekommen, ob soweit alles i.O. ist...

Gruß
vega
Private Nachricht senden Benutzer-Profile anzeigen
 
student_VS
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 02.04.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.04.2018, 09:36     Titel:
  Antworten mit Zitat      
Hallo Vega!
Danke für deine Rückmeldung. Ich tu mir sehr schwer die Funktion zu testen. Mit vorgegebenen Parametern im Command Window läuft sie gut, wobei das ja nicht sehr aussagekräfgit ist. Habe diese lsim ja über eine Fitness Function in den ga implementiert. Aber dieser genetic algorithm ist sehr sehr komplex, vorallem gibt es da ja so viele unterschiedliche Optionsmöglichkeiten, welche mich momentan schon zur Verzweiflung bringen. Crying or Very sad

Hast du Erfahrung mit dem genetic algorithm und Tipps für mich, welche Optionsmöglichkeiten für meine Anwendung in Frage kommen?
Habe momentan schon folgende Varianten probiert...

Code:
options = gaoptimset('CrossoverFrac', 0.5, 'PopulationSize', 100,...
          'StallGen',125, 'Generations',150, 'OutputFcns', {fitfcn,@gaplotbestf});

[optPar,fval] = ga(fitfcn,nvars,[],[],[],[],lb, ub, options);


Code:
% hybridopts = optimoptions('fmincon','Display','iter','Algorithm','quasi-newton');

% hybridopts = optimoptions('fminunc','Display','iter','Algorithm','quasi-newton');
hybridopts = optimoptions('fmincon','Display','iter');
options = optimoptions('ga','HybridFcn',{@fmincon,hybridopts});


Code:
options = gaoptimset('HybridFcn',{@fmincon});
[optPar, fval] = ga(fitfcn,nvars,[],[],[],[],lb,ub,[],options);
Private Nachricht senden Benutzer-Profile anzeigen
 
vega1013
Forum-Century

Forum-Century


Beiträge: 162
Anmeldedatum: 26.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2018, 21:30     Titel:
  Antworten mit Zitat      
Hallo,

habe nur mal in ga "reingeschnuppert" und mich demnach nicht sonderlich mit den Optionen auseinander gesetzt. Bisher bin ich immer mit multistart ganz gut gefahren und habe zufriedenstellende Ergebnisse erhalten. Zu den ga Optionen kann aber vermutlich Harald noch Input geben.

Wie sieht denn das Ergebnis der Optimierung - also ein Vergleich deiner Messwerte mit einer Simulation mit den optimierten Parametern - aus?

Evtl. noch ein Tipp dazu: Wenn du deine FitnessFcn umschreibst, dass du in dieser eine Funktion aufrufst, die dann das Modell erstellt, die Simulation ausführt und den Ergebnisvektor zurückgibt, kannst du diese Funktion auch nach der Optimierung für einen Vergleich bequem ausführen.

Gruß
vega
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.