und Messwerte des realen Systems für den Eingang u(t) und dem dazugehörigen Ausgang y(t). Die Koeffizienten q3, q2, q1, q0, p2, p1 und p0 bilden das folgende nichtlineare Gleichungssystem:
p0 = c*f
p1 = b*c+d*f
p2 = b*d
q0 = c*f/k+c*e*k
q1 = k*e*f+c*b/k+a*c*k+d*f/k+d*e*k
q2 = a*f*k+b*e*k+a*d*k+b*d/k
q3 = b*a*k
Mein Ziel ist es für die Parameter a bis f (jeweils innerhalb einer oberen und unteren Grenze) die Werte zu finden wofür das Ergebniss der DGL mit dem gemessenen Eingang u(t) so nah wie möglich an den gemessen Ausgang y(t) kommt.
ja, du kannst lsqcurvefit verwenden, um q0 bis q3 und p0 bis p2 zu finden. Dazu muss die Funktion unter Verwendung von u die Lösung des Systems zu den Zeitschritten für y, z.B. über ode45, berechnen.
Anschließend kannst du für diese Parameter das Gleichungssystem nach a-f (und k??) auflösen, z.B. mit fsolve.
Das Problem ist jedoch, dass die Koeffizienten q3 bis p0 der gefitteten Kurve keine Lösung des Gleichungssystems ist (habe es im Bildbereich versucht). Ich möchte daher irgendwie versuchen die Parameter a bis f (k kann ich als konstant annehmen) in einem gewissen Bereich so zu variieren, dass der bestmögliche (und nicht der beste) Fit gefunden wird und nicht andersherum. Hoffe ich habe es verständlich ausgedrückt
auch das sollte mit lsqcurvefit gehen: als Parametereingang ein Vektor mit a-f und k, daraus werden dann q0 bis q3 und p0 bis p2 errechnet. Mit diesen wird dann die DGL gelöst, was die errechneten y-Werte liefert. Diese gleicht lsqcurvefit dann mit den Daten ab.
Mit diesen wird dann die DGL gelöst, was die errechneten y-Werte liefert.
Wie kann ich das mit ode45 umsetzen? Ich weiß, dass ich erst die Ordnung der DGL reduzieren muss, weiß aber leider nicht was ich mit der Störfunktion machen soll. Ich finde dazu auch nur Beispiele wo es keine Störfunktion gibt oder zumindest nicht in dieser Form.
was meinst du mit Störfunktion? u?
Das einzige Problem sehe ich darin, dass du auch die Ableitungen brauchst. Diese müssen z.B. über
gradient
angenähert werden. Ansonsten landet das eben in der DGL für y'''.
Da auf diesem Weg einfach nicht weiter komme würde ich es noch im Bildbereich versuchen. Da würde ich ja das Problem mit der DGL nicht mehr haben. Dafür würde ich mit den Koeffizienten die Übertragungsfunktion bilden und in einem Simulink Modell mit dem gemessenen Eingang u(t) den Ausgang y(t) simulieren. Würde ich hier auch mit lsqcurvefit arbeiten können?
evtl. hätte ich noch eine Idee für dich. Wenn ich dich richtig verstehe, hast du Probleme mit dem Handling der Ableitungen der Eingangsgröße u(t)?!?
Zitat:
Ich weiß, dass ich erst die Ordnung der DGL reduzieren muss, weiß aber leider nicht was ich mit der Störfunktion machen soll. Ich finde dazu auch nur Beispiele wo es keine Störfunktion gibt oder zumindest nicht in dieser Form.
In dem Zusammenhang kannst du dir (falls noch nicht geschehen) die Zustandsraumdarstellung oder speziell die Normalformen ansehen, z.B. https://de.wikipedia.org/wiki/Zusta.....ung#Regelungsnormalform_2
Hier siehst du, dass du das Zustandsraummodell direkt anhand deiner Koeffizienten aus der Übertragungsfunktion aufstellen kannst. Somit wäre die Ableitung der Eingangsgröße kein Problem mehr.
Vielen dank für deine Antwort Vega! Diese Umformung war mir nicht bekannt!
Leider weiß ich auch hier nicht wie ich es in Matlab umsetzen kann um an die optimalen Parameter zu kommen.
Was meinst du genau mit diskretisieren? Also es geht nur darum die Parameter anzupassen , implamtieren muss ich das Modell nicht...
Harald ich habe vergessen auf deine Frage einzugehen, weil du sie ja selbst beantwortet hast Ja mit der Störfunktion meine ich den Eingang des Systems u(t).
Mein Prolem ist, dass ich nicht genau weiß wie ich mein Problem in Matlab umsetzen kann (von der Programmierung her). Dabei ist es vollkommen egal wie ich das Problem angehe, ich will nur die optimalen Parameter finden. Ich wollte es erst über die DGL lösen weil ich da eine grobe Vorstellung hatte wie der Code aussehen müsste. Da ich gesehen habe, dass man lsqcurvefit auch für Simulink Modelle verwenden kann dachte ich macht es die Sache einfacher mit der Übertragungsfunkftion zu arbeiten. Leider weiß ich auch hier nicht wie der Code genau aussehen müsste.
Ich hab jetzt einfach mal einen Code geschrieben, der natürlich noch verbessert werden muss. Vielleicht erkennt man hier etwas besser was ich vorhabe:
Die Funktion TF bestimmt anhand der Parameter P die Übertragungsfunktion für das Modell simTF und startet eine Simulation mit dieser Übertragungsfunktion. Der Eingang der Übertragungsfunktion ist u(t) (also u_data und x_data)
Mit Hilfe von lsqcurvefit sollen die Parameter P so variiert werden, dass der Ausgang des Modells y(t) (y bzw. y_sim) so gut wie möglich an den gemessenen Verlauf (y_data) angepasst wird
Code:
P = [0,0,0,0,0,0];
P_0 = [0.2,130,1000,250,0.5,7]; % Startwerte der gesuchten Parameter
P_lb = [0.4,130,20000,50,0.7,4]; % untere Grenzen der gesuchten Parameter
P_ub = [0.5,150,25000,250,0.9,7]; % obere Grenzen der gesuchten Parameter
spricht auf den ersten Blick nichts dagegen. Bekommst du denn sinnvolle Ergebnisse?
Grüße,
Harald
Einstellungen und Berechtigungen
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.