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

Abbruch von ode45 bei bestimmtem Ereignis

 

matlab_dummy

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2010, 13:27     Titel: Abbruch von ode45 bei bestimmtem Ereignis
  Antworten mit Zitat      
Hallo Leute,

wir wollen mit der Funktion ode45 die Umlaufzeit des Merkur um die Sonne berechnen und die Keplerellipse zeichnen. Wie kann man ode45 dazu bringen, die Rechnung abzubrechen wenn der Impuls 0 wird (Bedingung für einen Umlauf, also Abstand minimal) und die Zeit auszugeben.

Der Code sieht wie folgt aus:

Code:
clear all

%Konstanten===========================================

M       = 1.99*10.^(30);
m       = 3.3*10.^(23);
G       = 6.67*10.^(-11);
c       = 3*10.^8;
a       = 57.909*10.^9;
epsilon = 0.2056;
mu      = G*M;
beta    = G*M/(c.^2);


%Startwerte============================================

t0      = 0;             % Startwert f"ur die Zeit
y0      = [a*(1-epsilon) 0 0 m*(sqrt(G*M*a*...
           (1-epsilon.^2)))];     % Startwert f"ur y0
tfinal  = 7800000;
tspan   = [t0 tfinal];
alpha   = 0;

opt = odeset('RelTol',1e-10,'Events',y(2)==0);

[t,y,te] = ode45(@(t,y) merkur(t,y,m,mu,alpha,beta),tspan,y0,opt);



z(:,1)=y(:,1).*cos(y(:,3));
z(:,2)=y(:,1).*sin(y(:,3));

plot(z(:,1),z(:,2),'k');    % Plot 1 für r=0.2


und die Funktion merkur ist wie folgt definiert:

Code:
function yprime = merkur(t,y,m,mu,alpha,beta)
% Funktion mit rechter Seite der DGL Merkur-Sonne-BG
yprime = [y(2)./m ;(y(4)^2/(m*y(1).^3))-(mu*m./y(1).^2)-...
    (3*alpha*beta*y(4)^2./(m*y(1)^4)) ;(y(4)./(m*y(1).^2))-...
    (2*alpha*beta*y(4)./(m*y(1).^3)) ;0];

end


Die Zeit liegt in dem angegebenen Intervall.

Vielen Dank im Vorraus...


matlab_dummy

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2010, 13:32     Titel: edit
  Antworten mit Zitat      
Das mit dem ('Events',...) war nur ein Test der aber nicht funktioniert. Diesen Teil also bitte noch aus dem odeset entfernen!
 
Harald
Forum-Meister

Forum-Meister


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

lies dir doch mal den entsprechenden Abschnitt in der Doku von odeset durch.

Events muss ein Function Handle auf eine Funktion folgender Form sein:
Code:
[value,isterminal,direction] = events(t,y)

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2010, 13:57     Titel:
  Antworten mit Zitat      
Okay jetzt habe ich es tatsächlich rausgekriegt Wink Code sieht so aus:


Code:
clear all

%Konstanten===========================================

M       = 1.99*10.^(30);
m       = 3.3*10.^(23);
G       = 6.67*10.^(-11);
c       = 3*10.^8;
a       = 57.909*10.^9;
epsilon = 0.2056;
mu      = G*M;
beta    = G*M/(c.^2);


%Startwerte============================================

t0      = 0;             % Startwert f"ur die Zeit
y0      = [a*(1-epsilon) 0 0 m*(sqrt(G*M*a*...
           (1-epsilon.^2)))];     % Startwert f"ur y0
tfinal  = 7800000;
tspan   = [t0 tfinal];
alpha   = 0;

opt = odeset('RelTol',1e-10,'Events',@Ereignis);

[t,y,te] = ode45(@(t,y) merkur(t,y,m,mu,alpha,beta),tspan,y0,opt);

te


mit der Funktion Ereignis:

Code:
function [value,isterminal,direction] = Ereignis(t,y)
% Locate the time when height passes through zero in a
% decreasing direction and stop integration.
value = y(2);     % Detect height = 0
isterminal = 1;   % Stop the integration
direction = 1;   % Negative direction only
end


Besten Dank...
 
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.