ich befinde mich zur Zeit in einer schweren Situation..
Ich habe ein Projekt bekommen, indem ich eine Pumpenanlage Optimieren soll, das bedeutet ich habe Messwerte bekommen mit Durchfluss und Energieverbrauch. Damit soll ich jetzt simulieren und optimieren, welcher Energieverbrauch das optimum wäre.
Ich soll dies mit MatLab machen, aber ich bin total der Neuling hier.
Somit hatte ich mit folgende Teilschritte ausgedacht:
- Eine Art Anlagenkennlinie aus den Messwerte erstellen -> durch interpolierung verschiedener Messpunkte (soweit geschafft mit polyfit und polyval)
- Frage wie bekomme ich jetzt daraus eine richtige mathematische funktion ausgelesen heißt f(x)= .... polynom 2-3 Ord. ???
Oder kann ich das polyfit und polyval in Simulink so einbinden, falls ja, wäre ich dank bar wie.
- Wie erstelle ich eine Mehrdimensionale Matrix, brauche noch den Wirkungsgrad und die Drehzahl der Pumpen rein?
- Wie binde ich das in Simulink ein, heißt mit Differentialgleichungen oder LookUp Tables. ?
- Wie rechnet mit MatLab den Optimalen Energieverbrauch aus. ggf. mit Plots welche und wieviele Pumpen mit welcher Drehzahl fahren müssen. (es gibt Pumpen mit FU und Direktstarter, ggf. Objekte erstellen oder verschiedene Funktionen auslesen)
Ich wäre sehr dankbar wenn ich hier im Forum hilfe finde!
Liebe Grüße
ehermann
Verschoben: 04.01.2016, 20:57 Uhr von Jan S Von Programmierung nach Simulink
Hallo - die Empfehlungen hängen vom Vorwissen ab. Keine MATLAB Kenntnisse ist ja die eine Sache, aber wie steht es mit anderen Programmiersprache, programmieren im Allgemeinen oder Modellbildungen?
Wie offen ist den die Kommunikation im Unternehmen? "Ich habe ein Projekt bekommen" hört sich direktiv an. Ist es realistisch eine Schulung finanziert zu bekommen?
naja wie soll ich sagen. Das ist eine Projekt wärend des Studiums, was auch eine Schulung daher schwer macht. Was das grundsätzliche Programmieren angeht bin ich eigentlich relativ fit. Was Modellbildung angeht grenzwertig. Habe mir viele Videos was Modellbildung angeht angesehen.
Bin auch mitlerweile etwas weiter:
- Anlagenkennlinie durch Wertetabelle interpolieren (check)
oder Anlagenkennlinie aus einem gegebenem Polynom verwenden (check)
- Bin zur Einsicht gekommen das ich weder Wirkungsgrad noch Drehzahl in der Matrix brauche, da ich die Anlagenkennlinie habe und dort sich alles ergibt, aka durch die Fördermenge egibt sich die Drehzahl und durch die Fördermenge und dem Energieverbrauch ergibt sich der Wirkungsgrad (indirket)
- Versuche es zur Zeit mit fmincon, habe dafür Gleichungen in Matrizen und Vektoren umgeschrieben und veruscht das Problem Mathematisch darzustellen.
Ich bekomme auch ein richtiges ergebnis.
Mein Problem derzeit ist:
- Das er immer beide Pumpen nimmt. Heißt: wenn ich 3000 m³/h eingebe wählt er immer 1500 m³/h auf beiden Pumpen anstatt eine Pumpe zu nehmen und die direkt mit 3000 m³/h zu fahren und die zweite aus machen, was einene kleineren Energiebedraf aufweisen würde.
Mit dem Problem der Modellieren befasse ich mich nachdem ich die Theoretischen Ergebnise im Matlab habe. Weitere Aufgaben sind auch später eine "Steuerung" und eine "Regelung" (Fuzzy) zu vergleichen und in einem Plott darzustellen. Aber Schritt für Schritt
Wäre sehr Erfreut wenn mir jemand bei meinem derzeitigem Problem Tipps geben könnte.
Danke für die Antwort.
Ich kann auch ggf. mal meine Gleichungen hier rein schreiben. Eventuell befinde ich mich auch im flaschen Frorumsbereich der Beitrag wurde hierher verschoben
Das hilft! Also ist es ein Hochschulprojekt, was eben in einem gewissen Mass auch damit leben muss, dass etwas langsam und nicht efffizient abläuft, weil das Lernen eben Teil der Angelegenheit ist. Ein Hochschulbetreuer geht da auch sehr unterschiedlich vor. "Find's selber raus" kann es da schon mal als Antwort geben
Was hier im Forum eher selten funktioniert ist eine Projektberatung, aber eben kleinteillige Programmierfragestellungen (oder mathematisch) schon. Konkret zu dem "er nimmt immer beide Pumpen" hilft die Gleichungen und / oder den Code einzustellen. Das hilft auch Fachfremden zu helfen.
Naja wenn man einen richtigen Betreuer hätte, wäre es auch eventuell etwas leichter.. xD
Ich habe mal die "Kennlinie" als polynom.m und meine funktion die minimiert werden soll funktion.m angehangen, vielleicht habe ich auch die zu minimierende funktion falsch definiert :S Bitte um rat..
Ein gedanke war mir aber eben noch gekommen, ich versuche es die ganze zeit mit fmincon was ja eine funktion als eingabe haben will, macht es eventuell möglich das polynom mit einer matrix darzustellen um dann ggf. andere minimierungs solver zu benutzen? oder macht das keinen Unterschied?
mal meine NB ausgeschieben um das Prog. leichter zu verstehen:
lb: 0 Min Fördermenge der P1
0 Min Fördermenge der P2
1200 Min Gesammtfördermenge
ub:2500 Max Fördermenge P1
2500 Max Fördermenge p2
9000 Max Gesammt fördermenge (später sollen bis zu 6 Pumpen parallel laufen)
f->min Eges = E1 + E2;
Falls noch fragen sind werde ich diese natürlich beantworten!
Danke schon mal für das Interesse meines Problems
Edit////
Ich habe das jetzt mal mit einem anderem polynom probiert, welches durch 0,0 geht und da funktioniert es besser. Problem ist, dass er jedes mal beide Funktionen E1,E2 benutzt, wie kann ich es machen das er ggf. die zweite Funktion ausblendet oder nicht benutzt, ist dies irgendwie möglich?
und wie werden die beiden .m-Dateien aufgerufen?
Einen fmincon-Aufruf kann ich da z.B. nicht entdecken.
Ich vermute, dass 457.5641 die Energie ist, die eine Pumpe benötigt, sobald sie eingeschaltet wird. Dass die Pumpe aber keine Energie benötigt, wenn sie ausgeschaltet ist ( x(i) = 0 ), hast du nicht berücksichtigt.
Da dies eine Unstetigkeit ist, kann fmincon nur das Problem lösen, wie die Last über die Pumpen verteilt werden soll, aber nicht, welche Pumpen eingeschaltet werden sollen.
Fragen:
Unterscheiden sich die Pumpen?
Falls nein, könnte in einer for-Schleife getestet werden, wieviele Pumpen optimalerweise eingeschaltet werden sollen.
Falls ja, bis zu wieviele Pumpen können es werden? Anders gefragt, wäre es eine Möglichkeit, sämtliche An-/Aus-Kombinationen durchzutesten?
Genau zu dieser Vermutung bin ich auch gekommen, daher hatte ich ein polynom getestet, welches durch 0,0 geht. Da hat es schon viel besser funktioniert.
Ich habe die fmincon Funktion erstmal immer im command Window aufgerufen:
[variablen, fval]=fmincon(@funktion,[0 0 0],[],[],Aeq,beq,lb,ub) eventuell lb und ub vertauschen weiß es nicht mehr aus dem Kopf.
Ich denke die ersten Fragen bezüglich den Pumpen spielt erstmal Ansicht keine Rolle, da oh für jede Pumpe ein eigenes polynom zuordnen kann(falls sie anders arbeiten)
Zu deiner letzten Frage, das ist auch meine Frage haha 😃😃
Wie könnte ich schlau noch zwei Variablen einbinden (x(5),x(6)) um genau dies mit dem ein/aus der Pumpen dem Solver zur Verfügung zu stellen? diese Variablen dürfen so gesehen nur 1 oder 0 ermöglichen, da der solver sonst einfach mit nem Faktor von 0.1-0.9 verwenden kann und es gibt keine halben Pumpen hehe
Genau zu dieser Vermutung bin ich auch gekommen, daher hatte ich ein polynom getestet, welches durch 0,0 geht. Da hat es schon viel besser funktioniert.
Ah, das hast du damit gemeint. Hilft ja aber nichts, wenn die Realität anders aussieht.
Zitat:
Ich habe die fmincon Funktion erstmal immer im command Window aufgerufen:
[variablen, fval]=fmincon(@funktion,[0 0 0],[],[],Aeq,beq,lb,ub) eventuell lb und ub vertauschen weiß es nicht mehr aus dem Kopf.
Und was ist dabei Aeq und beq? Das sieht im früheren Post recht unübersichtlich aus.
Zitat:
Ich denke die ersten Fragen bezüglich den Pumpen spielt erstmal Ansicht keine Rolle, da oh für jede Pumpe ein eigenes polynom zuordnen kann(falls sie anders arbeiten)
Doch, das spielt eine Rolle: wenn die Pumpen gleich sind, brauchst du nur die Anzahl der einzuschaltenden Pumpen testen - wenn nicht, dann auch welche Pumpen gleich sind.
Zitat:
Zu deiner letzten Frage, das ist auch meine Frage haha
Solltest du für die weitere Vorgehensweise herausfinden.
Zitat:
Wie könnte ich schlau noch zwei Variablen einbinden (x(5),x(6)) um genau dies mit dem ein/aus der Pumpen dem Solver zur Verfügung zu stellen?
Das versuchte ich ja zu sagen: in fmincon gar nicht, denn fmincon ist ein Gradientenverfahren, das die Variablen kontinuierlich variiert. Deswegen auch der Vorschlag der Schleife bzw. des Durchprobierens. Mit fmincon kannst du nur optimieren unter der Vorgabe, welche Pumpen an- und ausgeschaltet sind.
Ich hatte ein anderes polynom nur getestet, um näher dahinter zu kommen was noch nicht stimmt 😃
Problem ist:
Der solver sollte mir eigentlich selber errechnen ob es mehr Sinn macht, eine Pumpe z.b. Mit 3000 m^3/h zu fahren oder zwei Pumpen mit je 1500 oder gar drei Pumpen mit je 1000....
Daher kommt ja mein Problem. Ich will ungern dem solver schon vorsagen mit wieviele. Pumpen er rechnen soll ...
Kann man eine Art binäre Variable einbinden? Oder eine Variable die zwar ihren Wert verändert, der solver aber dann nochmal gezwungen wird mit mit einer Art gerundeten Variable (0 oder 1) das nochmal durchrechnen?
Ich hatte den Befehl : Logic(value)
Gefunden. Ich werde damit morgen mal paar Sachen testen.
EDIT:
ah das mit der Schleife,
Kann ich die dann einfach z.b. drei mal machen heißt zuerst Test er es mit einer dann zwei dann drei Pumpen und dann gibt vergleicht er die drei werte und gibt den kleinsten raus? Meinst du das so? Falls ja wie ungefähr sollte das dann aussehen?
Der solver sollte mir eigentlich selber errechnen...
Kann er aber nunmal nicht, s.u.
Zitat:
Ich will ungern dem solver schon vorsagen mit wieviele. Pumpen er rechnen soll ...
Wieviele Pumpen mit welchen Spezifikationen zur Verfügung stehen ist aber schon gegeben? Im übrigen s.u.
Zitat:
Kann man eine Art binäre Variable einbinden? Oder eine Variable die zwar ihren Wert verändert, der solver aber dann nochmal gezwungen wird mit mit einer Art gerundeten Variable (0 oder 1) das nochmal durchrechnen?
Ist nicht sinnvoll, deswegen meine Vorschläge unten...
Zitat:
Ich hatte den Befehl : Logic(value)
Gefunden.
Du meinst vermutlich
logical
. Ich halte das aber nicht für zielführend.
Zitat:
Kann ich die dann einfach z.b. drei mal machen heißt zuerst Test er es mit einer dann zwei dann drei Pumpen und dann gibt vergleicht er die drei werte und gibt den kleinsten raus? Meinst du das so?
vielen Dank Harald, ich werde das morgen direkt mal testen!
Und ja genau meinte logical.
ja grundsätzlich habe ich die pumpenkennlinien, diese ist ja gekreuzt mit der anlagenkennlinie, welche ich dann als polynom vorgebe. Und bauliche Grenzen sei es Energiebedarf oder pumphöhe, ist ja schon durch die Eingrenzung der Fördermenge geschehen. Es handelt sich hier um reale Pumpen, heißt die werden schon betrieben und von da kann ich die min und Max fördermengen ablesen, heißt die fu Grenzen liegen bei 20-40 Hz oder so ähnlich. Jede Frequenz entspricht ja einer Leistung und diese dann einer Fördermenge. Diese Fördermengen nehme ich dann als Grenzen.
Sorry wurde ein langer Text und etwas wirr, hoffe trotzdem das er verständlich war hehe 😃😃
ich habe eben mal die Funktion getestet welche du hier reingeschrieben hast.
Leider verwendet die Funktion jedes mal alle 3 Pumpen und schließt einzelne nicht aus...
Als bestResult erscheint dann jedes mal 0 0 0, weil alle folgenden kombinationen mit gleichem result rauskommen.
Vielleicht hast du noch einen Tipp wie man das beheben kann ?
bitte immer den verwendeten Code angeben.
Du musst schon selbst dafür sorgen, dass in Abhängigkeit von
kombi
die richtigen Pumpen an- bzw. ausgeschaltet werden.
if result<bestResult
bestResult=result;
bestKombi=kombi;
bestX=xx;
end end disp(['bestResult ',num2str(bestResult)]) disp(['bestKombi ',num2str(bestKombi)]) disp(['bestX ',num2str(bestX)]) end
Muss ich dann die kombi als Vektor machen und als Faktor vor die Variablen x(1)-x(3) packen? damit der solver nicht mit den Fördermengen rechnet?
Das wäre der erste Schritt. Allerdings versucht fmincon dann, einen Parameter zu optimieren, der keine Rolle spielt, weil ja mit 0 multipliziert wird - nicht gut.
Der nächste Schritt wäre also, nur so viele Startwerte zu verwenden wie in dem speziellen Fall Pumpen eingeschaltet sind, und auch wirklich nur die Energie für die eingeschalteten Pumpen zu optimieren.
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.