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

Integrationsschritte zählen

 

Illmatic
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 19.06.12
Wohnort: Hamburg
Version: R2011b
     Beitrag Verfasst am: 21.06.2012, 08:25     Titel: Integrationsschritte zählen
  Antworten mit Zitat      
Hallo,
ich würde gerne für ein bestimmtes DGL-System die Matlab-Solver miteinander vergleichen und mir dafür die Anzahl der Funktionsauswertungen, die Anzahl der erfolgreichen und die Anzahl der nicht erfolgreichen Integrationsschritte ausgeben lassen.

Ich hab dazu etwas in der Art im Internet gefunden:
Code:

sol = ode45('myDGL', [0, 40], [0, 0, 0, pi/32]);
n_steps = sol.stats.nsteps;
n_failed = sol.stats.nfailed;
n_fevals = sol.stats.nfevals;
 


So kriege ich allerdings eine Fehlermeldung. Lass ich nur die DGL lösen mit
Code:
[t,q] = ode45('myDGL', [0, 40], [0, 0, 0, pi/32]);

kriege ich keinen Fehler.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

wenn eine Fehlermeldung kommt, diese bitte immer hier reinkopieren; insbesondere wenn der Code nicht direkt reproduzierbar ist (wir haben ja myDGL.m nicht).

Schau dir bitte die Variable sol im Workspace an; dann siehst du ja, welcher Datentyp das ist, welche Felder die Struktur ggf. hat etc.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 19.06.12
Wohnort: Hamburg
Version: R2011b
     Beitrag Verfasst am: 21.06.2012, 11:21     Titel:
  Antworten mit Zitat      
Sorry.
Die Fehlermeldung lautet:

Attempt to reference field of non-structure array.

Error in DGL_Test (line 2)
n_steps = sol.stats.nsteps;

Die myDGL sieht so aus:
Code:

function qdot = myDGL(t,q)

m = 1000;
ms = 3000;
l = 5;
g = 9.81;

k1 = 260,46;
k2 = 10;

u = 5-(t/8);
F = k1*(u-k2*q(1));

qdot=[0;0;0;0];

qdot(1) = (F+m*q(3)^2*l*sin(q(4))+m*cos(q(4))*sin(q(4))*g)/(ms+m-m*(cos(q(4)))^2);
qdot(2) = q(1);
qdot(3) = -(((F+m*q(3)^2*l*sin(q(4))+m*cos(q(4))*sin(q(4))*g)/(ms+m-m*(cos(q(4)))^2))*cos(q(4))+g*sin(q(4)))/l;
qdot(4) = q(3);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.06.2012, 11:41     Titel:
  Antworten mit Zitat      
Hallo,

das Problem dürfte in der veralteten Syntax liegen, die du verwendest.
Die Schreibweise funktioniert zwar an sich noch, aber du kannst dadurch manche neuere Features nicht nutzen.

Wenn du statt deines Aufrufs das verwendest:
Code:
sol = ode45(@myDGL, [0, 40], [0, 0, 0, pi/32]);

funktioniert das ganze bei mir.

Falls es bei dir nicht funktioniert, bitte auch die MATLAB-Version posten, mit der du arbeitest.

Hinweise zu deiner Funktion:
Dezimaltrennzeichen in MATLAB ist immer Punkt, d.h. es muss heißen
Code:
k1 = 260.46;


Stimmen die Gleichungen?
qdot(1) und qdot(3) sehen auf den ersten Blick nach in x- und y-Richtung aufgespalteten Kräften aus. Dann würde allerdings bei qdot(1) ein *sin(q(4)) fehlen.
Aus Effizienzgründen würde ich vermeiden, dass dieselben Berechnungen für qdot(1) und qdot(3) quasi doppelt ausgeführt werden. Du kannst ja qdot(1) in qdot(3) weiterverwenden?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 19.06.12
Wohnort: Hamburg
Version: R2011b
     Beitrag Verfasst am: 21.06.2012, 11:56     Titel:
  Antworten mit Zitat      
Danke Harald!
Jetzt funktionierts einwandfrei. Das Komma war wohl ein Flüchtigkeitsfehler. Auch dafür danke.
Private Nachricht senden Benutzer-Profile anzeigen
 
Illmatic
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 19.06.12
Wohnort: Hamburg
Version: R2011b
     Beitrag Verfasst am: 23.06.2012, 14:55     Titel:
  Antworten mit Zitat      
Ah noch mal zur Erklärung. Der Zustandsvektor q war hier:
q=(\dot{x},x,\dot{\phi},\phi)^T und die Differentialgleichungen für \ddot{x} und \ddot{\phi} wurden vorher über die Lagrange-Gleichungen 2. Art bestimmt. Die stimmen so schon. Keine Sorge Wink
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.