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

ode45 rechnet sehr lang an Lösungsmatrix

 

jonas10030
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 20.10.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2018, 12:23     Titel: ode45 rechnet sehr lang an Lösungsmatrix
  Antworten mit Zitat      
Hallo,
ich habe ein Problem mit dem ode45 solver. Ich möchte ein DGL-System mit 10 DGL lösen. Problem ist, dass die Lösung (bis zu) mehrere Minuten dauern kann. Da ich das DGL-System für verschiedenen Startwerte (>300) oder verschiedene Faktoren lösen muss, muss ich die Rechenzeit unbedingt verringern.
Zum besseren Verständnis der Code:
Code:
 
%Startwerte für die Lösung des DGL-Systems
Startwerte = zeros(1,10);
Startwerte(1,1)= 1300;
Startwerte(1,3)= 50;
Startwerte(1,6)= 1500;

%Faktoren
k1=2;
k2= 610;
k3=750;
k4=1000;
k5=37;
k6=12;
k7=0.0002;
k8=0.01;
k9=47;

%Punkte (Zeitschritte)
t=0:1:360;

%DGL Solver
[t,X]=ode45(@(t,X)      [-k3*X(1)*X(3)-k1*X(1)+k2*X(2);...    
                                    k4*X(2)*X(3)+k1*X(1)-k2*X(2);...
                                   -k3*X(1)*X(3)-k4*X(2)*X(3)+k9*X(9);...
                                    k3*X(1)*X(3)-k5*X(4)*X(6)-k8*X(4);...
                                    k4*X(2)*X(3)-k6*X(5)*X(6)-k8*X(5);...
                                   -k5*X(4)*X(6)-k6*X(5)*X(6);...
                                    k5*X(4)*X(6);...
                                    k6*X(5)*X(6)-k7*X(8);...
                                    k5*X(4)*X(6)+ k6*X(5)*X(6)-k9*X(9);...
                                    k7*X(8)],t,Startwerte);
 


Ich denke es liegt daran, dass für manche Werte in der X Matrix Zahlen in der Größenordnung 1*10^-300 rauskommen. Kann man dem ode45 Solver mit odeset o.ä. vorgeben dass er ab einer bestimmten Grenze einfach auf 0 runden soll?
Die Dokumentation bei odeset ist für mich dahingehend nicht verständlich :/
Zum Beispiel dauert die Berechnung sehr sehr lang wenn man diese werte für die Faktoren einsetzt
Code:


%alternative Faktoren
k1=0.2;
k2= 190;
k3=2200;
k4=2200;
k5=36;
k6=200;
k7=0.0002;
k8=0.01;
k9=9;
 


Dankeschön für eure Hilfe!
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: 06.04.2018, 12:37     Titel:
  Antworten mit Zitat      
Hallo,

mal anderen Löser versuchen, z.B. ode23s

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2018, 12:47     Titel:
  Antworten mit Zitat      
Ich würde empfehlen die DGL in eine Funktion zu verpacken, das allein spart auf meinem Rechner bereits ca. die Hälfte der Rechenzeit ein. Die nächste Überlegung wäre dann den solver zu wechseln, evtl. reicht ein Solver niedrigerer Ordnung aus. Die Matlabhilfe kann dir dabei unter die Arme greifen: https://de.mathworks.com/help/matla.....choose-an-ode-solver.html
Ich habe in dem Beispiel ode23t genommen (aus dem einfachen Grund dass ich diesen solver in meinem aktuellen Projekt verwende), das spart sehr viel Zeit, aber schau dir lieber die Ergebnisse nochmal an und vergleiche mit ode45.

Code:
function [ Xpunkt ] = Fkn( t,X )
%UNTITLED3 Summary of this function goes here
%   Detailed explanation goes here
k1=2;
k2= 610;
k3=750;
k4=1000;
k5=37;
k6=12;
k7=0.0002;
k8=0.01;
k9=47;

Xpunkt=[-k3*X(1)*X(3)-k1*X(1)+k2*X(2);...    
                                    k4*X(2)*X(3)+k1*X(1)-k2*X(2);...
                                   -k3*X(1)*X(3)-k4*X(2)*X(3)+k9*X(9);...
                                    k3*X(1)*X(3)-k5*X(4)*X(6)-k8*X(4);...
                                    k4*X(2)*X(3)-k6*X(5)*X(6)-k8*X(5);...
                                   -k5*X(4)*X(6)-k6*X(5)*X(6);...
                                    k5*X(4)*X(6);...
                                    k6*X(5)*X(6)-k7*X(8);...
                                    k5*X(4)*X(6)+ k6*X(5)*X(6)-k9*X(9);...
                                    k7*X(8)];
end


Code:

tic

Startwerte = zeros(1,10);
Startwerte(1,1)= 1300;
Startwerte(1,3)= 50;
Startwerte(1,6)= 1500;

%Faktoren
k1=2;
k2= 610;
k3=750;
k4=1000;
k5=37;
k6=12;
k7=0.0002;
k8=0.01;
k9=47;

%Punkte (Zeitschritte)
t=[0 360];

%DGL Solver
[t,X]=ode23t(@fkn,t,Startwerte);
                               
toc
 


Edit: stelle grad fest dass ode23t für deine alternativen Faktoren streikt, dann muss doch der ode23s ran wie Harald gesagt hat. Smile
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.