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

Lösen einer Differentialgleichung mit ode45 2D

 

tew2017
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 26.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.07.2017, 18:06     Titel: Lösen einer Differentialgleichung mit ode45 2D
  Antworten mit Zitat      
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;
 

f_radx_fct = @(x,y)interp2(xi,yi,gradf_x,x,y,'spline');
f_rady_fct = @(x,y)interp2(xi,yi,gradf_y,x,y,'spline');

x0  = 0.02;
vx0 = 0;
y0  = 0;
vy0 = 1;

[t,x]=ode45(@particle_track,time_span,[x0 y0 vx0 vy0],[],f_radx_fct,f_rady_fct);



function du= particle_track(t,x,fctx,fcty)

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
 


Vielen Dank im Voraus!

Grüße
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

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.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 26.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2017, 09:48     Titel:
  Antworten mit Zitat      
Hallo,

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!

Anbei ein Bild von der Fehlermeldung!

Danke im Voraus!
Grüße,

Fehlermeldung.PNG
 Beschreibung:

Download
 Dateiname:  Fehlermeldung.PNG
 Dateigröße:  13.2 KB
 Heruntergeladen:  477 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

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?

Hast du auch schon den Debugger versucht?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 26.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2017, 10:23     Titel:
  Antworten mit Zitat      
Hallo Harald,

Ich hab jetzt die globale Variable entfernt und jetzt funktioniert es Smile.

Vielen dank

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.07.2017, 12:51     Titel: Re: Lösen einer Differentialgleichung mit ode45 2D
  Antworten mit Zitat      
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:
Code:
fcn = @(t, x) particle_track,time_span(t, x, f_radx_fct, f_rady_fct);
[t,x] = ode45(fcn, time_span, [x0 y0 vx0 vy0]);


Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
tew2017
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 26.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2017, 13:18     Titel:
  Antworten mit Zitat      
Hallo Jan,

Danke für die Information.

Wäre es eigentlich möglich mit einem anderen Verfahren die Bewegungsgleichung genauer zu berechnen, da ich ja eine Interpolation einer Variable machen muss?

Danke im Voraus!

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 08.07.2017, 15:23     Titel:
  Antworten mit Zitat      
Hallo tew2017,

Spline-Interpolationen sind zwar glatt, können aber deshalb auch überschwingen:
Code:
a = [0, 1, 0, 1, 0, 0];
b = 0:5;
c = 0:0.1:5;
y = spline(b,a,c);
figure;
plot(c,y);
hold('on');
plot(b,a, 'o')

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
tew2017
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 26.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.07.2017, 10:06     Titel:
  Antworten mit Zitat      
Hallo Jan,

ich verstehe nicht ganz was du mit dem letzten Satz meinst. Kannst du das vl. an einem einfachen Beispiel erläutern?

Vielen Dank im Voraus!
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 10.07.2017, 14:28     Titel:
  Antworten mit Zitat      
Hallo tew2017,

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
tew2017
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 26.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.07.2017, 19:59     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank für die Erklärung. Habs jetzt verstanden Smile.

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