Você está na página 1de 2

//Programa RK4 para sistemas de ecuaciones

#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
// Definicion de parametros del mtod (ejemplo de 3 ecuaciones diferenciales ordin
arias)
const int N = 3; // Numero de ecuaciones
const double paso = 0.1; // tamaNo del paso
const double t0 = 0.0; //tiempo inicial
const double tfinal = 10; //tiempo final
// function declarations
double f(const double & x, const double y[], const int & i);
void UnPasoDeRK4(const double & x, double y[], const double & h,
const int & nNum);
//definicione de funciones
double f(const double & x, const double y[], const int & i)
{
if (0 == i) return 10*(y[1]-y[0]); //dx/dt x=y[0] y=y[1] z=y[1]
if (1 == i) return 28*y[0]-y[1]-y[0]*y[2]; //dy/dt
if (2 == i) return -(8/3)*y[2]+y[0]*y[1];// dz/dt
}
void UnPasoDeRK4(const double & x, double y[], const double & h, const int & num
)
{
double k1[num], k2[num], k3[num], k4[num]; // Pendientes
double l1[num], l2[num], l3[num]; //truco
int i;
for (i=0; i<num; i++){ k1[i]=h*f(x, y, i);
l1[i]=y[i]+0.5*k1[i];}
for (i=0; i<num; i++){ k2[i]=h*f(x+0.5*h, l1, i);
l2[i]=y[i]+0.5*k2[i];}
for (i=0; i<num; i++){ k3[i]=h*f(x+0.5*h, l2, i);
l3[i]=y[i]+k3[i];}
for (i=0; i<num; i++) k4[i]=h*f(x + h, l3, i);
for (i=0; i<num; i++) y[i]+=(k1[i]+2*k2[i]+2*k3[i]+k4[i])/6.0;
}
int main(void){
ofstream g("lorentz.txt"), c("lorentz.plt");
double x, y[N], A, B, x0, v0,z0;
int i;
//Condicion inicial
cout<<"punto inicial x ";cin>>x0; //5
cout<<"punto inicial y ";cin>>v0;
cout<<"punto inicial z ";cin>>z0; //0
y[0]=x0;
y[1]=v0;

y[2]=z0;
for(x = t0; x <= tfinal; x += paso){
g<<x<<" "<<y[0]<<" "<<y[1]<<" "<<y[2]<<endl;
UnPasoDeRK4(x, y, paso, N);
}
g.close();
c<<"unset key"<<endl;
c<<"set grid"<<endl;
c<<"set xrange [-30:30]"<<endl;
c<<"set yrange [-29:29]"<<endl;
c<<"set size ratio -1"<<endl;
c<<"splot 'lorentz.txt' u 2:3:4 w l"<<endl ; //x=2v=0
c.close();
return 0;
}

Você também pode gostar