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

interp1 in ode45, length(X) = size(Y)?

 

Divid
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 12.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2010, 08:28     Titel: interp1 in ode45, length(X) = size(Y)?
  Antworten mit Zitat      
Hallo,


ich lasse über ode45 ein DGL-System lösen, was bisher auch gut geklappt hat. Bisher war eine sinus-förmige Anregung implementiert, also der funktionale Zusammenhang der Anregung bekannt. Jetzt wird das Programm mit einer realen Anregung aus Messwerten erweitert, dh. die Anregung liegt als Wertetabelle mit (t_b, F(t_b)) vor, wobei t_b ein Spaltenvektor mit 240120 Elementen und F(t_b) ein Spaltenvektor mit 240120 Elementen ist. t_b und F(t_b) sind dabei eigentlich zyklische Werte mit einer Periode von 0,12 Sekunden und müssen für den Lösungszeitraum von 80 Sekunden auf diese 240120 Elemente verlängert werden.

Ich möchte nun wie man das an sich kennt, F(t) zu den Auswertezeitpunkten von ode45 interpolieren:
Code:

%% Lösung der DGLs
tspan = [0 80];
x0 = [0; 0; 0; 0; 0; 0];
[t_1,x] = ode45(@DGL, tspan, x0);


function dx = DGL(t,x)

global t_b F_b
%F = AR.Ampl*sin(2*pi*AR.Freq*t + 2*pi*AR.Phase/360); %alte sin-Anregung

F = interp1(t_b,F_b,t,'linear');

% dx = DGL-System usw.
end
 



Und jetzt erhalte in den Fehler, dass in interp1 length(X) nicht gleich size(Y,1) ist. Dies kann man ja leicht nachprüfen, und length(t_b) = 240120 und size(F_b,1) = 240120. Was ja auf Grund der Anzahl der Elemente der beiden Vektoren ja klar ist. Auch ein Plot der Anregung mit plot(t_b,F_b) ist ohne Fehler möglich. Wo liegt nun der Fehler?

Danke schonmal vorab.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

achte mal darauf, beide Vektoren als Spaltenvektoren zu übergeben. Dann sollte es gehen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 12.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2010, 08:14     Titel:
  Antworten mit Zitat      
Danke erstmal für die Antwort.


Die beiden Vektoren sind schon Spaltenvektoren. Wie kann ich sie dann als Spaltenvektoren übergeben? Ich stehe gerade ziemlich auch dem Schlauch. Mit

Code:
interp1(t_b(:,1),F_b(:,1),t,'linear')


klappt es auch nicht (index out of bounds because size(F_b) = [0, 0]), aber size(F_b) = [240120,1], wenn ich es im Command Window probiere.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.06.2010, 22:44     Titel:
  Antworten mit Zitat      
Hallo,

dann kann höchstens sein, dass das mit den globalen Variablen irgendwie durcheinanderkommt. Hast du denn die Variable F_b im Command Window als global definiert?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 12.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2010, 14:10     Titel:
  Antworten mit Zitat      
Danke, jetzt rechnet das Skript wenigstens durch, aber meine sämtlichen Ergebnisse sind NaN. Irgendwas ist da noch im Busch. Mein Code sieht jetzt so aus:

Code:
function dgl
global  x t_1 ZMS

%% Lösung der DGL
tspan_ZMS = [0 20];
x0 = [0; 0; 0; 0; 0; 0];
options = odeset('AbsTol', 1e-10, 'MaxStep', 0.01);
[t_1,x] = ode45(@ZMS_DGL, tspan_ZMS, x0, options);

%Plot-Befehle
end

function dx = ZMS_DGL(t,x)

global ZMS
% F = AR.Ampl*sin(2*pi*AR.Freq*t + 2*pi*AR.Phase/360); %alte sin-Anregung

load t_b_F_b.mat  %Laden der Zeit/Kraft-Vektoren
F = interp1(t_b,F_b,t,'linear');
dx = ... %DGL-Definition, nicht geändert gegenüber vorher
 
 clear F_b t_b
end
 



Wenn ich wieder die Sinus-Anregung vorgebe, passen die Ergebnisse, aber mit der interpolierten Kraft-Anregung erhalte ich sämtliche Ergebniswerte zu NaN. Mache ich irgendwo noch einen Fehler? Es ist ja im Prinzip nichts Aufregendes enthalten. Die Zahlenwerte der neuen, gemessenen Anregung sind auch korrekt in t_b_F_b.mat gespeichert, zumindest ein Plot der Mat-Datei ist korrekt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.06.2010, 17:47     Titel:
  Antworten mit Zitat      
Hallo,

ein Grund könnte sein, dass die Zeit für den Integrationsschritt außerhalb des Intervalls liegt, für das du Daten hast. Beispiel:
Code:
y = interp1([1 2], [2, 3], 0, 'linear')

Vermeiden kann man das mit
Code:
y = interp1([1 2], [2, 3], 0, 'linear', 'extrap')

auch wenn ich mich frage, ob es sinnvoll ist, weit außerhalb des Intervalls zu extrapolieren.

Falls das nicht der Grund ist, versuche das mal unter Anwendung des Debuggers einzugrenzen.

Wenn es eine zyklische Anregung sein soll, könnte man evtl auch mit mod arbeiten statt den Vektor zu verlängern?

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