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

Gleichung mit Solver lösen - Variable mehrfach in Formel

 

GastLAB

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2022, 21:57     Titel: Gleichung mit Solver lösen - Variable mehrfach in Formel
  Antworten mit Zitat      
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

Code:

Ud = 100; % Volt
R = 0.01; % Ohm
syms i_d

k = 1;

while k <= 5
       
    calc_i_d = ( R .* i_d ) + ( delta_Ld(1,k) ./ ( i_d - Id(k) ) ) == Ud;
    solve_i_d(k) = solve(calc_i_d, i_d);
   
    k = k + 1;

end
 


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.

Vielen Dank schonmal für die Hilfe.

Grüße


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.425
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.02.2022, 22:25     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
GastLAB

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.02.2022, 07:55     Titel:
  Antworten mit Zitat      
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,Smile funktioniert, allerdings habe ich eine 1-dimensionale Lösung erwartet da ja keine quadratische Funktion enthalten ist, wo ist mein Denkfehler?

Gruß
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.425
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.02.2022, 08:54     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
GastLAB

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.02.2022, 12:35     Titel:
  Antworten mit Zitat      
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.

Grüße
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.425
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.02.2022, 12:43     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
GastLAB

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2022, 17:24     Titel:
  Antworten mit Zitat      
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.

Code:

syms i_d i_q

calc = [ f(i_d, k) == U_d,
f(i_q, k) == U_q ];

vars = [i_d i_q];                                                                                                              
[sol_i_d(k,:), sol_i_q(k,:)] = solve(calc, vars);
 


Danke!
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.425
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.02.2022, 17:56     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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
Code:

um
result und solve(...)

Zitat:
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
GastLAB

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2022, 18:30     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine wiederholt ausführliche Antwort.

Leider wird beim Fehler auf die Solver-Zeile verwiesen
Code:
[sol_i_d(k,:), sol_i_q(k,:)] = solve(calc, vars);

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.

Grüße
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.425
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.02.2022, 19:54     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
GastLAB

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2022, 20:58     Titel:
  Antworten mit Zitat      
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.

Ich hatte dies über
Code:
i_d(1) = 0
i_q(1) = 0

versucht aber das geht nicht da dies syms Variablen sind, richtig?

Dennoch verweist der Error auf die solver Zeile darunter:
Code:
Second argument must be a vector of symbolic variables.
Error in Simulationsmodell (line 287)
    [sol_i_d(k,:), sol_i_q(k,:)] = solve(calc, vars);


Gibt es eine Alternative den Anfangswert trotz syms Variable zu definieren oder muss/kann ich das über einen Befehl wie
Code:
(if k = 1, then i_d = 0)
lösen?

Grüße
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.425
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.02.2022, 21:13     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
da dies syms Variablen sind, richtig?

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

Es kann z.B. sinnvoll sein,
Code:
i_d(1) = sym(0)

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
GastLAB

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2022, 22:24     Titel:
  Antworten mit Zitat      
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 Wink

Code:


k = 1;

syms i_d i_q

while k <= 12
       
SId = k;
ZIq = k;

calc = [ ( R .* i_d ) + ( ( dLd(ZIq,SId)  ./ ( i_d - Id(1,SId) ) )   .* i_d + Ld(ZIq,SId) + ( dPsi./di ) ) .* dIq./dt_i   - omega .* ( Lq(ZIq,SId) .* Iq(ZIq,1) )          == Ud,...
         ( R .* i_q ) + ( ( dLq(ZIq,SId)  ./ ( i_q - Iq(ZIq,1) ) )   .* i_q + Lq(ZIq,SId) )                .* dIq./dt_i   + omega .* ( Ld(ZIq,SId) .* Id(1,SId)  + P_s_i ) == Uq ] ;
   
vars = [i_d i_q];

[sol_i_d(k,:), sol_i_q(k,:)] = solve(calc, vars);

k = k + 1;
   
end

 


Grüße & schönen Abend
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.425
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.02.2022, 22:42     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
GastLAB

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2022, 09:23     Titel:
  Antworten mit Zitat      
Hallo Harald,

du meinst so?

Code:

R = 1;
P_s_i = 1;
Ud = 120;
Uq = 120;

Id=linspace(1,51,51);
Iq=linspace(1,51,51);
dIq=linspace(1,50,50);
dt_i=linspace(1,50,50);

Lq1=[1:2601]
Ld1=[1:2601]
dLd1=[1:2500]
dLq1=[1:2500]

Ld=reshape(Ld1,51,51);
Lq=reshape(Lq1,51,51);
dLd=reshape(dLd1,50,50);
dLq=reshape(dLq1,50,50);

 


Grüße
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.