martes, enero 04, 2011

C++ - Método de Integración Runge - Kutta y Euler


"Si usa algún código del siguiente tutorial, den el icono de ME GUSTA del Facebook que se encuentra en su mano derecha, para que se vuelva Seguidor del Blog y también comentenos que tal les pareció el tutorial"

Este algoritmo sirve para aplicar los métodos de Integracion de Runge-Kutt y Euler y fue desarrollado en C++. Le puede servir a la gente que le gusta la programación orientadose a la matemática. Este algoritmo fue desarrollado para fines didácticos.




El código fuente de la aplicación en C++

#include<iostream.h>
#include<conio.h>
#include<iomanip.h>
#include<math.h>

//Se debe ingresar X0=0; Y0=1; Xf=1; N=10

/**********************Se ingresa la funcion****************************/

float func(float x, float y){
  return 0.5*(1+x)*pow(y,2);
}

/**********************Reportar los Datos******************************/

void reportar(float x, float y, int i)
{cout<<setiosflags(ios::showpoint | ios::fixed);
  cout<<setiosflags(ios::right);
  cout.precision(4);
  cout<<setw(10)<<i<<setw(15)<<x<<setw(15)<<y<<endl;
}

/**********************Reportar los Datos******************************/

int menu()
{int opc;
  do
  {clrscr();
    cout<<setw(50)<<"SELECCIONE OPCION\n";
    cout<<setw(50)<<"-----------------\n"<<endl;
    cout<<"1.Metodo de Euler"<<endl;
    cout<<"2.Metodo de Runge -Kutta"<<endl;
    cout<<"3.Salir"<<endl;
    cout<<"\nSeleccione Opcion: ";cin>>opc;
  }while(opc<1 || opc>3);
  return opc;
}

/**********************Metodo de Euler******************************/

void Euler(){
  float x0,y0,xf,yf,h;
  int n,i;
  clrscr();
  cout<<setw(50)<<"Metodo de Integracion de Euler"<<endl;
  cout<<setw(50)<<"------------------------------"<<endl<<endl;
  cout<<"Ingrese el valor de x0: ";
  cin>>x0;
  cout<<"Ingrese el valor de y0: ";
  cin>>y0;
  cout<<"ingrese el valor de xf: ";
  cin>>xf;
  do{
    cout<<"Ingrese el numero de subintervalos a emplear: ";
    cin>>n;
  }while(n<=0);
  h=(xf-x0)/n;
  cout<<endl;
  cout<<setw(10)<<"I"<<setw(15)<<"Xi"<<setw(15)<<"Yi"<<endl;
  cout<<setw(10)<<"-"<<setw(15)<<"--"<<setw(15)<<"--"<<endl;
  for(i=1;i<=n;i++)
  { y0=y0+h*func(x0,y0);
    x0=x0+h;
    reportar(x0,y0,i);
  }
  cout<<"\nEl valor de Yf: "<<y0<<endl;
  getch();
}

/**********************Metodo de Runge Kutta******************************/

void Kutta(){
  float x0,y0,xf,yf,h,k1,k2,k3,k4;
  int n,i;
  clrscr();
  cout<<setw(50)<<"Metodo de Runge - Kutta"<<endl;
  cout<<setw(50)<<"-----------------------"<<endl<<endl;
  cout<<"Ingrese el valor de x0: ";
  cin>>x0;
  cout<<"Ingrese el valor de y0: ";
  cin>>y0;
  cout<<"ingrese el valor de xf: ";
  cin>>xf;
  do{
    cout<<"Ingrese el numero de subintervalos a emplear: ";
    cin>>n;
  }while(n<=0);
  h=(xf-x0)/n;
  cout<<endl;
  cout<<setw(10)<<"I"<<setw(15)<<"Xi"<<setw(15)<<"Yi"<<endl;
  cout<<setw(10)<<"-"<<setw(15)<<"--"<<setw(15)<<"--"<<endl;
  for(i=1;i<=n;i++)
  { k1=func(x0,y0);
    k2=func(x0+h/2,y0+h*k1/2);
    k3=func(x0+h/2,y0+h*k2/2);
    k4=func(x0+h,y0+h*k3);
    y0=y0+(k1+2*k2+2*k3+k4)*h/6;
    x0=x0+h;
    reportar(x0,y0,i);
  }
  cout<<"El valor de Yf: "<<y0<<endl;
  getch();
}

/**********************Terminar******************************/

void terminar()
{cout<<"\t\t\t\tSalir del Programa\n";
cout<<"\t\t\t\t------------------\n\n";
cout<<"Gracias por usar el programa"<<endl<<endl;
}

/**********************Funcion Principal******************************/

void main (void)
{int opc;
do
{clrscr();
  opc=menu();
  clrscr();
  switch(opc)
  {case 1: clrscr();Euler(); break;
    case 2: clrscr();Kutta();break;
    case 3: clrscr();terminar();break;
  }
  getch();
}
while(opc!=3);
getch();
}

6 comentarios:

men soy estudiadnte de electronica y ps necesito saber si este algoritmo sirve con polinomios de segundo grado y si tienes algun consejo extra o alguna referencia que me ayude estoy programando en c# gracias por el post esta muy bueno

Exacto sirve para solucionar polinomios de segundo grado :D

What a great web log. I spend hours on the net reading blogs, about tons of various subjects. I have to first of all give praise to whoever created your theme and second of all to you for writing what i can only describe as an fabulous article. I honestly believe there is a skill to writing articles that only very few posses and honestly you got it. The combining of demonstrative and upper-class content is by all odds super rare with the astronomic amount of blogs on the cyberspace.

Couldnt agree more with that, very attractive article

Hi there, I found your blog via Google while searching for a related topic, your site came up, it looks good.

Really great article with very interesting information. You might want to follow up to this topic!?! 2012