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

Implementation eines Solvers in Simulink

 

ZerSiema
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 24.04.19
Wohnort: Niederrhein, NRW
Version: ab R2018a
     Beitrag Verfasst am: 07.09.2020, 14:17     Titel: Implementation eines Solvers in Simulink
  Antworten mit Zitat      
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

solver_test.slx
 Beschreibung:

Download
 Dateiname:  solver_test.slx
 Dateigröße:  25.75 KB
 Heruntergeladen:  278 mal

_________________

Gruß
Christian
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.09.2020, 14:22     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
ZerSiema
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 24.04.19
Wohnort: Niederrhein, NRW
Version: ab R2018a
     Beitrag Verfasst am: 07.09.2020, 14:43     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.09.2020, 14:53     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
ZerSiema
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 24.04.19
Wohnort: Niederrhein, NRW
Version: ab R2018a
     Beitrag Verfasst am: 08.09.2020, 05:58     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.09.2020, 09:08     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
ZerSiema
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 24.04.19
Wohnort: Niederrhein, NRW
Version: ab R2018a
     Beitrag Verfasst am: 08.09.2020, 09:41     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.09.2020, 09:50     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
ZerSiema
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 24.04.19
Wohnort: Niederrhein, NRW
Version: ab R2018a
     Beitrag Verfasst am: 08.09.2020, 10:17     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.09.2020, 10:35     Titel:
  Antworten mit Zitat      
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
ZerSiema
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 24.04.19
Wohnort: Niederrhein, NRW
Version: ab R2018a
     Beitrag Verfasst am: 08.09.2020, 13:22     Titel:
  Antworten mit Zitat      
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.

solver_test.slx
 Beschreibung:

Download
 Dateiname:  solver_test.slx
 Dateigröße:  22.34 KB
 Heruntergeladen:  241 mal

_________________

Gruß
Christian
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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.