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

Implementierung Lösung DGL

 

Freddy2400
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 19.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2016, 15:29     Titel: Implementierung Lösung DGL
  Antworten mit Zitat      
Hallo!

Ich beschäftige mich seit längerem damit, die numerische Lösung eines DGL-Systems mit Euler-Verfahren in Matlab zu implementieren.
Das Euler-Verfahren ist dabei nicht das Problem, das habe ich mit anderen DGLs ohne Probleme implementieren können.
Hier der Link zu dem Artikel, in dem das DGL-System vorkommt:
http://www.math.utah.edu/~bresslof/publications/15-6.pdf
Es geht um die Gleichungen 17a, 17b, 18a und 18b.
In den Gleichungen 17a und 17b sind zwei Greens-Funktionen gegeben, die in das DGL-System eingehen, das durch 18a und 18b gegeben ist.
Ich benötige die Lösung U_E und U_I.

Hier mein Code:

Code:
lambda = implicitSolver(D,L);

for i = 1:1:ntimepoints
    UE(i) = 0;
    UI(i) = 0;
end



function y = G1(t,sigma)
    y = 0;
    for l=1:1:summands
        y = y + exp(-(D*lambda(l)+v^2/(4*D))*(t-sigma))*exp(v/(2*D)*L)*(sin(sqrt(lambda(l))*L)+2*D*sqrt(lambda(l))/v*cos(sqrt(lambda(l))*L))*2*D*sqrt(lambda(l))/v;
    end
end



F1 = @(t,sigma, UI) G1(t,sigma)*(IE - WI*(UI^4/(2^4+UI^4)));



function y = integralF1(t)
    y = 0;
    for n = 0:1:ntimepoints
        y = y + F1(t*tstepwidth,-n*tstepwidth,0)*tstepwidth;
    end
    for n=1:1:t
        y = y + F1(t*tstepwidth,n*tstepwidth,UI(n))*tstepwidth;
    end
end

F2 = @(t,sigma, UE) G1(t,sigma)*(WE*(UE^4/(2^4+UE^4)));

function y = integralF2(t)
    y = 0;
    for n = 0:1:ntimepoints
        y = y + F1(t*tstepwidth,-n*tstepwidth,0)*tstepwidth;
    end
    for n=1:1:t
        y = y + F2(t*tstepwidth,n*tstepwidth,UE(n))*tstepwidth;
    end
end

for tstep = 1:1:ntimepoints
    UE(tstep+1) = UE(tstep) + tstepwidth*(-UE(tstep) + v*KE*integralF1(tstep));
    UI(tstep+1) = UI(tstep) + tstepwidth*(-UI(tstep) + v*KI*integralF2(tstep));
    t(tstep+1) = t(tstep) + tstepwidth;
end


Es muss in jedem Zeitschritt eine numerische Integration durchgeführt werden, wodurch das ganze sehr lange dauert. Die Ergebnisse, die ich so erhalte, liegen allerdings weit entfernt von dem erwarteten Ergebnis.
Habt Ihr vllt. irgendwelche Fehler gefunden?

Viele Grüße,
Freddy240.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.06.2016, 14:30     Titel:
  Antworten mit Zitat      
Hallo,

Euler-Verfahren sind recht ineffizient.
Es ist durchaus möglich, dass du gar keinen Fehler gemacht hast, sondern dass die Schrittweite zu klein ist.

Meine Empfehlung wäre, ode45 und integral zu versuchen. Damit die Schrittweitensteuerung sinnvoll funktionieren kann, ist es wichtig, die Toleranz bei integral deutlich enger zu wählen als die von ode45.

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 19.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2016, 16:03     Titel:
  Antworten mit Zitat      
Hallo, Harald!

Vielen Dank für Deine Antwort.
Ich habe bereits versucht die Schrittweite kleiner zu machen, allerdings hatte dann Matlab damit ein Problem.
Ich denke aber eine Implementierung mit ode45 und integral wäre in der Tat zielführender.
Leider glaube ich aber, dass das nicht ohne Weiteres möglich ist, da die numerische Integration über die Funktion geht, die ich berechnen will.
Das bedeutet, dass ich keine explizite Funktion angeben kann. Ich kenne nur deren Werte an den entsprechenden Stützstellen.

Viele Grüße,
Freddy2400.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.06.2016, 16:25     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Das bedeutet, dass ich keine explizite Funktion angeben kann. Ich kenne nur deren Werte an den entsprechenden Stützstellen.

Dann trapz statt integral .

Es wird dann nichts bringen, ode45 sehr genau rechnen zu lassen, da der Integrationsfehler durch trapz zu groß sein wird.

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 19.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.06.2016, 16:52     Titel:
  Antworten mit Zitat      
Hallo, Harald!

Vielen Dank! Ich werde das gleich mal ausprobieren.

Viele Grüße,
Freddy2400.
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.