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

DGL mit ode45 lösen

 

GastLAB

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.04.2022, 16:55     Titel: DGL mit ode45 lösen
  Antworten mit Zitat      
Hallo zusammen,

ich verzweifle gerade an der Lösung zweier DGL 1. Ordnung mittels ode45.

Meine DGL hat folgende Form siehe Anhang:

wobei a_nm aus Variablen abhängig von (Iq/Id) besteht und
b1 b2 eine Konstante Zahl ist.

Beide Gleichungen Id* & Iq* sind gleichzeitig abhängig von Id UND Iq.

Ich habe versucht die Gleichung in folgendem Code möglichst übersichtlich darzustellen. Die Funktionen sind Beispiele.

Code:

function [dId,dIq] = GOMLFUNC(t,I_Punkt);

    ud = 10;
    uq = 10;
    Id = -925:1:0;
    Iq =  0:1:925;
   
Ld = Id^2  + Iq^2; %Beispielfunktion
Ldd = 2*Id + Iq^2; %Beispielfunktion part. Abl.
Ldq = Id^2 + 2*Iq; %Beispielfunktion part. Abl.

Lq = Ld;
Lqd = Ldd;
Lqq = Ldq;
Psi = Ld;
Psid = Ldd;
Psiq = Ldq;

a11 = ( (Ldd/dId) * Id + Ld + (Psid/dId) );
a12 = ( (Ldq/dIq) * Id +      (Psiq/dIq) );
b1  = ud - R * Id + omega * Lq * Iq;
a21 = ( (Lqd/dId) * Iq );
a22 = ( (Lqq/dIq) * Iq + Lq );
b2  = uq - R * Iq - omega * (Ld * Id + Psi);

    I_Punkt = [Id_Punkt; Iq_Punkt];
    a_Nenner = a11 * a22 - a12 * a21;
    a_matrix = [a22 -a12; -a21 a11];
    b_Vektor = [b1; b2];

I_Punkt = zeros(2,1);
I_Punkt(1) = (1/a_Nenner) * a_Matrix * b_Vektor;
I_Punkt(2) = (1/a_Nenner) * a_Matrix * b_Vektor;
end
 


Die DGL möchte ich Lösen mit den Anfangswerten Iq = 0 & Id = 0;

Code:

clc;
clear all;

t  = [0 1];     % Simulationsdauer
y0 = [0 0];     % Anfangsbedingungen [Iq Id]
[tsim,xsim] = ode45(@GOMLFUNC,t,y0);

plot(tsim,xsim)
 


Ich möchte also die Lösung für dId & dIq über die Zeit berechnen, wo ist mein Denkfehler?

Vielen Dank für die Hilfe im Voraus!

Differentialgleichung.PNG
 Beschreibung:

Download
 Dateiname:  Differentialgleichung.PNG
 Dateigröße:  17.4 KB
 Heruntergeladen:  152 mal


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.04.2022, 18:29     Titel:
  Antworten mit Zitat      
Hallo,

mir scheint hier einiges durcheinandergeraten zu sein.
Die zahlreichen Warnungen im Editor deuten ja auf einige Probleme hin.

Generell würde ich so vorgehen:

Code:
function dI = GOMLFUNC(t,I);

Id = I(1);
Iq = I(2);
% Jetzt wird aus Id und Iq die Ableitung dId und dIq berechnet
dI = [dId; dIq];


Es kann einfacher sein, mit dieser Vorlage anzufangen und dann die benötigten Teile nach Bedarf hineinzukopieren.

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: 04.04.2022, 08:09     Titel:
  Antworten mit Zitat      
Hallo Harald, danke für die Antwort.

Ich habe eine Vorlage von hier genutzt, in dieser gab es aber nur eine Variable (x) daher war ich nicht sicher welche Teile ich ändern muss um nach zwei verschiedenen Variablen lösen zu können.

Entspricht dann mein I(1) & I(2) den DGLS wie sie im Anhang als Matrix aufgestellt waren?

Gruß
 
GastLAB

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2022, 08:30     Titel:
  Antworten mit Zitat      
Ich habs jetzt nochmal deutlich vereinfacht und kommentiert, die Gleichungen sind ja im Prinzip egal bis das Skript läuft.

Code:

function dI = GOMLFUNC(t,Id,Iq);

    I = zeros(2,1);     % I-Vektor anlegen für zwei Variablen (Id=I(1), Iq=I(2))
    I(1) = 2*Id+Iq;     % I-Vektor befüllen
    I(2) = Id^2-3*Iq;   % I-Vektor befüllen
    Id = I(1);          % umbenennen (notwendig?)
    Iq = I(2);          % umbenennen (notwendig?)
    % Jetzt wird aus Id und Iq die Ableitung dId und dIq berechnet
    dI = [dId; dIq];    % fehlt hier noch etwas?
   
end


Kann ich in der 1. Zeile mehrere unbekannte angeben (t,Id,Iq) oder gebe ich nur t und den Vektor I an?

Wie wird aus Id & Iq, dId & dIq? Passiert das alles in der ode45 Funktion?
Gebe ich hier die Anfangswerte für Id & Iq (jeweils 0) korrekt an?

Code:
t = [0 1];     % Simulationsdauer
I = [0 0];     % Anfangsbedingungen [Iq Id]
[tsim,xsim] = ode45(@GOMLFUNC,t,I);

plot(tsim,xsim)


Danke nochmal!
 
GastLAB

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2022, 08:53     Titel:
  Antworten mit Zitat      
Selbstversuch macht klug...

Ich hab die Benennung angepasst und deutlich vereinfacht.

Code:
function dI = GOMLFUNC(t,I);

    dI = zeros(2,1);     % I-Vektor anlegen für zwei Variablen (Id=I(1), Iq=I(2))
    dI(1) = 2*I(1)+I(2);     % I-Vektor befüllen
    dI(2) = I(1)^2-3*I(2);   % I-Vektor befüllen
%     Id = I(1);          % umbenennen (notwendig?)
%     Iq = I(2);          % umbenennen (notwendig?)
% Jetzt wird aus Id und Iq die Ableitung dId und dIq berechnet
%     dI = [dId; dIq];    % fehlt hier noch etwas?
   
end


die letzte Zeile mit dI = ist hier nicht unbedingt nötig, oder?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.04.2022, 10:34     Titel:
  Antworten mit Zitat      
Hallo,

ja, man muss sich an die Schnittstelle halten. Der letzte Beitrag sieht syntaktisch gut aus.

Die Zeilen
Code:
Id = I(1);
Iq = I(2);

und dann mit Id und Iq weiterarbeiten trägt gerade bei vielen Komponenten zur Lesbarkeit des Codes bei.

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: 04.04.2022, 14:56     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Rückmeldung.

Ich habe noch zwei Fragen:

Kann ich die Ableitung von der rechten Seite der Gleichung:
Code:
dI(1) =
dI(2) =


im rechten Teil der Gleichung ebenfalls benutzen?

Beispiel::
Code:
dI(1) = 1/dI(1) + I(1) + I(2)
dI(2) = 1/dI(2) + I(1) + dI(1)


Außerdem möchte ich in der Gleichung abkürzungen benutzen um die Übersicht zu erleichtern, wenn ich aber die Abkürzungen vorher anlege und I(1) oder dI(1) benutze bekomme ich eine Fehlermeldung da Matlab diese Variablen noch gar nicht kennt.

umgehe ich das mit einem leeren I-Vektor oder muss ich die Abkürzungen statt im Funktions-Teil besser in den Lösungsteil mit ode45 packen?

Ich hoffe du verstehst was ich meine.

Grüße
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.04.2022, 15:52     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
kann ich die Ableitung von der rechten Seite der Gleichung [...]
im rechten Teil der Gleichung ebenfalls benutzen?

Aus syntaktischer Sicht müssten dI(1) und dI(2) vorher bestimmt worden sein. Praktisch kann ich mir selbst dann nicht vorstellen, dass das sinnvoll ist. Wenn dI(1) und dI(2) sich aus einer nichtlinearen Gleichung ergeben sollen, dann könnte man z.B. fsolve nutzen.
Wenn es aber noch um das ursprüngliche Problem geht: dort ist das nicht nötig, weil du ja schon geschrieben hast, wie du das lineare Gleichungssystem lösen kannst.

Zitat:
wenn ich aber die Abkürzungen vorher anlege und I(1) oder dI(1) benutze bekomme ich eine Fehlermeldung da Matlab diese Variablen noch gar nicht kennt.

Wie legst du diese Abkürzungen an und wie versuchst du sie 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
 
GastLAB

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2022, 20:53     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe oben in dem ersten Code die ausführliche Gleichung angegeben (siehe auch Anhang).

Hier ist sowohl in der letzten Zeile zu sehen welche Abkürzungen ich verwende (a_Matrix, a_Nenner, etc.) als auch dass ich dId in der Gleichung selbst verwende.

Ich habe erst einen numerischen Ansatz gewählt, mit solve, würde es aber lieber als DGL lösen. Daher meine Fragen.

Ich hoffe du verstehst was ich meine.

Gruß
 
Harald
Forum-Meister

Forum-Meister


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

wie gesagt: in dem ersten Code ist so viel durcheinander geraten, dass ich basierend auf meiner Vorlage von vorne anfangen würde.
Ich hoffe, dass dir zwischenzeitlich einiges klarer geworden ist. Um dir bei deinen momentanen Problemen zu helfen, wäre es hilfreich, den momentanen Code zu kennen.

Wenn du Abkürzungen zuweist bevor du sie verwendest, sollte es kein Problem geben.

Sollen die a_ij tatsächlich auch von den Ableitungen abhängen? Dann ist die Formulierung als lineares Gleichungssystem irreführend und vor allem könntest du deinen momentanen Ansatz vergessen, weil du ja eben nicht nach den Ableitungen auflösen kannst. Ich würde die Gleichungen erst mal mit dId und dIq durchmultiplizieren und schauen, was dann herauskommt.

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: 04.04.2022, 21:45     Titel:
  Antworten mit Zitat      
Das mit den Abkürzungen hat jetzt doch geklappt, ich hatte sie zuerst glaube ich an der falschen Stelle angegeben.

Bleibt nur noch das Problem mit der Ableitung.
Ich probiere das morgen mal aufzulösen und melde mich wenn ich nicht weiter komme.

Vielen Dank bis hier hin Smile
 
GastLAB

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.04.2022, 16:30     Titel:
  Antworten mit Zitat      
Nabend!

Also das Skript läuft und das Ergebnis ist auch im groben plausibel.

Nur erwarte ich für Id ein negatives Vorzeichen, und für Iq ein positives, aktuell sind beide Positiv.

Die Gleichungen greifen auf Kennfelder hinzu, welche ich wiederum als Matlab surface in eine Gleichung 5en Grades umgewandelt habe. Es ist gültig für Id = -925 bis 0 und Iq 0 bis 925. Was außerhalb dieser Grenzen passiert weiß ich nicht und liefert definitiv ein falsches Ergebnis.

Meine Frage ist jetzt also: Kann ich dem ODE45 Solver eine "Richtung" vorgeben in die er lösen soll? Wenn ich die Startwerte mit Id = -1 & Iq = +1 festlege wird aus dem Id nach kurzer Zeit trotzdem ein positiver Wert.

ODE45:
Code:

clc;
clear all;

t = [0 0.004];     % Simulationsdauer
I = [0 0];     % Anfangsbedingungen [Iq Id]

[tsim,xsim] = ode45(@DiffFunc,t,I);

hold on;
plot(tsim,xsim(:,1), 'b-*')
plot(tsim,xsim(:,2), 'g-*')
 

Auschnitt aus der Funktion mit Beispiel für ein Kennfeld:
Code:


    Ld  = Ld00 + Ld10*Iq    + Ld01*Id + Ld20*Iq^2   + Ld11*Iq*Id        +   Ld02*Id^2   +   Ld30*Iq^3   +   Ld21*Iq^2*Id   +   Ld12*Iq*Id^2   +   Ld03*Id^3   +   Ld40*Iq^4   +   Ld31*Iq^3*Id   +   Ld22*Iq^2*Id^2   +   Ld13*Iq*Id^3   +   Ld04*Id^4   +   Ld50*Iq^5   +   Ld41*Iq^4*Id   +   Ld32*Iq^3*Id^2   +   Ld23*Iq^2*Id^3   +   Ld14*Iq*Id^4   +   Ld05*Id^5;
   

    dI = zeros(2,1);     % I-Vektor anlegen für zwei Variablen (Id=Id, Iq=Iq)
    Id=I(1);
    Iq=I(2);
dI = (1/a_Nenner) * a_Matrix * b_Vektor; % Nenner & Vektoren abhängig von Kennfeldgleichungen wie Ld.
 


Danke!
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.04.2022, 16:45     Titel:
  Antworten mit Zitat      
Hallo,

deine Funktion legt diese Richtung fest. Ich kann da nur empfehlen, jedes Detail der Funktion nochmal zu prüfen.

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
 
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.