Verfasst am: 02.04.2018, 13:18
Titel: Parameteridentifikation mit genetic algorithm
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
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 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.
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
Verfasst am: 20.04.2018, 19:44
Titel: Matlab Programmcode für Unterstützung bei Fehlersuche
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,....)
% 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
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
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
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:
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.
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
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.