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

ODE 2. Ordnung ohne Reduktion mit Matlab lösbar

 

xedosh
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 16.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.09.2009, 11:32     Titel: ODE 2. Ordnung ohne Reduktion mit Matlab lösbar
  Antworten mit Zitat      
Hallo Leute,

ich habe die ODE Ax'' + Bx = F und dabei sind, z.B. die Matrizen A und B jewels 2000x2000 groß. Gibt es eine Möglichkeit, diese ODE nun direkt einzugeben?
Die Reduktion per Hand wäre mehr als mühselig.

Ansonsten, wenn das nicht geht. Welche Möglichkeiten seht ihr das Problem zu lösen?

Vielen Dank bereits jetzt für eure Hilfe und Mühe!

Grüße,

XeDoSh
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.09.2009, 21:39     Titel:
  Antworten mit Zitat      
Vorschlag:
1. Umformulieren in ein System erster Ordnung.
2. Verwendung von ode45 oder ähnlichem (mit einer "mass matrix", siehe Doku von ode45)

Sind diese Matrizen dünnbesetzt? Falls ja, sollte man das ausnutzen...

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
xedosh
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 16.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.09.2009, 10:51     Titel:
  Antworten mit Zitat      
Hallo Harald,

erstmal danke für deine Antwort. Das Problem an der Sache ist die Größe des Systems. Sicherlich kann ich das System auf ein System von ODEs 1. Ordnung bringen (Reduktion). Aber ich wollte darauf anspielen, dass ich ja bei einer 2000x2000 Matrix letztlich 4000 Gleichungen aufstellen muss. Daher war meine Frage, ob es da nicht eine andere bekannte Lösung gibt.


Beste Grüße,

Andreas
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.09.2009, 12:25     Titel:
  Antworten mit Zitat      
Hallo Andreas,

mir ist zumindest keine bekannt. Und natürlich sollte man da nicht jede Gleichung einzeln nehmen, sondern mit den Matrizen arbeiten... also u = x' und dann mit Hilfe der gegebenen Matrizen (als ganze!) Gleichungen für x' und u' erstellen.

x' = u
A u' = F - B*x

Damit sieht das DGL-System in MATLAB-Notation in etwas so aus

[eyes(length(x)), zeros(length(x)); zeros(length(x)), A] [x; u]'= [u; -B*x + F]

Wie gesagt, ggf. Dünnbesetztheit ausnutzen...

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
xedosh
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 16.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.09.2009, 16:53     Titel:
  Antworten mit Zitat      
Hallo Harald,

das ist sehr interessant. Ist mir so noch nie über den Weg gelaufen.
Ich habe das bisher wie folgt in einem m-File umgesetzt:

Code:

function [t,x]=ODEsolver(n)

% Lade Systemmatrizen entsprechender Groesse
[Ma,S] = systemMat(n);
x = zeros(n,1);

M = [eye(length(x)), zeros(length(x)); zeros(length(x)), Ma];
M = sparse(M);
S = sparse(S);

options = odeset('Mass',M);
x0 = zeros(n,1);
[t,x] = ode23t(@fct, [0 2], x0, options);

    function dy = fct(y,t)
       
        dy = [y;
                -S*y+F(t)];
    end

end
 

n ist die Größe der Objekte (also sind es nxn Matrizen bzw. nx1 Vektoren).
F(t) ist ein 8192x1 Vektor. Dieser wirkt nur in einem Punkt i für einen Moment; wie ich den einbringen kann ist mir noch sehr unklar. Muss aber gehen. *hoff*
Die Funktion systemMat lädt die Systemmatrizen, die ich oben noch A und B gennant habe. Also hier
Ma = A und S = B.
Nun ergeben sich für mich zwei Probleme:
1. Die Defintion der rechten Seite: Wie bewerkstellige ich jetzt quasi das hier
dy = [y(1)
y(2)
...
y(n)
-S(11)*y(n+1)-...-S(1n)*y(2n)
-S(21)*y(n+1)-...-S(2n)*y(2n)
-S(. . .)*y(n+1)-...-S(. . .)*y(2n)
-S(i1)*y(n+1)-...-S(in)*y(2n) + F_i
.........
-S(n1)*y(n+1)-...-S(nn)*y(2n)
]

2. Und die Implementation der Kraft, die als Vektor, wie eben bereits beschrieben, vorliegt.

Danke schon jetzt vielmals!

Andreas
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.09.2009, 20:38     Titel:
  Antworten mit Zitat      
Hallo,

y ist der gesamte Vektor, in meiner Notation [x; u]

Code:
function dy = fct(t,y)  % Reihenfolge wichtig!!
       
x = y(1:end/2);
u = y(end/2+1:end);
dy = [u; -B*x + F];
end


Wenn F nur "für einen Moment" wirkt, dann könnte man sagen

F = F0 für t <= Wert
F = 0 für t > Wert

wobei Wert dann die Länge des Moments ist.

Grüße,
Harald
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.