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

Parameteridentifikation mit genetic algorithm

 

student_VS
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 02.04.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.04.2018, 13:18     Titel: Parameteridentifikation mit genetic algorithm
  Antworten mit Zitat      
Liebe Community!
Ich bin leider am verzweifeln und hoffe auf eure Unterstützung bei meinem Matlab-Programmcode.
Folgender Sachverhalt: Ich habe ein Gebäude als RC-Modell erstellt, welches in weiterer Folge als Zustandsraummodell (A,B,C,D Matrizen) verwendet wird. Es soll die gemessene Raumtemperatur (Messdaten aus Excel eingelesen) mit der simulierten Raumtemperatur durch das erstellte Modell (Grey Box Modell) verglichen werden. Dies funktioniert soweit auch, jedoch sind die Abweichungen zu groß, da abhängig von den Parameterstartwerten (unterschiedliche R und C) die Funktion in einem "Tal" für die Optimierung
Code:
opt = greyestOptions('SearchMethod', 'fmincon');
hängen bleibt.
Deshalb brauche ich für die Parameteridentifikation der R und C den genetic algorithm.
Wurde auch in mehreren Papers und Forum-Beiträgen verwendet. In einem Forum-Beitrag habe ich gelesen dass dieser in Verbindung als Hybrid Function mit patternsearch verwendet wurde.
Meine bisherige Idee, welche leider nicht funktioniert.
Code:

options = gaoptimset('HybridFcn',{@patternsearch});
object = sum((y_m-y).^2);  % y_m modellbasierte Raumtemperatur, y gemessene Raumtemperatur, Abweichung zwischen gemessener und modellbasierten Temperatur soll gering sein
[x, fval] = ga(object,8, options) % 8 Variablen R und C
 


Ich hoffe auf eure Unterstützung und bin über jede Hilfestellung sehr dankbar!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.04.2018, 18:05     Titel:
  Antworten mit Zitat      
Hallo,

du musst ein Function Handle angeben, also z.B. etwas wie
Code:
object = @(x) sum((y_m(x) -y).^2);


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: 07.04.2018, 12:09     Titel: Reference to non-existent field 'Verbosity'
  Antworten mit Zitat      
Hallo Harald!
Vorab vielen lieben Dank für deine rasche Rückmeldung.

Leider komme ich noch immer nicht weiter.

Ich erhalte jetzt folgende Fehlermeldung "Geschwätzigkeit" ...

Reference to non-existent field 'Verbosity'.

Error in gacommon (line 98
Iterate.x,Aineq,bineq,Aeq,beq,lb,ub,options.TolCon,nvars,type,options.Verbosity);

Error in ga (line 336)
NonconFcn,options,Iterate,type] = gacommon(nvars,fun,Aineq,bineq,Aeq,beq,lb,ub, ...

Error in SysIdentification02 (line 142)
[x, fval] = ga(object,8, options)

Kennst du diese Fehlermeldung?
Freue mich über deine Rückmeldung.
LG Verena
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Reproduktionsschritte wären hilfreich, insbesondere was options angeht.
Hast du die Options denn einfach mal weggelassen? Läuft es dann?

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: 07.04.2018, 21:09     Titel:
  Antworten mit Zitat      
Ich habe mir gerade jede Menge Video Tutorials zu Genetic Algorithm angesehen. Ich vermute, dass ich mein gesamtes idgrey Model inklusive Minimierungsproblem in ein eigenes File (Fitness Function) packen muss um das Problem zu lösen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ohne mir von deinem Problem zu wissen (vorzugsweise deinen momentanen Code), ist das schwierig zu sagen.

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: 08.04.2018, 09:34     Titel:
  Antworten mit Zitat      
Wenn du mir deine Email-Adresse mitteilst, dann könnte ich dir meinen derzeitigen Code inkl. Messdaten senden.
Sofern du so nett wärst und drüber schaust. Du erkennst mit deinem geschulten Blick wahrscheinlich gleich das Problem.
LG Verena
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: 20.04.2018, 19:44     Titel: Matlab Programmcode für Unterstützung bei Fehlersuche
  Antworten mit Zitat      
Liebe Community!

Die Fitness Function habe ich erstellt und auch im main script eingelesen. Jedoch habe ich jetzt eine Fehlermeldung bei meine ga (Genetic Algorithm).
Unten angeführt die Fitness Function und das main script welches die Parameteridentifikation (Optimierung / Findung der Parameter R_re,R_h,R_ea,....)

function msqe = myFitness02(par,y_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];
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

[y,t_out,x] = lsim(sys_ss, data.InputData, t, x0);

msqe = sum((y-y_ref).^2) / length(y);

end


Code:
clear all;
clc;
close all;

% Load Data
filename_data = 'messdaten_22012018_002_short_test.xlsx';
sheet = 'Messwerte';
raw_data=xlsread(filename_data,sheet);
startIndex=1;
datum_raw=raw_data(startIndex:end,1);
time=raw_data(startIndex:end,2);
t_str = datestr(time,'HH:MM:SS');
%t_num = datenum(t_str,'HH:MM:SS');
t_num=cellstr(t_str);
datum_str = datestr(datum_raw,'dd.mm.yy');
datum_num=cellstr(datum_str);
 
T_vl_wp=raw_data(startIndex:end,78); %gemessene Vorlauftemperatur WP im Heizbetrieb
T_rl_wp=raw_data(startIndex:end,90); %gemessene Rücklauftemperatur WP
T_vl_wp_ww=raw_data(startIndex:end,89); %gemessene Vorlauftemperatur WP im Warmwasserbetrieb
T_r=raw_data(startIndex:end,21); %gemessene Raumtemperatur Arbeitszimmer Nordwand
q_wp=raw_data(startIndex:end,51); %gemessene Leistungsaufnahme WP in W
T_a=raw_data(startIndex:end,110); %gemessene Außentemperatur in °C
q_rad_solar=raw_data(startIndex:end,111); %gemessene solare Einstrahlung in W
V_dot_fbh=raw_data(startIndex:end,94); %gemessener Volumenstrom in FBH in m³/h
c_w=1.16; %spez. Wärmekapazität Wasser in Wh/kgK; vereinfachte Praxis-Annahme für Berechnung 1000 kg = 1 m³ Wasser

%% Prepare data
for i=1:length(time)
    if q_wp(i,1) >= 50 && T_vl_wp(i,1) > T_rl_wp(i,1) && V_dot_fbh(i,1) >= 0.1
        q_h(i,1)=V_dot_fbh(i,1) .* c_w * (T_vl_wp(i,1)-T_rl_wp(i,1)) .* 1000; % Heizleistung Wärmepumpe in W    
    else
        q_h(i,1)=0;
    end
end

%% Find optimal parameter

fitfcn = @(msqe) myFitness02(par,y_ref);
nvars = 8;
[optPar, fval] = ga(fitfcn,nvars) %in optPar stehen die Parameter nach der Optimierung

 


Im Anhang auch das Excel-Messdatenfile falls jemand den code ausführen möchte.

Ich erhalte jetzt folgende Fehlermeldungen:

Undefined function or variable 'par'.

Error in SysIdentification02>@(msqe)myFitness02(par,y_ref{:})

Error in createAnonymousFcn>@(x)fcn(x,FcnArgs{:}) (line 11)
fcn_handle = @(x) fcn(x,FcnArgs{:});

Error in makeState (line 47)
firstMemberScore = FitnessFcn(state.Population(initScoreProvided+1,:));

Error in gaunc (line 40)
state = makeState(GenomeLength,FitnessFcn,Iterate,output.problemtype,options);

Error in ga (line 398)
[x,fval,exitFlag,output,population,scores] = gaunc(FitnessFcn,nvars, ...

Error in SysIdentification02 (line 129)
[optPar, fval] = ga(fitfcn,nvars) %in optPar stehen die Parameter nach der Optimierung

Caused by:
Failure in initial user-supplied fitness function evaluation. GA cannot continue.

messdaten_22012018_002_short_test.xls
 Beschreibung:

Download
 Dateiname:  messdaten_22012018_002_short_test.xls
 Dateigröße:  11.79 MB
 Heruntergeladen:  392 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
vega1013
Forum-Century

Forum-Century


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

du hast da noch das eine oder andere Problem mit der Parameterübergabe.

Versuche mal folgendes:

Code:

% fitfcn = @(msqe) myFitness02(par,y_ref);
nvars = 8;
% [optPar, fval] = ga(fitfcn,nvars) %in optPar stehen die Parameter nach der Optimierung
[optPar, fval] = ga(@(par) myFitness02(par,q_h),nvars) %in optPar stehen die Parameter nach der Optimierung
 

Achtung: habe angenommen, dass die Soll- oder Refenzwerte q_h sind?!?

Aber als nächstes kommt der Fehler, dass in der Fitnessfcn lsim die Eingangsdaten nicht kennt...
Welche Daten sollen das sein?

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: 20.04.2018, 21:46     Titel:
  Antworten mit Zitat      
Entschuldige bitte vielmals, habe gerade gesehen, dass ich beim main File vergessen habe einen Teil des Codes mitzukopieren und reinzustellen.
Unten angeführt die Ergänzung:

Code:


%%

y_ref=T_r;
u_ref=[T_a, q_rad_solar, q_h];
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';

%% Find optimal parameter

fitfcn = @(msqe) myFitness02(par,y_ref);
nvars = 8;
LB= [0 0 0 0 0 0 0 0];
UB= [5000 5000 5000 1000 1000 100000 100000 100000];
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

m.E. müsste es so heißen
Code:
fitfcn = @(par) myFitness02(par,y_ref);


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: 20.04.2018, 22:06     Titel:
  Antworten mit Zitat      
Hallo Harald!
Danke für dein Feedback.
Wie kann ich dann jedoch die Fehlerminimierung berücksichtigen?

Code:
msqe = sum((y-y_ref).^2) / length(y);


Es soll der Fehler der modellierten Raumtemperatur zur gemessenen Raumtemperatur so gering als möglich gehalten werden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.04.2018, 22:08     Titel:
  Antworten mit Zitat      
Hallo,

msqe ist das Rückgabeargument deiner Fitnessfunktion und damit das, was minimiert wird.

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: 20.04.2018, 22:20     Titel:
  Antworten mit Zitat      
Okay, schön langsam begreife ich die Fitness Function besser. Herzlichen Dank.

Bekomme trotzdem jetzt folgende Fehlermeldung:

Undefined variable "data" or class "data.InputData".

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

Error in SysIdentification02>@(par)myFitness02(par,y_ref)

Error in createAnonymousFcn>@(x)fcn(x,FcnArgs{:}) (line 11)
fcn_handle = @(x) fcn(x,FcnArgs{:});

Error in makeState (line 47)
firstMemberScore = FitnessFcn(state.Population(initScoreProvided+1,:));

Error in gaunc (line 40)
state = makeState(GenomeLength,FitnessFcn,Iterate,output.problemtype,options);

Error in ga (line 398)
[x,fval,exitFlag,output,population,scores] = gaunc(FitnessFcn,nvars, ...

Error in SysIdentification02 (line 129)
[optPar, fval] = ga(fitfcn,nvars) %in optPar stehen die Parameter nach der Optimierung

Caused by:
Failure in initial user-supplied fitness function evaluation. GA cannot continue.


___________________________

Bin ich richtig in der Annhame, dass ich auch mein u_ref an die fitness function übergeben muss und in meiner myFitness02 das iddata ausführen muss?
Herzlichen Dank vorab für deine wertvolle Unterstützung.
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: 20.04.2018, 22:33     Titel: Fehler: The length of the initial condition X0 must match th
  Antworten mit Zitat      
Hi Leute!

Kann mir diese Fehlermeldung jemand bitte näher erläutern?

Error using DynamicSystem/lsim (line 84)
The length of the initial condition X0 must match the number of states.

Mein u_ref besteht ja aus drei Parametern, das lsim funktioniert aber nur wenn ich als x0 drei Werte definiere.

Code:
x0=[40,20,0];
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.