InformeTarea6. - U

Anuncio
Universidad de Chile
Facultad de Ciencias Físicas y Matemáticas
Departamento de Física
Métodos Numéricos para la Ciencia y la Ingeniería – FI3104-1
TAREA 6:
SIMULACIÓN DE UNA
GALAXIA
Estudiante: Sebastián Obando O.
Profesor de Cátedra: Rodrigo Soto B.
Profesor Auxiliar: Javier Baeza O.
Profesor Ayudante: Sebastián Manterola M.
Fecha de Entrega: Diciembre 2 de 2011
Esta tarea consiste en simular una galaxia de estrellas dadas sus
posiciones y velocidades iniciales. Se pretende observar cómo evoluciona el
sistema, graficando los momentos de inercia cada cierto intervalo de tiempo.
Para ello, se calcula la fuerza sobre cada estrella de la siguiente manera:
Se resuelve el movimiento de las N estrellas usando el método de Verlet:
En primera instancia, se programó la rutina en base a los siguientes datos:
N = 10^3 estrellas (usando archivo posvel1.dat);
M = 1/N;
G = 1;
ε = 0.1;
dt= 0.03;
T=1000;
A continuación, se adjunta el código en MATLAB correspondiente:
load posvel1.dat
%vector con posiciones coordenadas x, y, z respectivamente
x= posvel1(:,1);
y= posvel1(:,2);
z= posvel1(:,3);
%Matriz con posiciones para cada estrella en tiempo inicial
>> r= [x y z];
%vectores con velocidades coordenadas x, y, z respectivamente
vx= posvel1(:,4);
vy= posvel1(:,5);
vz= posvel1(:,6);
%Matriz con velocidades para cada estrella en tiempo inicial
>> v= [vx vy vz];
%Inicialización de variables relevantes
N=10^3;
eps= 0.1;
dt=0.03;
Fm= zeros(N,3);
I11=0; I12=0; I13=0;
I21=0; I22=0; I23=0;
I31=0; I32=0; I33=0;
%Ciclo temporal con paso dt=0.03 hasta T=1000 Contador n se calcula como el divisor del
cuociente entre T y dt ya da cuenta de la cantidad de repeticiones que debe hacer el ciclo.
for n= 1:1:33333
%Matriz Aceleración Fm (F/m) sobre cada estrella en t=0 (10^3 filas y 3 columnas)
for i=1:1:N
for k=1:1:N
if (i~=k)
Fm(i,:)= Fm(i,:)+ (-1/N)*(r(i,:)-r(k,:))/(((norm(r(i,:)-r(k,:),2))+eps*eps)^1.5);
end
end
end
%Método de Verlet
if (n==1)
rant= r - v*dt + dt*dt*Fm/2;
end
rfin= 2*r - rant + dt*dt*Fm;
%Construcción de matriz de inercia
if (n==1) | (rem(n,100)==0)
for j=1: 1: N
I11 = I11 + (1/N)*(rfin(j,2)^2 + rfin(j,3)^2);
I22 = I22 + (1/N)*(rfin(j,1)^2 + rfin(j,3)^2);
I33 = I33 + (1/N)*(rfin(j,1)^2 + rfin(j,2)^2);
I12 = I12 - (1/N)*rfin(j,1)*rfin(j,2); I21 = I12;
I13 = I13 - (1/N)*rfin(j,1)*rfin(j,3); I31 = I13;
I23 = I23 - (1/N)*rfin(j,2)*rfin(j,3); I32 = I23;
I= [I11 I12 I13; I21 I22 I23; I31 I32 I33];
vp= eig(I);
if (n==1)
lambda1(1)= vp(1);
lambda2(1)= vp(2);
lambda3(1)= vp(3);
else
lambda1((n/100) + 1)= vp(1);
lambda2((n/100) + 1)= vp(2);
lambda3((n/100) + 1)= vp(3);
end
end
end
rant=r;
r= rfin;
end
x= linspace(0.03,33300,334);
hold on
plot(x,lambda1)
plot(x,lambda2, 'g')
plot(x, lambda3, 'r' )
xlabel('Tiempo')
ylabel(‘Momentos de inercia')
title('Evolución momentos de inercia de galaxia de N=10^3 estrellas')
legend('I1','I2', 'I3')
Sin embargo, dado que la programación se hizo en Matlab y el número
de operaciones que se debe hacer es extremadamente grande, la ejecución de
la rutina tardaría demasiado tiempo. De esta manera, se modificó el tiempo
T de simulación a un valor de T=30 manteniendo el paso dt=0.03,
considerando (así como en el código original) el cálculo de los momentos de
inercia cada 100 puntos. El gráfico arrojado es el que sigue:
El gráfico muestra el resultado esperado: se parte con valores de
momentos de inercia bajos (no son nulos, considerar escala del eje vertical) y
de valores similares entre sí, lo que habla de una situación inicial cercana al
equilibrio (galaxia aproximadamente de forma esférica). A medida que avanza
el tiempo, estos valores comienzan a aumentar a distinta tasa, difiriendo
más y más en sus valores. Extrapolando, es posible decir que en el tiempo
T=1000, la situación estará caracterizado por valores altísimos y alejados
entre sí de los, lo que podría inferir una forma esférica o mucho más
compleja de la forma de la galaxia.
Si bien al reducir el tiempo de simulación, se obtuvo una aproximación
coherente de lo que sucede, lo ideal en estos casos es analizar el proceso con
un tiempo mayor. Esto no fue posible por el gran costo computacional de la
tarea y la falta de una herramienta más eficiente. En estos casos, claramente
se aprecian los beneficios de utilizar C como lenguaje de programación y el
paralelismo como herramienta de optimización de la ejecución. Por lo tanto,
se hace casi perentorio el uso de C para una ejecución más detallada y
eficiente de la tarea.
Descargar