예제 #1
0
int rk4_step(float ***r, float ***v, float ***a, float ***kr, float ***kv, float ***ri, float ***vi, float *m, float h, int n_cuerpos, int n_coordenadas, int cuerpo, int step, int coodernada){
  
  kr[cuerpo][0][coordenada] = r_prime(r[cuerpo][step-1][coordenada], v[cuerpo][step-1][coordenada], a[cuerpo][step-1][coordenada]);
  kv[cuerpo][0][coordenada] = v_prime(r[cuerpo][step-1][coordenada], v[cuerpo][step-1][coordenada], a[cuerpo][step-1][coordenada]); 
  
  //Primer Paso
  ri[cuerpo][0][coordenada] = r[cuerpo][step-1][coordenada] + (h/2.0)*kr[0][coordenada];
  vi[cuerpo][0][coordenada] = v[cuerpo][step-1][coordenada] + (h/2.0)*kv[0][coordenada];
  hallar_aceleracion(kr, kv, m, n_cuerpos, step, n_coordenadas); //Nueva aceleracion

  kr[cuerpo][1][coordenada] = r_prime(ri[0][coordenada], vi[0][coordenada], a[cuerpo][step-1][coordenada]);
  kv[cuerpo][1][coordenada] = v_prime(ri[0][coordenada], vi[0][coordenada], a[cuerpo][step-1][coordenada]); 

  //Segundo paso  
  ri[cuerpo][1][coordenada] = r[cuerpo][step-1][coordenada] + (h/2.0)*kr[1][coordenada];
  vi[cuerpo][1][coordenada] = v[cuerpo][step-1][coordenada] + (h/2.0)*kv[1][coordenada];
   hallar_aceleracion(kr, kv, m, n_cuerpos, step, n_coordenadas); //Nueva aceleracion
  
  kr[cuerpo][2][coordenada] = r_prime(ri[1][coordenada], vi[1][coordenada], a[cuerpo][step-1][coordenada]);
  kv[cuerpo][2][coordenada] = v_prime(ri[1][coordenada], vi[1][coordenada], a[cuerpo][step-1][coordenada]); 
  
  //Tercer paso
  ri[cuerpo][2][coordenada] = r[cuerpo][step-1][coordenada] + h*kr[2][coordenada];
  vi[cuerpo][2][coordenada] = v[cuerpo][step-1][coordenada] + h*kv[2][coordenada];  
  hallar_aceleracion(kr, kv, m, n_cuerpos, step, n_coordenadas); //Nueva Aceleracion  

  kr[cuerpo][3][coordenada] = r_prime(ri[2][coordenada], vi[2][coordenada], a[cuerpo][step-1][coordenada]);
  kv[cuerpo][3][coordenada] = v_prime(ri[2][coordenada], vi[2][coordenada], a[cuerpo][step-1][coordenada]); 
  
  //Cuarto Paso
  average_kr[coordenada] = (1.0/6.0)*(kr[0][coordenadas] + 2.0*kr[1][coordena] + 2.0*kr[2][coordenada] + kr[3][coordenada]);
  average_kv[coordenada] = (1.0/6.0)*(kv[0][coordenada] + 2.0*kv[1][coordenada] + 2.0*kv[2][coordenada] + kv[3][coordenada]);
  
  r[cuerpo][step][coordenada] = r[cuerpo][step-1][coordenada] + (h*average_kr[coordenada]);
  v[cuerpo][step][coordenada] = v[cuerpo][step-1][coordenada] + (h*average_kv[coordenada]);

  hallar_aceleracion(r, v, m, n_cuerpos, step, n_coordenadas);
}
void RK4(double *t, double *x, double *y, double *z, double *u, double *v, double *w, double dt, double gamma){
    double k_1_prime_1, k_1_prime_2, k_1_prime_3;
    double t1, x1, y1, z1, u1, v1, w1;
    double k_2_prime_1, k_2_prime_2, k_2_prime_3;
    double t2, x2, y2, z2, u2, v2, w2;
    double k_3_prime_1, k_3_prime_2, k_3_prime_3;
    double t3, x3, y3, z3, u3, v3, w3;
    double k_4_prime_1, k_4_prime_2, k_4_prime_3;
    double k_prime_1, k_prime_2, k_prime_3;
    double tnew, xnew, ynew, znew, unew, vnew, wnew;

    k_1_prime_1=u_prime(*t,*x,*y,*z,*u,*v,*w,gamma);
    k_1_prime_2=v_prime(*t,*x,*y,*z,*u,*v,*w,gamma);
    k_1_prime_3=w_prime(*t,*x,*y,*z,*u,*v,*w,gamma);

    t1=(*t)+(dt/2.0);
    x1=(*x)+(dt/2.0)*(*u);
    y1=(*y)+(dt/2.0)*(*v);
    z1=(*z)+(dt/2.0)*(*w);
    u1=(*u)+(dt/2.0)*k_1_prime_1;
    v1=(*v)+(dt/2.0)*k_1_prime_2;
    w1=(*w)+(dt/2.0)*k_1_prime_3;

    k_2_prime_1=u_prime(t1,x1,y1,z1,u1,v1,w1,gamma);
    k_2_prime_2=v_prime(t1,x1,y1,z1,u1,v1,w1,gamma);
    k_2_prime_3=w_prime(t1,x1,y1,z1,u1,v1,w1,gamma);

    t2=(*t)+(dt/2.0);
    x2=(*x)+(dt/2.0)*u1;
    y2=(*y)+(dt/2.0)*v1;
    z2=(*z)+(dt/2.0)*w1;
    u2=(*u)+(dt/2.0)*k_2_prime_1;
    v2=(*v)+(dt/2.0)*k_2_prime_2;
    w2=(*w)+(dt/2.0)*k_2_prime_3;

    k_3_prime_1=u_prime(t2,x2,y2,z2,u2,v2,w2,gamma);
    k_3_prime_2=v_prime(t2,x2,y2,z2,u2,v2,w2,gamma);
    k_3_prime_3=w_prime(t2,x2,y2,z2,u2,v2,w2,gamma);
    
    t3=(*t)+dt;
    x3=(*x)+(dt)*u2;
    y3=(*y)+(dt)*v2;
    z3=(*z)+(dt)*w2;
    u3=(*u)+(dt)*k_3_prime_1;
    v3=(*v)+(dt)*k_3_prime_2;
    w3=(*w)+(dt)*k_3_prime_3;

    k_4_prime_1=u_prime(t3,x3,y3,z3,u3,v3,w3,gamma);
    k_4_prime_2=v_prime(t3,x3,y3,z3,u3,v3,w3,gamma);
    k_4_prime_3=w_prime(t3,x3,y3,z3,u3,v3,w3,gamma);

    k_prime_1=(k_1_prime_1+2.0*k_2_prime_1+2.0*k_3_prime_1+k_4_prime_1)/6.0;
    k_prime_2=(k_1_prime_2+2.0*k_2_prime_2+2.0*k_3_prime_2+k_4_prime_2)/6.0;
    k_prime_3=(k_1_prime_3+2.0*k_2_prime_3+2.0*k_3_prime_3+k_4_prime_3)/6.0;

    tnew=(*t)+dt;
    unew=(*u)+dt*k_prime_1;
    vnew=(*v)+dt*k_prime_2;
    wnew=(*w)+dt*k_prime_3;
    xnew=(*x)+dt*(*u);
    ynew=(*y)+dt*(*v);
    znew=(*z)+dt*(*w);

    *t=tnew;
    *x=xnew;
    *y=ynew;
    *z=znew;
    *u=unew;
    *v=vnew;
    *w=wnew;

  }