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.