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; }