Método de Heun para solución de ecuaciones diferenciales

Este programa calcula la solución en un punto (mediante integración numérica) de una ecuación diferencial.

El método consiste en calcular una pendiente promedio entre las pendientes en los puntos (x , y) y (x + dx, y + dy) y utilizarla para calcular un nuevo valor de la función en (x+dx, y+dy), de modo que

f(x + dx, y+dy) = f(x , y) + {[dy(x, y)/dx + dy(x+dx, y+dy)/dx]/2}*dx

Este método resulta considerablemente más exacto que el método de Euler. Los resultados numéricos pueden verse arriba, y abajo en forma de gráfica.

================================= Código ================================

#include <iostream>
#include <cmath>
using namespace std;

int main(){
double f = 2;
double fp = 2;
double dy1;
double dy2;
double y;
double dx = 0.5;

cout << “Metodo de Heun:”<<endl;
cout << “x \t y \t f \t error\t” << endl << endl;

for (double x = 0; x <= 4; x += dx){
y = (4/1.3)*(exp(0.8*x) – exp(-0.5*x)) + 2*exp(-0.5*x); //y real

fp = f;

cout << x << “\t” << y << “\t” << f << “\t” << 100*abs((y-f)/y)<< “\t” << endl;

// calculo de la pendiente

dy1 = 4*exp(0.8*x) – 0.5*f;
fp += dy1*dx;
dy2 = 4*exp(0.8*(x + dx)) – 0.5*fp;

f += dx*(dy1 + dy2)/2;
}
return 0;
}

==================================== Gráfica ================================

heunvseuler

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s