Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Metodo de Euler-Heun

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 5

OBJETIVO

• Programar y probar el Método de Euler-Heun para la solución numérica de Ecuaciones


Diferenciales Ordinarias (EDO).

INTRODUCCIÓN

Un método para mejorar la estimación de la pendiente involucra la determinación y promediado


de dos derivadas para el intervalo (una en el punto inicial y otra en el punto final).
En el método de Euler, la pendiente al inicio del intervalo se usa para extrapolar linealmente
a 𝑦𝑖+1.
En el método de Heun la pendiente calculada en la estimación previa no es para la respuesta
final, sino para una predicción intermedia. Esta ecuación es llamada predictor. Mejora una
estimación de 𝑦𝑖+1 que permite el cálculo de una estimación de la pendiente al final del
intervalo.
0
𝑦′𝑖+1 = 𝑓(𝑥𝑖+1 , 𝑦𝑖+1 )
0
Aquí, 𝑦𝑖+1 es el predictor, y es la misma ecuación de Euler para encontrar 𝑦𝑖+1 . Ésta nos sirve
para calcular la pendiente 𝑦′𝑖+1 .
Las dos pendientes se promedian en el intervalo:

̅ = 𝑦′𝑖 + 𝑦′𝑖+1
𝑦′
2
Está pendiente promedio se utiliza para extrapolar linealmente desde 𝑦𝑖 hasta 𝑦𝑖+1 usando el
método de Euler.
𝑓(𝑥𝑖 , 𝑦𝑖 ) + 𝑓(𝑥𝑖+1 , 𝑦𝑖+1 )
𝑦𝑖+1 = 𝑦𝑖 + ℎ
2
Esta ecuación es conocida como ecuación correctora. El método de Heun es un
procedimiento predictor – corrector.
Se puede conseguir una mejor precisión en el resultado si hacemos varios procesos
0
correctores, esto lo logramos tomando 𝑦𝑖+1 y reemplazándolo por 𝑦𝑖+1 en la ecuación y así
encontrar un nuevo 𝑦𝑖+1 , y se repite el proceso hasta donde se desee.
METODOLOGÍA

1.- Implementar en el lenguaje de su elección el pseudocódigo del Método de Euler-Heun


del siguiente listado:

1. Si h=0 entonces Parámetros de Entrada:


2. Error: h=0 fxy – EDO a integrar
3. Sale de la rutina xi – Límite inferior de integración
4. n=redondear((xf-xi)/h) xf – Límite superior de integración
5. x=xi yi – Condición Inicial para xi
6. y(1)=yi h – Tamaño del paso
7. for i=1 hasta n imax – No. máximo de iteraciones
8. dy1dx=fxy(x,y(i)) es – Error permisible
9. ye=y(i)+dy1dx*h
10. dy2dx=fxy(x+h,ye) Parámetros de Salida:
11. ym=(dy1dx+dy2dx)/2 y – Vector con el resultado de la integración
12. y(i+1)=y(i)+ym*h
13. x=x+h
14. Termina ciclo for i

2.- Probar su programa con el siguiente ejemplo usando como datos de entrada xi=0,
xf=4, yi=1 y h=0.5 y mostrar pantalla de salida con los resultados.

dy/dx=-2x3 +12x2-20x+8.5
3.- Observaciones
Observando nuestra grafica percibimos que los valores iníciales no coincidían con la tabla
mostrada en las dispositivas de la unidad, más al leer y analizar bien la información dicha tabla
era del método de Euler y la que se muestra en este programa es el método de Euler-Heun en
cual es una mejora del programa anterior, ya que promediando ambas derivadas se obtiene
una mejor estimación de la pendiente en el intervalo.
4.- Conclusiones
Con este trabajo comprendimos como aplicar el lenguaje c para la solución de ecuaciones
diferenciales, no es fácil programarlo, pero se tienen las herramientas para investigar y poder
desarrollar programas para facilitar la solución de dichos problemas.

5.- Código del método


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

using namespace std;

float func(float x, float y){


return -2*(pow((x),3))+(12*(pow((x),2)))-(20*(x))+8.5;
}

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

void Euler(){
float xi,yi,xf,yf,h;
char n;
int i;
system("cls");

cout<<setw(50)<<"METODO EULER - HEUN"<<endl;


cout<<setw(50)<<"------------------------------"<<endl<<endl;
cout<<"INGRESE EL VALOR DE x0: ";
cin>>xi;
cout<<"INGRESE EL VALOR DE yi: ";
cin>>yi;
cout<<"INGRESE EL VALOR DE xf: ";
cin>>xf;
do{
cout<<"INGRESE EL TAMAÑO DEL PASO: ";
cin>>n;
}while(n<=0);
h=(xf-xi)/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++)
{ yi=yi+h*func(xi,yi);
xi=xi+h;
reportar(xi,yi,i);
}
cout<<"\nEL VALOR DE Yf: "<<yi<<endl;
getch();
}

void terminar()
{cout<<"\t\t\t\tPROGRAMA FINALIZADO\n";
cout<<"GRACIAS POR USAR EL PROGRAMA"<<endl<<endl;
}

int menu()
{int opc;
do
{
cout<<setw(50)<<"METODO DE EULER - HEUN\n\n";
printf("L \n");
printf("F \n");
printf("A \n\n");
cout<<setw(50)<<"INGRESE LA OPCION A REALIZAR\n\n";
cout<<"1. METODO DE EULER - HEUN"<<endl;
cout<<"2. FINALIZAR"<<endl;
cout<<"\nSELECCIONAR OPCION: ";cin>>opc;

}while(opc<1 || opc>2);
return opc;

int main ()
{int opc;
do
{
system("cls");
opc=menu();

system("cls");
switch(opc)
{
case 1: system("cls");Euler(); break;
case 2: system("cls");terminar(); break;
}
getch();
}
while(opc!=2);
getch();
}

También podría gustarte