Matlab - Movimiento browniano

   
Vista:

Movimiento browniano

Publicado por Samuel (3 intervenciones) el 17/12/2017 21:35:51
Buenas tardes:
Estoy realizando un script que simule un movimiento browniano de 500 particulas que sigan las ecuaciones que adjunto en el pdf que acompaña al script. El problema se van en línea hacia el infinito y no sé muy bien por qué, aunque creo que puede ser debido a que no defino bien los puntos. Además es la primera vez que creo animaciones en matlab y no se me está dando demasiado bien . Si pudieran decirme donde me equivoco y como subsanar el error me ayudarían mucho.
Muchas gracias de antemano y un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Daniel

Movimiento browniano

Publicado por Daniel (264 intervenciones) el 20/12/2017 16:04:41
Había varias detalles que faltaban te paso el código corregido...
Las lineas comentadas son para implementar las segunda parte del ejercicio

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
%Movimiento browniano de 500 partículas inicialmente
%situadas en el origen de coordenadas
 
clear; clc; shg; clf;
 
Npart=500; %Designa el número de partículas
P=800;     %Numero de pasos
% % Definicion del tamaño de la caja
% alto =10;
% ancho=20;
 
x=zeros(Npart,P+1);  % Coordenada x de cada paso (partiendo de x=0)
y=zeros(Npart,P+1);  % Coordenada y de cada paso (partiendo de y=0)
vx=zeros(Npart,P+1); % Coordenada vx de cada paso (partiendo de x=0)
vy=zeros(Npart,P+1); % Coordenada vy de cada paso (partiendo de y=0)
 
% % Distribucion uniforme (aleatoria) en la caja
% x(:,1)=ancho*rand(Npart,1)-ancho/2; % Coordenada x de cada paso (uniforme)
% y(:,1)=alto*rand(Npart,1)-alto/2;  % Coordenada y de cada paso (uniforme)
 
%Parámetros
mt=1;
mB=10;
vt=1;
 
%Desarrollo del movimiento
 
dt = 1; % s. Tiempo entre dos frames sucesivos del vídeo
 
tframes = 0:dt:(dt*P);
F(P+1) = struct('cdata',[],'colormap',[]);
 
for i=1:Npart
    for j=1:length(tframes)
        w=2*pi*rand;
        vx(i,j+1)=vx(i,j)+(mt./(mt+mB)).*((vt.*cos(w)-vx(i,j)).*(1-cos(w))+...
            (vt.*sin(w)-vy(i,j)).*sin(w));
        vy(i,j+1)=vy(i,j)+(mt./(mt+mB)).*((vt.*sin(w)-vy(i,j)).*(1-cos(w))-...
            (vt.*cos(w)-vx(i,j)).*sin(w));
        x(i,j+1)=x(i,j)+vx(i,j+1).*dt;
        y(i,j+1)=y(i,j)+vy(i,j+1).*dt;
%         %condicion de rebote en las paredes        
%         if abs(x(i,j+1))>ancho/2
%             vx(i,j+1)=-vx(i,j+1);
%             x(i,j+1)=x(i,j)+vx(i,j+1).*dt;
%         end
%         if abs(y(i,j+1))>alto/2
%             vy(i,j+1)=-vy(i,j+1);
%             y(i,j+1)=y(i,j)+vy(i,j+1).*dt;
%         end
 
    end
end
 
% muestra los datos calculados y obtiene los fotogramas
for j=1:length(tframes)
    plot(x(:,j),y(:,j),'.r','MarkerSize',8)
    title(['tiempo ' num2str(j) ' de ' num2str(length(tframes))])
    xlim([-15 15])
    ylim([-15 15])
    drawnow
    F(j)=getframe(gca);
end
% Reproducir pelicula
% movie(F)


Comentanos como te fue

Saludos

Daniel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

Movimiento browniano

Publicado por Samuel (3 intervenciones) el 24/12/2017 17:28:05
Genial, muchísimas gracias. Finalmente finalmente yo también pude corregir muchos de los fallos que tenía pero aún así tu codigo me ha sido de gran ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad