Verfasst am: 06.07.2017, 17:06
Titel: Lösen einer Differentialgleichung mit ode45 2D
Hallo,
ich möchte eine Differentialgleichung (Bewegungsgleichung in 2D) mit ode45 lösen.
Dabei interpoliere ich eine Kraft da ich von dieser nur diskrete Werte habe. Ich habe dazu einen Code geschrieben und es kommt folgender Fehler: ""Struct contents reference from a non-struct array object". Was mache ich hier falsch?
Mein code:
Code:
t_start = 0;
t_end = 28; %final time in seconds.
time_span =t_start:0.01:t_end;
global b
f_radx=fctx(x(1),x(2));
f_rady=fcty(x(1),x(2));
du = zeros(4,1);
du(1)=x(3);
du(2)=x(4);
%F_d=-6*pi*b.mue*b.R*x(3);
F_d=1;
du(3)=(f_radx+F_d)/b.m_p;
du(4)=-g+0.44*rho_l/rho_p*(2-x(4))^2*3/(d_p*g)+(18*mue*(1-x(4)))/(d_p^2*rho_p)+f_rady/(d_p^2*rho_p);
end
schau dir doch die Zeile an, die die Fehlermeldung wirft.
Im zur Verfügung gestellten Code wird b nie gesetzt. Es wird also eine Fehlermeldung geben, sobald du versuchst, es zu verwenden.
Ich habe hier nur den relevanten Teil des Programmes hinzugefügt. Die globale Variable ist im Hauptprogramm mit den entsprechenden Parameter definiert. Ich habe schon einiges probiert, aber es kommt immer die gleiche Fehlermeldung. Bitte um Hilfe!
die Meldung bezieht sich offensichtlich auf b, da nur dort Punktnotation verwendet wird. Die Definition von b ist also relevant, wenn nicht der entscheidende Teil.
Warum verwendest du b als globale Variable und übergibst sie nicht wie z.B. fctx?
Wenn du aus welchen Gründen auch immer die globale Variable verwenden möchtest, deklarierst du sie auch überall als global?
Verfasst am: 08.07.2017, 11:51
Titel: Re: Lösen einer Differentialgleichung mit ode45 2D
Hallo tew2017,
Bemerkung:
ODE45 ist nur für die Integration glatt differenzierbarer Funktionen geeignet. Die Spline-Interpolation ist dafür geeignet, aber man findet (zu) oft auch lineare Interpolationen in der zu integrierenden Funktion. Dann ist das Verhalten des Integrators nicht definiert: Vielleicht stoppt er mit einer Fehlermeldung, vielleicht liefert ein ein vollkommen falsches Ergebnis, oder er reduziert die Schrittweite so lange, bis die Rundungsfehler über die Knicke hinweg-täuschen.
Wie gesagt: Die von Dir gewählten Splines umgehen diese Problem.
Globale Variablen sind immer eine schlechte Idee. Im Aufruf von ODE45 angehängte Variablen werden seit Matlab 6.5 (aus dem Jahr 2002) als "deprecated" bezeichnet. Besser ist eine anonyme Funktion:
Wäre es eigentlich möglich mit einem anderen Verfahren die Bewegungsgleichung genauer zu berechnen, da ich ja eine Interpolation einer Variable machen muss?
Die interplierte Kurve hat einen größeren Range als die Daten. Das kann dazu führen, dass Kräfte negative werden oder unmögliche Werte annehmen.
Wenn die Kräfte wirklich nur für bestimmte Gitterpunkte vorliegen, in Wirklichkeit aber einer glatte Funktion folgen, könnte man diese Funktion zunächst dur einen Fit finden.
Falls die Kräfte aber tatsächlich unstetig sind, ist die einzige saubere Lösung die Integration beim Erreichen jeder Grenze zu stoppen und den Endwert der Trajektorie als Startwert für die nächste Integration mit geänderter Kraft zu verwenden.
Es kommt darauf an, ob die Kräfte in der Realität einer stetigen Funktion folgen und Du nur einzelne Messwerte hast. Dann könnte ein Spline eine realistische Näherung sein. Vielleicht ändern sich die Kräfte aber in der Realität auch unstetig, z.B. bei einem Stoß, wenn Du einen Ball-Kontakt mit dem Boden berechnest. Dann ist eine glatte Intepolation der Kräfte unrealistisch und die Ergebnisse werden immer von den echten Trajektorien abweichen.
Bei Stößen erstellt man eine Event-Funktion, die die Integration stoppt und startet dann eine neue Integration mit den bisherigen Endwerten als Startwert und den geänderten Kräften.
Bevor man als eine genauere Integration vorschlagen kann, muss man zunächst wissen, wie denn das System beschaffen ist, dass Du simulierst. Vielleicht erzeugt die Spline-Interpolation Überschwinger, so dass unmöglich große Kräfte auftreten. Um das heraus zu finden, musst Du Dein System gründlich analysieren. Numerik bedeutet im Allgemeinen viel mehr als einen geeigneten Integrator zu finden.
vielen Dank für die Erklärung. Habs jetzt verstanden .
Grüße
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.