Gleichung mit Solver lösen - Variable mehrfach in Formel
GastLAB
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.02.2022, 21:57
Titel: Gleichung mit Solver lösen - Variable mehrfach in Formel
Hallo zusammen,
ich versuche gerade eine DGL zum Stromaufbau einer E-Maschine zu lösen.
Hierzu nutze ich diverse Look Up Tabellen die u.a. die Induktion (L) in Abhängigkeit vom Strom (I) angibt.
Hierzu habe ich eine Gleichung U = R*I + (L di/dt) aufgestellt.
Der Einfachheit halber schaue ich mir erstmal nur einen Teil der Gleichung an.
In der Gleichung kommt mehrfach die Größe i_d vor, für dieses i_d suche ich das Ergebnis je Durchlauf von K=1 bis 5.
Alle anderen Werte sind über Konstanten oder Matrizen der selben Größe vorhanden
Als Fehler kommt folgender Hinweis:
Unable to perform assignment because the indices on the left side are not compatible with the size of the right side.
Zitiert wird der Solver, aber ich denke es liegt an calc_i_d = (...)
Ist es grundsätzlich möglich im Solver mehrfach die selbe Variable zu verwenden?
Oder hat jemand eine andere Idee für den Fehler? Nach langer Google suche habe ich kein vergleichbares Problem finden können.
bitte stelle alle beteiligten Variablen zur Verfügung. Oft treten Probleme nur bei bestimmten Werten auf. Hier gibt es zumindest für meine Beispielwerte zwei Lösungen. Die könntest du einem Cell Array oder einer Matrix zuweisen.
solve_i_d(k,:) = ...
oder
solve_i_d{k} = ...
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 ;)
GastLAB
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 25.02.2022, 07:55
Titel:
Hallo Harald, danke für deine schnelle Rückmeldung.
delta_Ld ist eine 12x51 Matrix, hier möchte ich nur Zeile 1 verwenden
Id(k) ist eine 1x51 Matrix
Die Dimensionen für die Bruchrechnung sind doch korrekt, oder?
Der Trick mit solve_i_d(k, funktioniert, allerdings habe ich eine 1-dimensionale Lösung erwartet da ja keine quadratische Funktion enthalten ist, wo ist mein Denkfehler?
wenn ich das händisch lösen müsste, würde ich beide Seiten mit ( i_d - Id(k) ) multiplizieren. Dann wird die Gleichung zu einer quadratischen Gleichung.
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 ;)
GastLAB
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 25.02.2022, 12:35
Titel:
Hallo Harald,
was hätte das für einen Vorteil? Dann kommt die Variable i_d nach der ich Lösen möchte ja nur noch öfter in der Gleichung vor.
es ging mir weniger darum, dass das einen Vorteil hätte, sondern darum, dass es
1. der Grund ist, warum es zwei Lösungen gibt.
2. wohl auch das ist, was MATLAB im Hintergrund macht, weswegen man diese zwei Lösungen bekommt.
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 ;)
GastLAB
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 28.02.2022, 17:24
Titel:
Danke, ich habe den Fehler gefunden. Die fortlaufende Zahl k hat nicht immer zu den verfügbaren Zeilen/Spalten gepasst.
Was genau ist denn eigentlich mit left side und right side gemeint? die Gleichung im Solver selbst oder die Dimension der Variablen nach der gelöst werden soll in Verbindung mit den Dimensionen der Gleichung?
Leider habe ich einen neuen Fehler und ich glaube der hängt mit syms und dem solver zusammen. (subscript out of range)
Ist es grundsätzlich möglich mit syms & solver für fortlaufende k's unterschiedliche Lösungen für i_d & i_q zu schreiben oder ist das grundsätzlich der falsche Lösungsansatz?
Hier nochmal die Logik meine Berechnung ohne die Gleichungen selbst, in den Gelichgungen selbst kommen wie oben schon erwähnt i_d & i_q mehrfach vor.
Was genau ist denn eigentlich mit left side und right side gemeint? die Gleichung im Solver selbst oder die Dimension der Variablen nach der gelöst werden soll in Verbindung mit den Dimensionen der Gleichung?
Ich würde sagen: weder noch. Es geht um die Zuweisung, also bei
Leider habe ich einen neuen Fehler und ich glaube der hängt mit syms und dem solver zusammen. (subscript out of range)
Bitte mindestens auch angeben, in welcher Zeile diese Fehlermeldung kommt.
Zitat:
Ist es grundsätzlich möglich mit syms & solver für fortlaufende k's unterschiedliche Lösungen für i_d & i_q zu schreiben
Ja. Die Lösung von 24.02.2022, 22:25 hat ja auch funktioniert.
Zitat:
Hier nochmal die Logik meine Berechnung ohne die Gleichungen selbst
Anhand dessen kann ich leider das Problem weder nachvollziehen noch für dich lösen. Bitte lauffähigen Code zur Verfügung stellen, der das Problem reproduziert. Das müssen nicht genau die Gleichungen und Daten sein, mit denen du arbeitest, aber halt bitte Gleichungen und Daten, anhand deren man die Problematik nachvollziehen 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 ;)
GastLAB
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 28.02.2022, 18:30
Titel:
Hallo Harald,
vielen Dank für deine wiederholt ausführliche Antwort.
Leider wird beim Fehler auf die Solver-Zeile verwiesen
auch wenn dieser offensichtlich in den Gleichungen bei "calc" auftritt.
Das heißt die variablen syms muss ich nicht extra in Dimensionen festlegen um mehrere Werte dort hinterlegen zu können?
Dann werde ich einzelne Teile meiner Gleichung entfernen um rauszufinden welche Teil die Probleme bereitet und dann nochmal einen ausführlichen Code angeben.
Leider wird beim Fehler auf die Solver-Zeile verwiesen [...],
auch wenn dieser offensichtlich in den Gleichungen bei "calc" auftritt.
Woraus schließt du das und bist du dir ganz sicher?
Es kann höchstens sein, dass der Fehler in solve auftritt. Das würde aber in der Fehlermeldung angezeigt.
Ansonsten kann ich nur sagen: ich habe es noch nie erlebt, dass der Fehler auf eine andere Zeile verweist als die, in der der Fehler auftritt. Dass das passiert, ist deswegen nicht unmöglich, aber doch recht unwahrscheinlich.
Zitat:
Das heißt die variablen syms muss ich nicht extra in Dimensionen festlegen um mehrere Werte dort hinterlegen zu können?
Bei Zuweisungen wie hier für sol_i_d(k,:) nicht, nein. MATLAB erkennt das automatisch. Wichtig ist, dass jedes Mal eine Zeile der gleichen Länge zugewiesen wird. Wenn deine Gleichung also mal mehr, mal weniger Lösung hat, dann bleibt erstmal nur der Weg über ein Cell Array
solve_i_d{k} = ...
. Alternativ natürlich die Lösungen "irgendwie", z.B. durch Nebenbedingungen, auf eine reduzieren.
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 ;)
GastLAB
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 28.02.2022, 20:58
Titel:
Beispielsweise deshalb:
Ich möchte als Anfangsbedingung im ersten Schritt (k=1) für i_d & i_q = 0 festlegen um die nächsten Schritte dann iterativ berechnen.
Da was syms Variablen sind? Der Zusammenhang mit dem Code darunter ist mir nicht klar. Und ja, i_d wird dadurch ein Double. Das sollte auch im Workspace so angezeigt werden.
Zitat:
Dennoch verweist der Error auf die solver Zeile darunter:
Second argument must be a vector of symbolic variables.
Das ist zum einen eine komplett andere Fehlermeldung als vorher. Zum anderen tritt das Problem ja eben in dieser Zeile auf und wie du schon erkennst, musst du vorher evtl. was anderes machen. Irgendwas in vars auf 0 zu initialisieren (ob symbolisch oder numerisch) ist nicht nötig.
Zitat:
Gibt es eine Alternative den Anfangswert trotz syms Variable zu definieren
zu setzen. "Kann", weil ich nicht verstehe, was du hier eigentlich erreichen willst.
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 ;)
GastLAB
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 28.02.2022, 22:24
Titel:
Ich dachte in Abschnitten ist es einfach nachzuvollziehen aber nun anbei die gesamte Schleife.
Die Eingangsgrößen dLd (12x50) & dLq (50x12) sind bereits mit diff() differenziert und sie sind abhängig von Id (1x50) & Iq (50x1)
Ld ist abhängig von Iq/Id, genau so ist Lq abhängig von Iq/Id
Die grobe Logik der Brüche ist wie folgt:
Die Ableitung von d Ld / d Id löse ich auf zu -> ( Ld (k) - Ld (k-1) ) / ( Id(k) - Id(k-1) )
In diesem Bruch kenne ich alle Werte über Look Up Tabellen, möchte aber Id(k) iterativ berechnen um den Zeitlichen Zusammenhang herstellen zu können. Um Zugriff auf diese Variable zu haben habe ich Id einzeln angegeben und nicht auch schon im Vorfeld differenziert.
Id(1) sollte 0 sein, die nächsten Werte möchte ich dann abhängig vom letzten Wert berechnen. Die passende Spalte/Zeile soll dann entsprechend vom zuletzt berechneten Wert "gesucht" werden damit von da aus wieder die nächsten Werte für Ld, Lq und I(k-1) gelesen werden können.
Für die Auswahl von Spalte/Zeile habe ich noch keine Logik im Script, aktuell ist es gleich k da ich den Code vorher zum laufen bringen will.
Ich hoffe du kannst mit der Beschreibung und dem Code unten was anfangen. Sonst gerne fragen falls was fehlt
der Code ist soweit klar. Wie die Gleichungen zustande kommen, ist für mich erst mal nicht relevant. Bitte stelle aber die Variablen zur Verfügung, die benötigt werden, um den Code auszuführen.
Wenn ich den Code ausführen kann, sollte ich dieselbe Fehlermeldung bekommen wie du und kann vermutlich auch dabei helfen, sie zu beseitigen. Es müssen weder 50 Werte sein noch die echten - einfach nur soviel wie man braucht, um dein Problem tatsächlich nachstellen zu können.
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 ;)
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.