|
|
Implementation eines Solvers in Simulink |
|
ZerSiema |
Forum-Newbie
|
|
Beiträge: 9
|
|
|
|
Anmeldedatum: 24.04.19
|
|
|
|
Wohnort: Niederrhein, NRW
|
|
|
|
Version: ab R2018a
|
|
|
|
|
|
Verfasst am: 07.09.2020, 14:17
Titel: Implementation eines Solvers in Simulink
|
|
|
|
|
Hallo zusammen,
ich habe folgendes Problem, bei dem ich selbst nicht mehr weiter komme:
Ich habe ein Modell mit den Eingängen m_air_in und p2 und dem Ausgang p1.
In diesem Modell wird aus den Eingängen m_air_in und p2 der Ausgang p1 ermittelt. Ich benötige nun etwas wie einen Solver, welcher dem Modell vorgeschaltet folgendes tut:
Zu jedem Simulationszeitschritt muss der Wert für m_air_in so angepasst werden, sodass (p1_soll - p1)^2 möglichst minimal wird. p1_soll ist dabei ein Konstante aus dem Workspace und p1 wird in dem Modell bestimmt. Dazu habe ich schon die Funktion fmincon gefunden.
Jedoch habe ich dabei das Problem, dass meine Funktion, welche fmincom versucht zu minimieren, kein m_air_in enthält (nur (p1_soll-p1)^2).
Für ein besseres Verständnis des Problems habe ich ein Beispielmodell diesem Post beigefügt.
In Simscape gibt es wohl möglich einen Block der genau dies tut (Blockbezeichnung: "f(x) = 0"). Gibt es eine Möglichkeit diese Funktionalität in Simulink zu realisieren, wenn möglich ohne zusätzliche Toolboxen?
Falls ich das Problem nicht genau erläutert habe, ergänze ich dies auf Wunsch!
Für eure hilfreichen Antworten danke ich schon im voraus!
Grüße
Christian
Beschreibung: |
|
Download |
Dateiname: |
solver_test.slx |
Dateigröße: |
25.75 KB |
Heruntergeladen: |
278 mal |
_________________
Gruß
Christian
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 07.09.2020, 14:22
Titel:
|
|
Hallo,
wenn ich das richtig verstehe: du kannst fminsearch aus einer MATLAB-Function heraus aufrufen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
ZerSiema |
Themenstarter
Forum-Newbie
|
|
Beiträge: 9
|
|
|
|
Anmeldedatum: 24.04.19
|
|
|
|
Wohnort: Niederrhein, NRW
|
|
|
|
Version: ab R2018a
|
|
|
|
|
|
Verfasst am: 07.09.2020, 14:43
Titel:
|
|
Danke für die schnell Rückmeldung!
Ich glaube bei der Funktion habe ich das selbe Problem, wie bei fmincon. Ich benötige schließlich für den Aufruf eine Funktion wie z.B.: p1 = p2/((m_air_in/K1)^2)
Damit könnte ich ein minimales m_air_in bestimmen, richtig?
Das Problem liegt darin, dass diese Funktion in einem Submodell implementiert ist und dieser Solver in einem Block davor aufgerufen werden soll, da diese Formel nur vorübergehen verwendet wird und im echten Modell dort mehrere LUTs mitspielen. Der Solver weiß somit nichts von dieser Funktion, sondern kann nur die differenz zwischen p1 und p1_soll ermitteln und soll diese möglichst minimal halten.
Gruß
Christian
_________________
Gruß
Christian
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 07.09.2020, 14:53
Titel:
|
|
Hallo,
dazu bräuchtest du wohl eine Rückführung, damit für ein m_air_in wieder ein p1 berechnet werden kann und müsstest den "Solver" selbst programmieren.
Wenn es ohnehin nur eine vorübergehende Lösung sein soll, dann kann es einfacher sein, den Algorithmus zur Bestimmung von p1 aus m_air_in entweder in einem separaten Modell abzuspeichern oder in MATLAB zu implementieren und das dann als Zielfunktion für fminsearch oder fmincon zu verwenden.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
ZerSiema |
Themenstarter
Forum-Newbie
|
|
Beiträge: 9
|
|
|
|
Anmeldedatum: 24.04.19
|
|
|
|
Wohnort: Niederrhein, NRW
|
|
|
|
Version: ab R2018a
|
|
|
|
|
|
Verfasst am: 08.09.2020, 05:58
Titel:
|
|
|
|
|
Guten Morgen,
in dem Beispielmodell ist bereits der Algorithmus zur Bestimmung von p1 aus m_air_in in einem Submodell enthalten. Der Solver befindet sich dort auch in einem Submodell, welches direkt vorgeschaltet ist.
Ich bin mit der Benutzung von fmincon oder fminsearch noch nicht sehr vertraut und es tut mir leid wenn ich mein Problem nicht gut erläutern kann. Ich hatte es mir so vorgestellt, dass in dem Solver-Submodell ein MATLAB-Funktionsaufruf stattfindet, in dem wiederum fmincon oder fminsearch verwendet wird. Nur habe ich wie beschrieben das Problem, dass der Solver die Formel zur Berechnung von p1 nicht kennen soll und praktisch iterativ durch "durchprobieren" ein passendes m_air_in ermitteln soll, sodass sich p1 damit auf eine Vorgabe einstellt.
Solver soll ein Parameter p1_soll erhalten, sowie p1 aus dem Submodell und soll die Funktion (p1_soll-p1)^2 minimieren.
Ich habe ebenfalls gestern den Block "Algebraic Constraint" entdeckt, bei dem ich vermute die gewünscht Funktionalität zu bieten. Ich habe jedoch bisher noch keine Beispiele zum Verstehen gefunden...
_________________
Gruß
Christian
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 08.09.2020, 09:08
Titel:
|
|
Hallo,
Zitat: |
Nur habe ich wie beschrieben das Problem, dass der Solver die Formel zur Berechnung von p1 nicht kennen soll und praktisch iterativ durch "durchprobieren" ein passendes m_air_in ermitteln soll |
Das widerspricht sich meines Erachtens. Woher soll denn der Solver wissen, welches m_air_in "gut" ist, wenn man nicht verwenden darf, wie p1 aus m_air_in bestimmt wird?
Zitat: |
Ich habe jedoch bisher noch keine Beispiele zum Verstehen gefunden...
|
In der Hilfe des Blocks werden zwei Beispielmodelle referenziert.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
ZerSiema |
Themenstarter
Forum-Newbie
|
|
Beiträge: 9
|
|
|
|
Anmeldedatum: 24.04.19
|
|
|
|
Wohnort: Niederrhein, NRW
|
|
|
|
Version: ab R2018a
|
|
|
|
|
|
Verfasst am: 08.09.2020, 09:41
Titel:
|
|
Hallo,
Es war so gedacht, dass der Solver durch die Differenz (p1_soll-p1)^2 herausfindet, ob das m_air_in passend ist. Jedoch verstehe ich die Problematik, dass der Solver auf diese Weise keine sofortige Rückmeldung des p1 für ein m_air_in erhält, da dafür ein neuer Simulationszeitschritt berechnet werden muss.
Ich werde nun erstmal versuchen den Algebraic Constraint Block zu verstehen. Aus den zwei Beispielmodellen werde ich nicht schlau, wie ich dies auf meine Anwendung anpassen muss.
Trotzdem vielen Dank für die Hilfe!
_________________
Gruß
Christian
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 08.09.2020, 09:50
Titel:
|
|
Hallo,
Zitat: |
Jedoch verstehe ich die Problematik, dass der Solver auf diese Weise keine sofortige Rückmeldung des p1 für ein m_air_in erhält, da dafür ein neuer Simulationszeitschritt berechnet werden muss. |
Daher mein Vorschlag, diesen Teil als MATLAB-Code zu implementieren.
Was da implementiert ist, lässt sich vielleicht sogar von Hand auflösen?
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
ZerSiema |
Themenstarter
Forum-Newbie
|
|
Beiträge: 9
|
|
|
|
Anmeldedatum: 24.04.19
|
|
|
|
Wohnort: Niederrhein, NRW
|
|
|
|
Version: ab R2018a
|
|
|
|
|
|
Verfasst am: 08.09.2020, 10:17
Titel:
|
|
Hallo,
wie ich oben erwähnt habe ist diese Formel für p1 nur vorübergehend zum Testen des Solvers. Hinterher wird p1 nicht aus einer Formel berechnet, sondern setzt sich aus mehreren LUTs zusammen. Daher ist es nicht möglich, die Formel in ein MATLAB-Code zu implementieren.
Einfach gesagt: Der Solver soll nur durch den Abgleich mit der Vorgabe p1_soll das m_air_in so anpassen, dass die Differenz (p1_soll-p1)^2 minimal wird.
_________________
Gruß
Christian
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 08.09.2020, 10:35
Titel:
|
|
Hallo,
Zitat: |
Daher ist es nicht möglich, die Formel in ein MATLAB-Code zu implementieren. |
Warum denn nicht, wenn du den Teil des Modells später sowieso durch was anderes ersetzt?
Zitat: |
Der Solver soll nur durch den Abgleich mit der Vorgabe p1_soll das m_air_in so anpassen, dass die Differenz (p1_soll-p1)^2 minimal wird. |
Und dazu muss man die Information verwenden, wie der Zusammenhang ist. Dazu kann man, wie du ja selbst festgestellt hast, nicht in einen anderen Modellteil springen.
Sorry, aber ich weiß nicht, wie ich dir hier weiterhelfen kann.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
|
|
|
ZerSiema |
Themenstarter
Forum-Newbie
|
|
Beiträge: 9
|
|
|
|
Anmeldedatum: 24.04.19
|
|
|
|
Wohnort: Niederrhein, NRW
|
|
|
|
Version: ab R2018a
|
|
|
|
|
|
Verfasst am: 08.09.2020, 13:22
Titel:
|
|
Es macht ja keinen Sinn diese Formel fest zu implementieren, wenn diese nicht korrekt ist (nur zum Testen) und später durch LUTs ersetzt wird. Die LUTs werden sich schließlich auch nur in diesem Submodell befinden, wodurch ein p1 bestimmt wird und dieses dann an den Solver-Block übergeben wird.
Ich habe mir nun etwas zusammengebaut, welches dieses Problem löst. Ich habe das Modell dazu diesem Beitrag beigefügt. Ich habe dort den Algebraic Constraint Block verwendet. Das einzige Problem, welches ich jetzt noch lösen muss, ist das Auftreten von Algebraischen Schleifen in manchen (noch nicht klar welche) Fällen.
Beschreibung: |
|
Download |
Dateiname: |
solver_test.slx |
Dateigröße: |
22.34 KB |
Heruntergeladen: |
241 mal |
_________________
Gruß
Christian
|
|
|
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|