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

MATLAB Eindimensionale Fokker Planck Gleichung durch Finiite

 

Fettknobelchen85
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 27.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2011, 14:01     Titel: MATLAB Eindimensionale Fokker Planck Gleichung durch Finiite
  Antworten mit Zitat      
Hallo,

ich versuche gerade, eine eindimensionale Fokker.Planck Gleichung durch Finite Differenzen zu lösen. die Fokker-Planck Gleichung beschreibt die Ausbreitung der Dichte eines stochastischen Prozesses. ich muss eigentlich nur diese Gleichung durch Diskretisierung lösen. Zuerst in x-Richtung, danach in t-Richtung.

Als Randbedingung soll ich eine Dirichlet- Bedingung oder eine Robin Bedingung versuchen.

Als Anfangsbedingung zum Zeitpunkt t=0 soll eine Standardnormalverteilung zugrunde liegen.

Zusätzlich soll f natürlich eine Dichte sein und somit
 \int_0^\infty{f}=1 . Dazu weiß ich nicht, wie ich das MATLAB beibringe..


Hier ist mein Code


Ich hab bis jetzt folgendes versucht.

Code:
%Finite Differenzen zur Fokker- Planck Gleichung
%clear; clc;

%Initialisierung
nx=60;              %Anzahl der Gitterpunkte in x-Richtung.
nt=12;              %Anzahl der Gitterpunkte in t-Richtung.
T=1;                %Endzeitpunkt.
X= 10;              %Länge der x-Achse.
h=1/(nx-1);         %Schrittweite x-Richtung.
dt=T*h^2;           %Schrittweite t-Richtung.

sigma=0.12;

%Anfangsbedingung, f Vektor mit Standard-Normalverteilungen
x0=0;
st=1;
%x = [0:h:100]
for j=1:nx
f = ones(nx,1)         %*(1/sqrt(2*pi)*st)*exp(-0.5*((j*h-x0)/st)^2);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


% Differenzenapproximation. sowohl mu als auch f werden diskretisiert.
% Zuerst nach dem Ort, dann nach der Zeit.

t = 0;
%Versuch eines expliziten Verfahrens
for k=1:nt
    falt=f;
    t=t+dt;
    f(1)=0;
    mu(nx)=-0.015*(nx*h-2);
     f(nx)=0;
    for i=2:nx-1    %für jede Zeitscheibe, löse FKP nach f(i) unter f(i-1) zur Zeit t auf
        mu(i)=-0.015*(i*h-2);
        f(i)= falt(i) + dt*((1/2)*h*(-mu(i+1)*falt(i+1)-mu(i-1)*falt(i-1))+ 0.5*sigma^2*(falt(i+1)-2*falt(i)+falt(i-1))*(1/h^2))
    end
   
end
plot(f);
 


An der Steller %%%%%%%%%%%%%%%%%%%%%% weiß ich nicht, wie ich die Anfangsbedingung, dass f eine Funktion, also die Standardnormalverteilung von x ist, integrieren kann.ich muss sie ja auch, um die Diskretisierungsschleife durchzuführen, als (nx,1) Vektor definieren. Ich möchte, dass f0=(1/sqrt(2*pi)*1)*exp(-0.5*((x-0)/1)^2) ist und dann bei der Diskretisierung immer an den jeweiligen Stellen x=i*h ausgewertet wird..Leider kein Plan wie..

Ich weiß hier fehlt noch einiges, aber ich wäre echt sau dankbar, wenn mir jemand helfen könnte... Bin leider nen MATLAB Anfänger, wie ihr seht...

Zuletzt bearbeitet von Fettknobelchen85 am 27.11.2011, 14:55, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


Fettknobelchen85
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 27.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2011, 14:53     Titel:
  Antworten mit Zitat      
Hey! Ich habe noch eine zweite Möglichkeit problert, die etwas vielversprechender aussieht. Vielleicht wollt ihr euch das auch noch ansehen, die Probleme sind die gleichen...

Code:
%Neuer Versuch Finite Differenzen

%clear; clc;
X = 50;         %Länge in x Richtung          
T = 80;         %Endzeitpunkt
tx = 50;
dt = T/tx;
nx = 60;
sigma= 0.12;

h = X/nx;
b = dt/(h^2);
% % Stützstellen x=i*h
% for i=1:n-1
%     x(i)=(i+1)*h;
% end

%Anfangsbedingung

 u = ones(nx,1)%*(1/sqrt(2*pi))*exp(-0.5*((j*h))^2);


%Finite Differenzen mu=-0.015*x-2, sigma=0.12. Fokker Planck Gleichung
for k=1:tx
    for j=1:nx-1
        if j==1
             mu0 = -0.015*(0*h-2);
             u0 =(1/sqrt(2*pi))*exp(-0.5*((j*h))^2);
             u(j,k+1) = u(j,k) + dt*(((1/2)*h*(-mu(j+1)*u(j+1,k)-mu0*u0)+ 0.5*sigma^2*(u(j+1,k)-2*u(j,k)+u0)*(1/h^2)))
        else
           
        mu(j) = -0.015*(j*h-2);
        u(j,k+1) = u(j,k) + dt*(((1/2)*h*(-mu(j+1)*u(j+1,k)-mu(j-1)*u(j-1,k))+ 0.5*sigma^2*(u(j+1,k)-2*u(j,k)+u(j-1,k))*(1/h^2)))

    end
    mu(nx) = -0.015*(nx*h-2);
    end
end

%Randbedingungen

plot(u);





Wie gesagt, ich wäre unendlich dankbar, wenn sich das mal jemand ansehen könnte und mir tipps geben könnte, wie ich die Anfangs und Randbedingungen und, die integral über fkt =1 Bedingung einfüge. Hab das hier in der for schleife versucht über u0. hier hab ich es auch mit 2 input argumente der Fukntion, (die ich hier u genannt hab, damit ich nicht durcheinander komme mit den Programmen) versucht.

Soll insgesamt ein explizites Finite Differenzen Verfahren geben. Hier noch einmal die Ausgangsgleichung, eine eindimensionale parabolische partielle Differentialgleichung 2. Ordnung.
Das sigma sei konstant angenommen und mu eine lineare Funktion, hier -0.015*(x-2).

\frac{\partial f\left(t,x\right)}{\partial t}=-\frac{\partial}{\partial x}\left(\mu\left(t,x\right)f\left(t,x\right)\right)+\frac{1}{2}\frac{\partial^{2}}{\partial x^{2}}\left(\sigma^{2}\left(t,x\right)f\left(t,x\right)\right)
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2011, 19:29     Titel:
  Antworten mit Zitat      
Falls du die Pdgl nicht per hand lösen willst würde ich die Funktion pdepe empfehlen.

Da die dgl kein Quellterm hat sollte doch das integral über f konstant sein (falls die RB entsprechend gewählt sind). Diese Bedingung ist also automatisch erfüllt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Fettknobelchen85
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 27.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2011, 19:41     Titel:
  Antworten mit Zitat      
Danke für die Antwort. Mit PDEPE habe ich es auch schon versucht. Das Problem ist, dass ich aus der PDE ein System von ODEs erstellen muss. Dazu diskretisiere ich das von Hand.
Also ich muss es leider so machen... Aus den Daten, die ich dabei erzeuge will ich nachher rückwärts die Parameter der Funktion mu schätzen...

Im Code fehlt übrigens noch mu=zeros(nx,1);

Das das Integral konstant bleibt dachte ich mir auch schon, dazu muss ich aber die Anfangbedingung integrieren. Also das

u0= (1/sqrt(2*pi)*st)*exp(-0.5*((x-x0)/st)^2)

das ist in der schleife glaub ich noch falsch.. Wie bekomme ich das denn hin, dass ich dort ein x verwenden kann? ich muss MATLAB doch sagen, dass dieses x an den Diskretisierungsstellen ausgewertet werden soll...

Wie ich die Randbedingungen nun aufstelle, weiß ich leider auch noch nicht... Es würde schon eine einfache Dirichlet Bedingung reichen..

Nochmals danke für die Antwort...
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2011, 07:10     Titel:
  Antworten mit Zitat      
Code:

X = 50;         %Länge in x Richtung          
T = 80;         %Endzeitpunkt
nt = 50;
nx = 150;
dt = T/nt;
h = X/nx;


b = dt/(h^2);
% Stützstellen x=i*h
xs = linspace(0,X,nx);

%Anfangsbedingung
sigma0= 1;
mu0 = X/2;
u = 1/(sigma0*sqrt(2*pi))*exp(-0.5*((xs-mu0)/sigma0).^2);
integral = sum(u)*h;
plot(u)

% dgl
mu = -0.015*xs - 2;
sigma = 0.12;

f = u;


for k = 1:nt
    df = -gradient(mu.*f,h)+0.5*gradient(gradient(sigma^2*f,h),h);
    f = f + df/dt;
    integral = sum(f)*h
    plot(f);
    pause(0.1);
end
 



hier mal ein paar verbesserungen. funktioniert aber noch nicht ganz.
Um die Anfangsbedingungen zu implementieren brauchst du keine Schleife, da man in Matlab sehr elegant mit Matrizen rechnen kann.
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.