Esempio n. 1
0
void rungerKuttaMagnetico(float *x, float *y, float *z, float *velI, float *t, int n_points, float energia, float alpha,float gamma) {
    int i,j;
    float paso;
    paso=2*pi*gamma*masa/(50.0*e*b0);
    float *velActual;

    velActual = crear_matriz(3,1);
    velActual[0] = velI[0];
    velActual[1] = velI[1];
    velActual[2] = velI[2];

    for(i=0; i<n_points; i++) {
        int k;
        k=i+1;
        float *posActual;
        posActual = crear_matriz(3,1);
        posActual[0] = x[i];
        posActual[1] = y[i];
        posActual[2] = z[i];
        float *temp;
        temp = pasoRungerKutta4(paso, posActual,velActual,gamma);
        x[k] = temp[0];
        y[k] = temp[1];
        z[k] = temp[2];
        for(j=0; j<3; j++) {
            velActual[j]=temp[j+3];
        }
    }
    escribirArreglos(t,x,y,z,n_points,energia,alpha);
}
///////////////////////////////MAIN///////////////////////7/////////////77777
int main(int argc, char **argv){
	
	FILE *in;
	int filas;
	int filas2;
	int columnas=3;
	int columnas2=3;
	char *filename=argv[1];
	char *filename2=argv[2];
	float *vector_datos;
	float *vector_datos2;
	float *vector_x;
	
	
	if(argc!=2){
   	 	printf("USAGE: %s\n", USAGE);
   	 	exit(1);
  	}



	load_file(filename);
	
	filas=contar_filas(filename,0);
	
	gsl_matrix *transpuesta = gsl_matrix_alloc (columnas, filas);
	gsl_matrix *matriz = gsl_matrix_alloc (filas, columnas);
	gsl_matrix *multiplicacion = gsl_matrix_alloc (filas, filas);
	gsl_matrix *vector = gsl_matrix_alloc (filas, 1);
	gsl_matrix *inversa = gsl_matrix_alloc (filas, filas);
	gsl_matrix *multiplicacion2 = gsl_matrix_alloc (columnas, 1);
	gsl_matrix *multiplicacion3 = gsl_matrix_alloc (columnas, 1);



	vector_datos=malloc(2*filas*sizeof(float));
	
	guardar_datos(vector_datos,filename,filas);

	crear_matriz(matriz,vector_datos,filas,columnas,0);
	
	crear_matriz(vector,vector_datos,filas,1,1);
	
	transpuesta=transpose(matriz,columnas,filas);
	
	
	multiplicacion=multiply(transpuesta,matriz,columnas,columnas);
	
	inversa=inverse(multiplicacion,columnas);
	
	multiplicacion2=multiply(transpuesta,vector,columnas,1);
	
	multiplicacion3=multiply(inversa,multiplicacion2,columnas,1);

	crearArchivo(multiplicacion3);


}
Esempio n. 3
0
void dif_divididas(double *m,double *r,int n, double d, double *yint, double *ea)
{
    double **fdd,xterm,yint2;
    int order,i,j;
    fdd=crear_matriz(n,n);
    for(i=0;i<n;i++)
        {
         fdd[i][0]=r[i];
        }
    for(j=1;j<n;j++)
    {
        for(i=0;i<n-j;i++)
        {
            fdd[i][j]=(fdd[i+1][j-1]-fdd[i][j-1])/(m[i+j]-m[i]);
        }
    }
    xterm=1;
    yint[0]=fdd[0][0];
    for(order=1;order<=n;order++)
    {
        xterm=xterm*(d-m[order-1]);
        yint2=yint[order-1]+(fdd[0][order]*xterm);
        ea[order-1]=yint2-yint[order-1];
        yint[order]=yint2;
    }
}
Esempio n. 4
0
//Metodo que me da el arreglo de las posiciones iniciales
float *posicionesIniciales() {
    float *posiciones;
    posiciones = crear_matriz(3,1);
    posiciones[0] = 2.0*rT;
    posiciones[1] = 0.0;
    posiciones[2] = 0.0;
    return posiciones;
}
int main(int argc, char **argv){
	
	FILE *in;
	int filas;
	int filas2;

	int columnas2=3;
	char *filename2=argv[1];
	float *vector_datos;
	float *vector_datos2;
	float *vector_x;
	float norm1=0;
	float norm2=0;
	float norm3=0;
	
	
	if(argc!=2){
   	 	printf("USAGE: %s\n", USAGE);
   	 	exit(1);
  	}



	load_file(filename2);

	filas2=contar_filas(filename2,0);
	
	vector_datos2=malloc(3*filas2*sizeof(float));
	
	guardar_datos2(vector_datos2,filename2,filas2);


	gsl_matrix *matriz2 = gsl_matrix_alloc (filas2, columnas2);
	gsl_matrix *covarianza = gsl_matrix_alloc (columnas2, columnas2);
	gsl_vector *eigenvals= gsl_vector_alloc(columnas2);
	gsl_matrix *eigenvecs= gsl_matrix_alloc(columnas2, columnas2);
	gsl_matrix *transpuesta2 = gsl_matrix_alloc (columnas2, filas2);
	

	crear_matriz(matriz2,vector_datos2,filas2,columnas2,2);
	
	covarianza = cov_calculate2(matriz2);

	find_eigens2(covarianza, eigenvals, eigenvecs);   
	
	norm1=calcular_norma(eigenvecs,0); 
	norm2=calcular_norma(eigenvecs,1); 
	norm3=calcular_norma(eigenvecs,2);
	
	
	crearArchivo2(eigenvecs,norm1,norm2,norm3);
	

	
}
Esempio n. 6
0
//Devuelve el vector de velocidadesInicialese la velocidad de acuerdo a la energia cinetica entrada por parametro
float *velocidadesIniciales(float energia, float alpha) {
    float *velocidades;
    float  magnitud;

    magnitud = magnitudVelocidadInicial(energia);
    velocidades = crear_matriz(3,1);
    velocidades[0]=0.0;
    velocidades[1]=magnitud*sin(alpha);
    velocidades[2]=magnitud*cos(alpha);
    return velocidades;
}
Esempio n. 7
0
//Funcion que calcula las aceleraciones del sistema en el tiempo t dadas las posiciones y las velocidades en el mismo tiempo t
//Esta es la funcion que realiza el analisis matricial.
float *calcularAceleraciones(float *pos,float *vel,float gamma) {
    float Constante,r,ax,ay,az;
    float *acc=crear_matriz(3,1);

    r=magnitudVector(pos,3);
    Constante=-(b0*rT*rT*rT*e)/(gamma*masa);
    ax = Constante*((2.0*pos[2]*pos[2]-pos[0]*pos[0]-pos[1]*pos[1])*vel[1]-(3.0*pos[1]*pos[2])*vel[2])/(pow(r,5));
    ay = Constante*((3.0*pos[0]*pos[2])*vel[2]-(2.0*pos[2]*pos[2]-pos[0]*pos[0]-pos[1]*pos[1])*vel[0])/(pow(r,5));
    az = Constante*((3.0*pos[1]*pos[2])*vel[0]-(3.0*pos[0]*pos[2])*vel[1])/(pow(r,5));

    acc[0]=ax;
    acc[1]=ay;
    acc[2]=az;

    return acc;
}
Esempio n. 8
0
float *pasoRungerKutta4(float paso,float *posiciones, float *velocidades, float gamma) {

    float k1,k2,k3,k4,kF; //Para x
    float kv1,kv2,kv3,kv4,kvF; //Para vx
    float ka1,ka2,ka3,ka4; //Para ax
    float m1,m2,m3,m4,mF; //Para y
    float mv1,mv2,mv3,mv4,mvF; //Para vy
    float ma1,ma2,ma3,ma4; //Para ay
    float n1,n2,n3,n4,nF; //Para z
    float nv1,nv2,nv3,nv4,nvF; //Para vz
    float na1,na2,na3,na4; //Para az
    float *pos2,*pos3,*pos4,*posF;
    float *vel2,*vel3,*vel4,*velF;
    float *acc1,*acc2,*acc3,*acc4,*retorno;
    int i,j;
    //Primero - Comienzo Intervalo
    k1 = posiciones[0];
    m1 = posiciones[1];
    n1 = posiciones[2];
    kv1 = velocidades[0];
    mv1 = velocidades[1];
    nv1 = velocidades[2];
    acc1 = calcularAceleraciones(posiciones,velocidades,gamma);
    ka1 = acc1[0];
    ma1 = acc1[1];
    na1 = acc1[2];
    //Segundo - Mitad Intervalo
    k2 = posiciones[0]+paso*0.5*kv1;
    m2 = posiciones[1]+paso*0.5*mv1;
    n2 = posiciones[2]+paso*0.5*nv1;
    kv2 = velocidades[0]+paso*0.5*ka1;
    mv2 = velocidades[1]+paso*0.5*ma1;
    nv2 = velocidades[2]+paso*0.5*na1;
    pos2 = crear_matriz(3,1);
    vel2 = crear_matriz(3,1);
    pos2[0] = k2;
    pos2[1] = m2;
    pos2[2] = n2;
    vel2[0] = kv2;
    vel2[1] = mv2;
    vel2[2] = nv2;
    acc2 = calcularAceleraciones(pos2,vel2,gamma);
    ka2 = acc2[0];
    ma2 = acc2[1];
    na2 = acc2[2];
    //Tercero - Mitad Intervalo
    k3 = posiciones[0]+paso*0.5*kv2;
    m3 = posiciones[1]+paso*0.5*mv2;
    n3 = posiciones[2]+paso*0.5*nv2;
    kv3 = velocidades[0]+paso*0.5*ka2;
    mv3 = velocidades[1]+paso*0.5*ma2;
    nv3 = velocidades[2]+paso*0.5*na2;
    pos3 = crear_matriz(3,1);
    vel3 = crear_matriz(3,1);
    pos3[0] = k3;
    pos3[1] = m3;
    pos3[2] = n3;
    vel3[0] = kv3;
    vel3[1] = mv3;
    vel3[2] = nv3;
    acc3 = calcularAceleraciones(pos3,vel3,gamma);
    ka3 = acc3[0];
    ma3 = acc3[1];
    na3 = acc3[2];
    //Cuarto - Final Intervalo
    k4 = posiciones[0]+paso*kv3;
    m4 = posiciones[1]+paso*mv3;
    n4 = posiciones[2]+paso*nv3;
    kv4 = velocidades[0]+paso*ka3;
    mv4 = velocidades[1]+paso*ma3;
    nv4 = velocidades[2]+paso*na3;
    pos4 = crear_matriz(3,1);
    vel4 = crear_matriz(3,1);
    pos4[0] = k4;
    pos4[1] = m4;
    pos4[2] = n4;
    vel4[0] = kv4;
    vel4[1] = mv4;
    vel4[2] = nv4;
    acc4 = calcularAceleraciones(pos4,vel4,gamma);
    ka4 = acc4[0];
    ma4 = acc4[1];
    na4 = acc4[2];
    //Final - Promedio
    kF = posiciones[0]+paso*(kv1+2.0*kv2+2.0*kv3+kv4)/6.0;
    mF = posiciones[1]+paso*(mv1+2.0*mv2+2.0*mv3+nv4)/6.0;
    nF = posiciones[2]+paso*(nv1+2.0*nv2+2.0*nv3+mv4)/6.0;
    kvF = velocidades[0]+paso*(ka1+2.0*ka2+2.0*ka3+ka4)/6.0;
    mvF = velocidades[1]+paso*(ma1+2.0*ma2+2.0*ma3+na4)/6.0;
    nvF = velocidades[2]+paso*(na1+2.0*na2+2.0*na3+ma4)/6.0;
    posF = crear_matriz(3,1);
    velF = crear_matriz(3,1);
    posF[0] = kF;
    posF[1] = mF;
    posF[2] = nF;
    velF[0] = kvF;
    velF[1] = mvF;
    velF[2] = nvF;
    retorno = crear_matriz(6,1);
    for(i=0; i<3; i++) {
        retorno[i] = posF[i];
        retorno[i+3] = velF[i];
    }
    return retorno;
}