El examen de prácticas consistirá en desarrollar el siguiente programa y hacer sobre él las modificaciones que los profesores estimen oportunas.
Sigo sin tener ni idea de programar en C, así que he intentado escribir algo como buenamente he podido. Escribo esto aquí porque no quiero tener esta asignatura de mierda el año que viene y para eso necesito que alguien me ayude, por favor :3
Veamos el enunciado:
Una partícula de masa 1 kg se mueve en el plano xy sometida a una fuerza dada por: F = - m*(ω_1^2*x*i + ω_2^2*y*j), (ω_1, ω_2 > 0). En el instante inicial, t = 0, la partícula se lanza desde la posición (x_0, y_0) con una velocidad inicial (v_x0, v_y0). Los datos del programa, que hay que introducir por teclado cada vez que se ejecuta son ω_1, ω_2 y la posición y velocidad iniciales (x_0, y_0), (v_x0, v_y0) (en m y m/s, respectivamente).
El programa debe (en el orden apropiado):
· Calcular, usando el algoritmo de LEAP-FROG, la posición (x,y) de la partícula en los instantes t = 0, 2dt, 4dt, 6dt, etc... hasta un tiempo máximo t_max, dado por teclado. dt es un pequeño intervalo fijo de tiempo que se dará por teclado (cuanto menor es dt más preciso y largo es el cálculo, en cualquier caso para que el algoritmo dé una solución correcta debe ser dt << 1/ω_1, 1/ω_2).
· Calcular la velocidad (v_x,v_y) de la partícula en los instantes t = dt, 3dt, 5dt, 7dt, etc... hasta el mismo tiempo máximo. Usar un algoritmo razonable para calcular la primera velocidad en el instante t = dt, ya que la velocidad inicial que se da es para t = 0.
· Escribir los resultados en un fichero de texto con 5 columnas que contengan los valores de t, x , y, v_x, v_y.
· Representar en pantalla x e y (en un sólo gráfico) en función de t con WGNUPLOT.
Definir de tipo DOUBLE todas las variables y constantes reales del programa.
Nota: el problema admite una solución analítica exacta pero se exigirá que el algoritmo empleado sea precisamente el de LEAP-FROG.
Seguro que, sepáis programación o no, habréis pensado "WTF?". Voy a explicar un poco la física del enunciado, que realmente eso lo tengo que saber yo.
La fuerza F = - m*(ω_1^2*x*i + ω_2^2*y*j) es un vector con dos componentes (en la dirección i y en la dirección j). Podríamos interpretarlo como un array bidimiensional, pero para lo que nos pide el problema (calcular las componentes x e y de la velocidad), podemos descomponer F = F_x*i + F_y*j y así podemos usar F_x y F_y independientemente (ahorrándonos bastante engorro).
El algoritmo de Leap-Frog es algo que nunca he entendido muy bien, pero he copiado literalmente en mi código fuente lo que sale en mis apuntes para un problema unidimensional. La cuestión sería hacerlo con la componente x y la componente y a la vez.
GNUPLOT es un programa que usamos para representar gráficas. Dudo mucho que alguien de por aquí sepa usarlo, pero no es eso lo que me preocupa. El programa puede funcionar perfectamente sin esa parte y buscarme luego yo la vida una vez tenga el resto (porque para ver si lo estoy usando bien necesito que el programa funcione).
Ahora bien, el código que tengo yo es:
Code: Select all
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
FILE *finput;
main()
{
/* Definición de variables */
double x,y; /* Posición */
double x_0,y_0; /* Posición inicial */
double t,dt,t_max; /* Tiempo */
double om_1,om_2; /* Frecuencia angular */
double v_x,v_y; /* Velocidad */
double v_x0,v_y0; /* Velocidad inicial */
double dv_x,dv_y; /* Diferencial de v */
double m=1; /* Masa */
double f_x,f_y; /* Fuerza */
double F_x,F_y;
double i;
/* Introducción por teclado */
printf("Introduzca la frecuencia angular en el eje x:\n om_1 = ");
scanf("%lf",&om_1);
printf("Introduzca la frecuencia angular en el eje y:\n om_2 = ");
scanf("%lf",&om_2);
printf("Introduzca la posici\xA2n inicial en el eje x:\n x_0 = ");
scanf("%lf",&x_0);
printf("Introduzca la posici\xA2n inicial en el eje y:\n y_0 = ");
scanf("%lf",&y_0);
printf("Introduzca la velocidad inicial en el eje x:\n v_x0 = ");
scanf("%lf",&v_x0);
printf("Introduzca la velocidad inicial en el eje y:\n v_y0 = ");
scanf("%lf",&v_y0);
printf("Introduzca el tiempo m\xA0ximo:\n t_max = ");
scanf("%lf",&t_max);
printf("Introduzca el diferencial de tiempo:\n dt = ");
scanf("%lf",&dt);
if(dt>=1/om_1 & dt>1/om_2){
printf("Introduzca un diferencial de tiempo menor:\n dt = ");
scanf("%lf",&dt);
/* Datos en fichero */
finput=fopen("datos.dat","w");
/* Inicialización de variables */
x=x_0;
y=y_0;
v_x=v_x0;
v_y=v_y0;
f_x=(-m)*x*om_1*om_1;
f_y=(-m)*y*om_2*om_2;
t=0;
dv_x=f_x*dt/m;
dv_y=f_y*dt/m;
fprintf(finput,"t\t,x\t,y\t,v_x\t,v_y\t");
/*Leapfrog*/
for(i=0;i<=t_max;i=t+dt)
{
x=x+dt*v_x;
y=y+dt*v_y;
F_x=f_x;
F_y=f_y;
t=t+dt;
dv_x+=f_x*dt/m;
dv_y+=f_y*dt/m;
v_x=v_x+dv_x;
v_y+=dv_y;
t=t+dt;
fprintf(finput,"%d\t,%d\t,%d\t,%d\t,%d\t\n",t,x,y,v_x,v_y);
}
fclose(finput);
}
else
{
finput=fopen("datos.dat","w");
x=x_0;
y=y_0;
v_x=v_x0;
v_y=v_y0;
f_x=(-m)*x*om_1*om_1;
f_y=(-m)*y*om_2*om_2;
t=0;
fprintf(finput,"t\t,x\t,y\t,v_x\t,v_y\t\n");
while(t<=t_max)
{
x=x+dt*v_x;
y=y+dt*v_y;
dv_x+=(f_x*dt)/m;
dv_y+=(f_y*dt)/m;
v_x=v_x+dv_x;
v_y+=dv_y;
fprintf(finput,"%d\t,%d\t,%d\t,%d\t,%d\t\n",t,x,y,v_x,v_y);
t=t+dt;
}
fclose(finput);
}
}
Que es lo mismo que no tener nada, pero vamos.
A ver si alguien me puede ayudar, aunque no sea con todo el programa. Muchísimas gracias.












