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

ode113

 

dero1690
Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 03.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2013, 13:52     Titel: ode113
  Antworten mit Zitat      
Hallo Leute !

Verzweifelt versuche ich folgendes Problem zu lösen:

Ich habe eine Aufgabenstellung, die von 2 DGLs beschrieben wird. ( wenn die Lösung der einen DGL null wird, dann , wird auf die andere DGL umgeschaltet und umgekehrt )

Dieses Umschalten kriege ich mit der "Events"-Funktion hin, denke ich.

Ich bekomme auch eine Lösung, die ich plotten kann.
Allerdings bekomme ich nach dem Ende des Rechenvorgangs folgende fehlermeldung:

Zitat:
When the first argument to ode113 is a function handle, the tspan and y0 arguments must be
supplied.

Error in ode113 (line 114)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

Error in oneblock (line 37)
[t y te ye yi]=ode113(@ode_oneblock_case_2,[t0 tmax],y0,options,p);




hier die hoffentlich relevanten Code-Teile:

Code:


[t y te ye]=ode113(@ode_oneblock__case_1,[t0 tmax],y0,options,p);
y0=ye
t0=te

[t y te ye yi]=ode113(@ode_oneblock_case_2,[t0 tmax],y0,options,p);
y0=ye
t0=te

 


warum kommt Matlab mit der Fehlermeldung, dass ich die Zeitspanne und die Anfangsbedingungen angeben muss, denn die sind doch angegeben ?! (mit t0, tmax, y0)

Ich schätze, der Fehler taucht auf, wenn zur 2. DGL gewechselt wird, doch dafür habe ich doch die notwendigen Parameter auch nach der 1. DGL initilisiert .....

Wie gesagt, ich bekomme ja trotzdem eine Lösung, allerdings eine Lösung mit Fehlermeldung ist nicht, dass , was man unbedingt will...

Hat jemand eine Idee, woran es liegen könnte ?

Vielen Dank !

Gruß,
Denys
Private Nachricht senden Benutzer-Profile anzeigen


MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 28.02.2013, 14:31     Titel:
  Antworten mit Zitat      
Hallo,

musst du nicht den jeweiligen Zustand als Anfangsbedingung an den jeweils anderen Solver übergeben?

Der eine macht also da weiter, wo der andere aufgehört hat...

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
dero1690
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 03.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2013, 15:10     Titel:
  Antworten mit Zitat      
Hallo !
Danke schon mal für eine Rückmeldung Smile

dadurch, dass ich doch y0= ye und to=te nach dem ersten solver setze wird doch der letzte erreichte Zustand an den nächsten Solver übergeben..oder nicht ?
So weiß ihc nicht, warum denn beim 2. Solver die fehlermeldung erscheint, dass ich tspan und y0 angeben muss...
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 28.02.2013, 15:23     Titel:
  Antworten mit Zitat      
OK, aber so wie oben sieht der Code doch nicht aus?! Da muss doch irgendwo die Abfrage auf 0 und die entsprechende Verzweigung auftauchen.

Wenn möglich, gib bitte den gesamten relevanten Code an.
Private Nachricht senden Benutzer-Profile anzeigen
 
dero1690
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 03.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2013, 15:36     Titel:
  Antworten mit Zitat      
ne , klar der gesamte Code ist schon anders ( auch wenn sicherlich stark verbesserungswürdig ):

Code:
function []=oneblock(p,tmax,inc);

global Is m R g alpha

t0=0;
y0=inc;

options=odeset('RelTol',1e-6,'Events',@events);
while t0<=tmax,


[t1 y1 te1 ye1]=ode113(@ode_oneblock__case_1,[t0 tmax],y0,options,p);
y0=ye1;
t0=te1;
subplot(1,3,1);
hold on;
plot(t1,y1);
title('solution');
xlabel('time');
ylabel('angle/angular velocity');
legend('theta','thetaprime');
subplot(1,3,2);
hold on;
plot(y1(:,1),y1(:,2));
title('phase-plane');
xlabel('angle');
ylabel('angular velocity');
subplot(1,3,3);
hold on;
e=0.5*(Is+m*R^2)*y1(:,2).^2+m*g*R*cos(alpha-y1(:,1));
plot(t1,e);
xlabel('time');
ylabel('total energy');
title('total energy');


[t2 y2 te2 ye2]=ode113(@ode_oneblock_case_2,[t0 tmax],y0,options,p);
y0=ye2;
t0=te2;
subplot(1,3,1);
hold on;
plot(t2,y2);
title('solution');
xlabel('time');
ylabel('angle/angular velocity');
legend('theta','thetaprime');
subplot(1,3,2);
hold on;
plot(y2(:,1),y2(:,2));
title('phase-plane');
xlabel('angle');
ylabel('angular velocity');
subplot(1,3,3);
hold on;
e=0.5*(Is+m*R^2)*y2(:,2).^2+m*g*R*cos(alpha+y2(:,1));
plot(t2,e);
ylim([-10*e(1,:) 10*e(1,:)]);
xlabel('time');
ylabel('total energy');
title('total energy');


end


function dy=ode_oneblock__case_1(t,y,p);

global w
w=p(1);
global h
h=p(2);
global l
l=(3);
global rho
rho =p(4);
global m
m=l*w*h*rho;
global g
g=9.81;
global R
R=((h^2)/4+(w^2)/4)^(1/2);
global alpha
alpha=acos(0.5*h/R);
global Is
Is=m/12*(h^2+w*2);

dy=zeros(2,1);

theta=y(1);
thetap=y(2);

dy(1)=thetap;
dy(2)=-(m*g*R*sin(alpha-theta))/(Is+m*R^2);

function dy=ode_oneblock_case_2(t,y,p);

global Is m R g alpha

dy=zeros(2,1);

theta=y(1);
thetap=y(2);

dy(1)=thetap;
dy(2)=(m*g*R*sin(alpha+theta))/(Is+m*R^2);

function [value,isterminal,direction] = events(t,y,p)
value = y(1);
isterminal = 1;
direction = 0;




 
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 28.02.2013, 16:04     Titel:
  Antworten mit Zitat      
Da du keinerlei Kommentierung hast, könntest du was zur Struktur sagen?
Private Nachricht senden Benutzer-Profile anzeigen
 
dero1690
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 03.02.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2013, 18:08     Titel:
  Antworten mit Zitat      
Sorry...jetzt habe ich den Code kommentiert:


Code:
function []=oneblock(p,tmax,inc);%Aufnahme der Anfangsbedingungen ( inc ), oberen Zeitschranke ( tmax ) und zusätzlicher Parameter für die DGL (p).

global Is m R g alpha % globale Variablen

t0=0;% untere Zeitschranke
y0=inc;% y0=Anfangsbedingungen
options=odeset('RelTol',1e-6,'Events',@events);% Optionen für den solver, insbesondere die Übergabe der Eventfunktion

while t0<=tmax,  % Starten der schleife


[t1 y1 te1 ye1]=ode113(@ode_oneblock__case_1,[t0 tmax],y0,options,p); % Lösen der 1. DGL , bis y null wird
y0=ye1;% Werte von y und y_punkt sind die neuen Startbedingungen
t0=te1;% Zeit, wo y null wird, ist die neue untere Zeitschranke
subplot(1,3,1); % PLotten der Ergebnisse
hold on;
plot(t1,y1);
title('solution');
xlabel('time');
ylabel('angle/angular velocity');
legend('theta','thetaprime');
subplot(1,3,2);
hold on;
plot(y1(:,1),y1(:,2));
title('phase-plane');
xlabel('angle');
ylabel('angular velocity');
subplot(1,3,3);
hold on;
e=0.5*(Is+m*R^2)*y1(:,2).^2+m*g*R*cos(alpha-y1(:,1));
plot(t1,e);
xlabel('time');
ylabel('total energy');
title('total energy');


[t2 y2 te2 ye2]=ode113(@ode_oneblock_case_2,[t0 tmax],y0,options,p); % Lösen der 2. DGL mit neuen Startbedingunen
y0=ye2;% Werte von y und y_punkt sind die neuen Startbedingungen
t0=te2;% Zeit, wo y null wird, ist die neue untere Zeitschranke
subplot(1,3,1);%Plotten der Ergebnisse
hold on;
plot(t2,y2);
title('solution');
xlabel('time');
ylabel('angle/angular velocity');
legend('theta','thetaprime');
subplot(1,3,2);
hold on;
plot(y2(:,1),y2(:,2));
title('phase-plane');
xlabel('angle');
ylabel('angular velocity');
subplot(1,3,3);
hold on;
e=0.5*(Is+m*R^2)*y2(:,2).^2+m*g*R*cos(alpha+y2(:,1));
plot(t2,e);
ylim([-10*e(1,:) 10*e(1,:)]);
xlabel('time');
ylabel('total energy');
title('total energy');

%Jetzt sollte die Schleife wieder von vorne beginnen,
%das heißt die erste DGL wird mit den neuen Startbedingungen gelöst und
%neue Werte werden den Plots hinzugefügt

end


function [value,isterminal,direction] = events(t,y,p)%Definition des Events, d.h. wenn y ==0, wird die Integration gestoppt
value = y(1);
isterminal = 1;
direction = 0;


function dy=ode_oneblock__case_1(t,y,p); %Definition der 1. DGL , als Parameter wird, Zeit, y und zusätzloche Parameter (Konstanten)übergeben

global w
w=p(1);
global h
h=p(2);
global l
l=(3);
global rho
rho =p(4);
global m
m=l*w*h*rho;
global g
g=9.81;
global R
R=((h^2)/4+(w^2)/4)^(1/2);
global alpha
alpha=acos(0.5*h/R);
global Is
Is=m/12*(h^2+w*2);

dy=zeros(2,1);

theta=y(1);
thetap=y(2);

dy(1)=thetap;
dy(2)=-(m*g*R*sin(alpha-theta))/(Is+m*R^2);


function dy=ode_oneblock_case_2(t,y,p);% Definition der 2. DGL , an sich wie 1. DGL

global Is m R g alpha

dy=zeros(2,1);

theta=y(1);
thetap=y(2);

dy(1)=thetap;
dy(2)=(m*g*R*sin(alpha+theta))/(Is+m*R^2);







 
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.