ich bin zur Zeit dabei für meine Abschlussarbeit ein Diesel Generator Set eines Kraftwerks nachzubilden. Dafür stehen mir umfassende Messungen des Generators zur Verfügung.
Ich würde gerne die Funktion der Regelstrecke zwischen Drehzahl [Eingang] und Generatorleistung [Ausgang] herausfinden. Von einem Kollegen habe ich den Tip bekommen dieses mit einem RLS - Algorithmus oder einem Kalman - Filter durchzuführen.
Das bekomme ich aber nicht hin.
Hat von euch evtl. jemand eine Idee, wie man die Funktion auf einem anderen Lösungsweg, oder aber sogar mit oben genannten Methoden heraus finden könnte?
hast Du schon mal die Suchfunktion hier im Forum genutzt?
Speziell im Regelungstechnik-Teil wurden solche Fragen schon öfter unter dem Thema "Systemidentifikation" diskutiert.
Wg. Kalmann-Filter:
Was willst Du mit dem Filter machen? Für das Kalmann-Filter brauchst Du ein Modell, es generiert Dir keins.
ich hatte mich schonmal hier im Forum umgeguckt, bin aber nicht fündig geworden. Lag wahrscheinlich auch daran, dass ich nicht genau wusste wo ich gucken muss.
Wie schon erwähnt habe ich mehrere Datensätze der realen Maschine vorliegen. Ich kenne jedoch nicht die Abhängigkeit dieser Werte untereinander und würde diese gerne ermitteln.
Im besten Fall sollte dann die Drehzahl welche vom Generator Block weitergegeben wird als Eingangsgöße für den Filter fungieren und die Leistung als Ausgangsgröße sollte sich den realen Daten annähern.
Ich hoffe das war einigermaßen verständlich.
Christian
mittlerweile bin ich ein bisschen weitergekommen.
Ich habe es geschafft die Strecke mit einem RLS-Filter zu analysieren und anschließend mit den Fehlerkriterien AIC, YIC, R2T und IAE zu bewerten.
Da der RLS Filter jedoch nur lineare Systeme beschreibt und bei meinem System ein nicht lineares System beschrieben werden soll, möchte ich es nun mit einem Extended Kalman Filter versuchen.
Die function file für den EKF habe ich von einem Kollegen bekommen und möchte diese nun auch mit den selben Fehlerkriterien bewerten wie zuvor beim RLS Filter.
Nur leider habe ich das Problem, dass ich nicht weiss, wie genau ich diesen in den ehemals RLS Filter integrieren kann.
Ich hoffe jemand kann mir helfen?
Gruß Christian
Code:
RLS-Filter
%-------------------------------------------------------------------%
Load data of recorded start values (2011-11-17) from Excel file:
[Data,Text]=xlsread('Kraftstoffregler_sortiert.xls');
simt=Data(1:length(Data),1); %Loading time datas from xls file
input=Data(1:length(Data),3); %Loading input datas from xls file (Leistung/Watt)
output=Data(1:length(Data),2); %Loading output datas from xls file (Kraftstoffregler)
%-------------------------------------------------------------------
%Given limit for the highest system order and system delay
max_number_step=5; %Conditions forsystem order, delay
max_order_na=5; %Conditions forsystem order, den. (Nenner)
max_order_nb=5; %Conditions forsystem order, nom. (Zähler)
%-------------------------------------------------------------------
%List:
disp(sprintf('Model order | IAE R2T YIC AIC'))
for k=1:1:max_number_step %Calculating conditions (k= nr. of time steps) for na=1:1:max_order_na %Calculating conditions
for nb=0:1:max_order_nb %Calculating conditions
numberdata=(na+nb+1); %Number of parameters of the modelled system
%-------------------------------------------------------------------
%initial vector conditions:
x=zeros(numberdata,1); %x=0
theta=zeros(numberdata,1); %theta=0
theta_RLS=[]; %empty vector with undefined m x n
%-------------------------------------------------------------------
%initialising covariance matrix:
P=100000*eye(numberdata);
%-------------------------------------------------------------------
%initialsing parameters
y_RLS=zeros(na,1);
y_x=zeros(na,1);
u_RLS=zeros(nb+1,1);
lambda=0.999;
%-------------------------------------------------------------------
for i=1:length(output) if i>k
x(na+1)=input(i-k);
end
yt=output(i); %Output of the original system
%RLS - algorithm for estimating system parameters
P=(P-P*x*((1+x'*P*x)^(-1))*x'*P)/lambda;
theta=theta+P*x*(yt-x'*theta);
theta_RLS=[theta_RLS,theta]; %store latest values of theta
a_RLS=theta(1:na); %stores the a (den.) parameters
b_RLS=theta(na+1:end); %stores the b (nom.) parameters
%Calculate the output of the estimated system model:
yt_RLS=-a_RLS'*y_RLS+b_RLS'*u_RLS;
output_RLS(i)=yt_RLS; %store output signal of the original system
%time shifting of the modelled data:
if i>(k-1)
u_RLS=[input(i-(k-1));u_RLS(1:end-1)];
end
y_RLS=[yt_RLS;y_RLS(1:end-1)];
y_x=[yt;y_x(1:end-1)];
%Update the observation vector:
x=[-y_x(1:end);u_RLS(1:end)];
end
%---------------------------------------------------------------------
%Calling the errorfunction error=errorcheck(output,output_RLS',theta,P);
disp(sprintf('k:%d na:%d nb:%d | %3g %3g %3g %3g',k,na,nb,error(1),error(2),error(3),error(4))) end end end
%Store the output of the system:
store(i,1)=yt;
store(i,2)=ut;
store(i,3)=z(2);
theta=[-z(5) -z(6) z(3) z(4)];
realtheta=[realtheta;theta_orig];
theta_EKF=[theta_EKF;theta];
end
gut, dass Du zwischenzeitlich weiter gekommen bist.
Eine Frage zwischendurch: Was willst Du am Ende erreicht haben?
A) Brauchst Du eine möglichst präzise Beschreibung des Systems für open-loop Untersuchungen mittels Simulation?
B) Brauchst Du am Schluss ein möglichst gutes closed-loop Verhalten?
Abhängig von der Zielsetzung solltest Du Dich eher auf die Abbildung des nichtlinearen Verhaltens (A) oder das Abbilden von linearen Arbeitsbereichen und Auslegen entsprechender linearer Regler (B) konzentrieren.
also im Grunde genommen möchte ich ein open-loop System nachbilden indem ich ein nichtlineares Verhalten beschreibe. (Danke für die Fachausdrücke )
Die Beschreibung des nichtlinearen Verhaltens möchte ich mit den Filtern (RLS, KF, EKF) erzielen, wobei ich weiss, dass eigentlich nur der Extended Kalman Filter zur Identifizierung eines nichtlinearen Systems geeignet ist.
Ich habe jetzt mal das Modell in Form eines Screenshots angfügt, evtl wird es dadurch besser verständlich.
Die Ausgangsgrößen des Generators werden über den Ausgang m ausgegeben und werden am Bus Selector in die benötigten größen aufgesplittet. Die Größe die mich jetzt besonders interessiert ist die Electrical Power welche auf den Function Block geht. Als Ausgangsgröße soll die Stellung des Kraftstoffreglers erzeugt werden, womit ich wiederum die Leistung meines Dieselmotors bestimmen kann.
Mein Ziel ist es nun mit den vorhandenen Messwerten der Generatorleistung und des Kraftstoffreglers des Diesels im Anlaufverhalten, eine Funktion zu erstellen, die das nichtlineare Verhalten beschreibt.
Kann ich das mit dem EKF oder liege ich da total falsch?
Habe auch was von der Matlab System Identification Toolbox gelesen. Das wäre spitze aber dafür benötigt man leider eine Lizenz.
ist schon eine weile her als ich mit einem EKF gearbeitet habe, aber soweit ich das verstanden habe besteht ein KF bzw. EKF aus einem Modell, dass linear (KF) bzw. nichtlinear (EKF) ist, sowie einem Sensormodell.
Banal ausgedrückt wird bei einem KF/EKF der nächste Schritt (t+1) durch das Modell präzidiert und sobald Sensordaten (zum Zeitpunkt t) vorliegen dieser präzidierte Wert mit dem Sensorwert abgeglichen. Je nach dem wie stark das Vertrauen in den Sensor ist, wird das Modell dann nachgezogen.
Meine Frage ist jetzt wie du damit eine Strecke identifizieren willst? Du brauchst doch schon ein Modell, was ja eigentlich dein Ziel ist.
wie ich ja schon oben geschrieben habe ich noch nicht so Erfahrung mit Matlab und mich bis jetzt auch eher weniger für Regeltechnik interessiert. Aber das würde ich jetzt gerne nachholen.
Ich habe es bisher immer so verstanden, dass der KF bzw. der EKF als Werkzeug dazu dienen anhand von 2 Messreihen (Ein- und Ausgangsgröße) die Funktion, bzw. die Abhängigkeit der beiden Reihen als Ausdruck einer Funktion, beschreiben zu können.
Mir war nicht bewusst, dass ich dafür ein Modell benötige. So wurde es mir bisher auch immer von einem Kollegen aus der Firma erzählt.
mein lieber Sportfreund - der Cocktail, der hier zusammengebraut wird, wird nicht schmecken. Lass uns doch nochmal auf die Zutaten und das Rezept schauen.
Um Deine Aufgabe zu lösen - Man nehme...
1. Ein dynamisches Modell --> das hast Du schon (siehe Deine Abbildung)
2. Einen Regler --> Dein function block ist der Regelalgorithmus (sprich: Regler), der für Deine gewünschte elektrische Leistung die notwendige Kraftstoffmenge einstellt.
In Deinem Gesamtmodell beschreibst Du das Signal zwischen fcn und Diesel Engine als den "Kraftstoffregler". Das Signal würde ich als das Stellsignal des Reglers sehen (evtl. Position für einen passenden Aktor, wie Ventil o.ä. - und dieser Aktor fehlt - es sei denn, er ist an anderer Stelle modelliert).
3. Es stellt sich also nicht die Frage nach Systemidentifikation, sondern nach Regler-Design (Struktur und Parameter als Ersatz für Deinen fcn Block)
Zusammengefasst:
Du hast ein nichtlineares System vorliegen und willst es in einem oder mehreren Betriebspunkten (z.B. Anfahren) regeln.
Stelle dafür einen oder mehrere Regler ein (experimentell oder toolgestützt, je nach Budget und Zeit).
Übrigens: zum Zweck der Systemidentifikation (die Du nicht brauchst), wäre die Matlab System Identification Toolbox nur sehr eingeschränkt einsetzbar.
danke für die Antwort, aber irgendwie fluppt es immer noch nicht so ganz. Ich werde mich morgen mit einem Mitarbeiter treffen der sich wohl gut mit dem Programm auskennt und hoffe, dass er mir mit der Modellbildung helfen kann.
Aber auf jeden Fall schon mal vielen Dank für deine zahlreichen Hilfeversuche!
Zuletzt bearbeitet von Sportfreund am 26.02.2013, 15:49, insgesamt einmal bearbeitet
Ich hatte auch schonmal so ein Problem. Dabei sollte ich ein nichtlineares System regeln.
Verwendet hatte ich da, dass schon von dir erwähnte RLS Verfahren.
Du hast zwar recht, dass das Verfahren lediglich zur Bestimmung linearer Systeme geeignet ist. Wenn man nun aber den Algorithmus, der ja zum Glück rekursiv arbeitet, immer wieder (online) durchlaufen lässt und man die Ordnung des Systems abschätzen kann, erhälst du zu jedem Iterrationsschritt deiner digitalen Regelung deine aktuellen Streckenparameter.
Nun brauchst du "nurnoch" einen adaptiven Regler, der diese Streckenparameter als Eingang hat um sich selber einzustellen (bspw.: Zustandsregler)...
Vielleicht hab ich dir ja hiermit noch eine Alternative gegeben...
Den Algorithmus habe ich für jede Iteration durchlaufen lassen und diese werden mir auch im Workspace angezeigt. Außerdem kann ich anhand der unten beschriebenen Funktion auch die Ordnung des Systems identifizieren, sowohl für den Nenner als auch für den Zähler.
Ich habe auch noch die Funktion eingebaut, dass er mir die Koeffizienten direkt mit ausgeben soll, die Ausgabewerte sind aber leider noch fehlerhaft und den Fehler finde ich auch nicht...
Dann werde ich mir jetzt mal deine Idee angucken.
Bräuchte ja jetzt eigentlich, wie du schon schreibst, nur noch den Regler. Mal schauen ob ich diesen auf anhieb finde.
Danke für den neuen Denkanstoß
Bau dir erstmal eine Simulationsumgebung, in der du ein konstantes System hast, welches du versuchst nachzubilden (Generier die selber Ein- & Ausgangsdaten der Übertragungsfunktion )...
Wenn du dann immernoch falsche Werte rausbekommst kannste dich gerne hier nochmal melden, dann stimmt ja was mit dem Algorithmus nicht
Ja das habe ich schon gemacht. Habe am Anfang einen Sprung eingebaut mit dem Step-Block, diese Werte habe ich dann in meine mir bekannte Funktion laufen lassen und habe damit meine Ausgangsdaten generiert.
Im darauf folgenden Schritt habe ich dann meine Input und Output Daten in meinen RLS-Filter eingesetzt um zuerst anhand meiner Fehlerkriterien darauf schliessen zu können welche Ordnung das System hat.
Das funktioniert auch wie schon gesagt, nur mit den richtigen Koeffizienten will es noch nicht klappen.
Der Code zum Filter wie er oben aufgeführt ist, ist immer noch Aktuell.
Das kuriose ist nur wenn ich das System plotte, werden meine berechneten Ausgangsdaten annähernd genau über meine Original Ausgangsdaten gelegt
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.