Trabajo de Metodos
Trabajo de Metodos
Trabajo de Metodos
TRABAJO:
RECOPILACION DE LOS PROGRAMAS VISTOS EN CLASES
FECHA 14/DICIEMBRE/2015
Contenido
INTRODUCCIN.......................................................................................................... 2
1.
RAICES DE ECUACIONES....................................................................................... 3
1.1.
1.1.1.
EL MTODO DE BISECCIN.........................................................................3
1.1.1.1.
1.1.1.2.
1.1.2.
1.1.2.1.
1.1.2.2.
1.2.
1.2.1.
MTODOS ABIERTOS.................................................................................... 17
MTODO DE NEWTON RAPHSON............................................................17
1.2.1.1.
1.2.1.2.
1.2.2.
MTODO DE LA SECANTE.........................................................................22
1.2.2.1.
1.2.2.2.
1.3.
1.3.1.
2.
Mtodos cerrados.......................................................................................... 3
RACES DE POLINOMIOS............................................................................... 27
Mtodo de Lin Bairstow............................................................................ 27
1.3.1.1.
1.3.1.2.
INTRODUCCIN
Los mtodos numricos son tcnicas mediante las cuales es posible formular problemas de tal
forma que puedan resolverse usando operaciones aritmticas. (Steven Chapra, 2014)
Aunque hay muchos tipos de mtodos numricos, todos comparten una caracterstica comn:
Invariablemente los mtodos numricos llevan a cabo un buen nmero de clculos aritmticos.
No es raro que con el desarrollo de computadoras digitales eficientes y rpidas, el papel de los
mtodos numricos en la solucin de problemas de ingeniera haya aumentado
considerablemente en los ltimos aos.
Los mtodos numricos son herramientas extremadamente poderosas para la solucin de
problemas. Son capaces de manejar sistemas de ecuaciones grandes, no linealidades y
geometras complicadas que son comunes en la prctica de la ingeniera y que, a menudo, son
imposibles de resolver analticamente. Por lo tanto, amplan la habilidad de quien los estudia
para resolver problemas.Hay muchos problemas que no pueden plantearse al emplear
programas hechos. Si se est versado en los mtodos numricos y se es un adepto de la
programacin de computadoras, entonces se tiene la capacidad de disear programas propios
para resolver los problemas, sin tener que comprar un software costoso. En el presente
documento se usar la programacin en lenguaje C para construir nuestros propios programas
para la resolucin de problemas usando los mtodos numricos que se describen a
continuacin:
1. Races de ecuaciones. Estos problemas estn relacionados con el valor de una variable
o de un parmetro que satisface una ecuacin ya sea trascendental o un polinomio
2. Sistemas de ecuaciones algebraicas lineales. En esencia, estos problemas son
similares a los de races de ecuaciones en el sentido de que estn relacionados con
valores que satisfacen ecuaciones. Sin embargo, a diferencia de satisfacer una sola
ecuacin, se busca un conjunto de valores que satisfaga simultneamente a un
conjunto de ecuaciones algebraicas. Las ecuaciones lineales simultneas surgen en el
contexto de una variedad de problemas y en todas las disciplinas de la ingeniera.
3. Ajuste de curvas. Con frecuencia se presentar la oportunidad de ajustar curvas a un
conjunto de datos representados por puntos. Las tcnicas que se han desarrollado para
este fin pueden dividirse en dos categoras generales: regresin e interpolacin. La
regresin se emplea cuando hay un grado significativo de error asociado a los datos;
frecuentemente los resultados experimentales son de esta clase. Para estas
situaciones, la estrategia es encontrar una curva que represente la tendencia general de
los datos sin necesidad de tocar los puntos individuales. En contraste, la interpolacin
se maneja cuando el objetivo es determinar valores intermedios entre datos que estn
relativamente libres de error.
4. Ecuaciones diferenciales ordinarias. Las ecuaciones diferenciales ordinarias tienen un
enorme significado en la prctica de la ingeniera. Esto se debe a que muchas leyes
fsicas estn expresadas en trminos de la razn de cambio de una cantidad ms que
en trminos de su magnitud. Entre los ejemplos se observan desde los modelos de
prediccin demogrfica (razn de cambio de la poblacin) hasta la aceleracin de un
cuerpo en descenso (razn de cambio de la velocidad).
1. RAICES DE ECUACIONES
1.1.
Mtodos cerrados.
Los mtodos cerrados consisten en dar 2 puntos tales que stos encierren el valor de la raz,
dichos puntos es cuando al sustituirlos en la funcin, sta cambia de signo. En ste caso se
aplica un anlisis de la curva mediante la implementacin de un programa tabula.cpp en c++, el
cual evala la funcin para valores obtenidos a travs de un intervalo dado y un nmero de
puntos en los cuales se divide dicho intervalo. El programa tabula.cpp muestra al final los
puntos para los cuales en la funcin hay un cambio de signo, estos puntos se usan en los
mtodos cerrados de biseccin y regla falsa.
1.1.1.
EL MTODO DE BISECCIN.
Se sabe que un polinomio de grado n tiene n races las cuales pueden ser:
Reales y distintas.
Reales e iguales.
Complejas conjugadas.
De acuerdo a ello un polinomio de grado impar tendr por lo menos una raz real, para dichas
races ocuparemos los mtodos numricos de Biseccin, Regla Falsa, Newton Raphson.
En general, si f(x) es real y contina en el intervalo que va desde x1 hasta x2 y f(x1) y f(x2)
tienen signos opuestos, es decir,
f (x1) < 0 < f(x2)
Entonces hay al menos una raz real entre x1 y x2. Los mtodos de bsqueda incremental
aprovechan esta caracterstica localizando un intervalo en el que la funcin cambie de signo.
Entonces, la localizacin del cambio de signo (y, en consecuencia, de la raz) se logra con ms
exactitud al dividir el intervalo en varios subintervalos. Se investiga cada uno de estos
subintervalos para encontrar el cambio de signo. El proceso se repite y la aproximacin a la
raz mejora cada vez ms en la medida que los subintervalos se dividen en intervalos cada vez
ms pequeos. Por lo que sabemos que existe, al menos, una raz real. A partir de este punto
se va reduciendo el intervalo sucesivamente hasta hacerlo tan pequeo como exija la precisin
que hayamos decidido emplear. En seguida se explicara a fondo y paso a paso el mtodo:
PROGRAMA
#include <cstdlib>
#include <iostream>
#include <math.h>
#include <iomanip>
#include <stdio.h>
using namespace std;
float f(float);
void escvec2(int , float[50],char [5], float [50], char [5]);
void Tabula(float, float, int, float [50], float [50]);
int bis(float ,float , float , int, float*);
int main(int argc, char *argv[])
{
int nit,con,i, np, nr;
float raiz,x1,x2,Eps,res,xa, xb,x[50],y[50];
cout<<"Metodo de la Biseccion \n"<<endl;
system("PAUSE");
system("cls");
cout<<"
Metodo de la Biseccion \n"<< endl;
cout<<"
Tabular el Polinomio \n"<< endl;
cout<<"xa: Intervalo inicial xb: Intervalo final np: Numero de partes \n"
<<endl;
cout<<"xa= ";cin>>xa;
cout<<"xb= ";cin>>xb;
cout<<"np= ";cin>>np;
Tabula(xa, xb,np,x,y);
escvec2(np+1,x,"x",y,"y");
system("PAUSE");
system("cls");
cout<<"
Metodo de la Biseccion \n"<< endl;
cout<<"Encontrar las raices \n"<< endl;
cout<<"Numero de raices del Polinomio= ";cin>>nr;
system("PAUSE");
system("cls");
for(i=1;i<=nr;i++)
{
cout<<"Raiz"<<"["<<i<<"]"<<endl;
cout<<"x1= ";cin>>x1;
cout<<"x2= ";cin>>x2;
cout<<"Eps= ";cin>>Eps;
cout<<"nit= ";cin>>nit;
if (bis (x1,x2,Eps,nit,&raiz)==1)
{
cout<<"\n \n Para el intervalo x1: "<<x1<<"
Para el intervalo x2:
"<<x2<<endl;
cout<<"\n El proceso converge: "<<raiz<<"\n \n \n"<<endl;
}
else
{
cout<<"\n \n Para el intervalo x1: "<<x1<<"
Para el intervalo x2:
"<<x2<<endl;
cout<<"\n \n El proceso no converge"<< endl;
system("PAUSE");
system("cls");
}
system("PAUSE");
system("cls");
}
}
int bis(float x1,float x2, float Eps, int nit, float *res)
{
int con,i;
float x3,x4,y1,y2,y3, Ea;
con=0;
printf ("\n nit x1
x2
x3 |Xi+1 - Xi| Ea
y1
y2
y3 ");
for(i=1;i<=nit;i++)
{
x3=(x1+x2)/2.0;
if(f(x3)==0.0)
{
*res=x3;
con=1;
break;
}
y1=f(x1);
y2=f(x2);
y3=f(x3);
if(i==1)
printf("\t \n %2d %8.4f %8.4f %8.4f \t \t \t %8.4f %8.4f
%8.4f",i,x1,x2,x3,y1,y2,y3);
else
{
Ea=fabs((x3-x4)/x3)*100;
printf("\t \n \n %2d %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f",
i,x1,x2,x3,fabs(x3-x4),Ea,y1,y2,y3);
if(fabs(x3-x4)<=Eps)
{
*res=x3;
con=1;
break;
}
}
x4=x3;
if(f(x3)*f(x1)>0)
x1=x3;
else
x2=x3;
}
if(con==1)
return (con);
system("PAUSE");
}
void Tabula(float xa, float xb, int np, float x[50], float y[50])
{
int i;
float x1, dx;
x1 = xa;
dx=(xb-xa)/np;
for (i=1; i<=np ;i++)
{
x[i]=x1;
y[i]= f(x[i]);
x1=x1+dx;
}
}
void escvec2(int n, float x[50],char nomx[5], float y[50], char nomy[5])
{
int i;
for(i=1; i<=n; i++)
{
cout << nomx << "[" <<i<<"]="<<x[i]<<" "<<nomy<< "["
<<i<<"]="<<y[i]<< endl;
}
}
float f(float x)
{
return (4.0*pow(x,3)-30.0*pow(x,2)+70*x-50);
}
1.1.2.
La falsa posicin es una alternativa basada en una visualizacin grfica. Un inconveniente del
mtodo de biseccin es que al dividir el intervalo de xl a xu en mitades iguales, no se toman en
consideracin las magnitudes de f(xl) y f(xu). Por ejemplo, si f(xl) est mucho ms cercana a
cero que f(xu), es lgico que la raz se encuentre ms cerca de xl que de xu. Un mtodo
alternativo que aprovecha esta visualizacin grfica consiste en unir f(xl) y f(xu) con una lnea
recta. La interseccin de esta lnea con el eje de las x representa una mejor aproximacin de la
raz. El hecho de que se reemplace la curva por una lnea recta da una falsa posicin de la
raz; de aqu el nombre de mtodo de la falsa posicin, o en latn, regula falsi. Tambin se le
conoce como mtodo de interpolacin lineal.Usando tringulos semejantes, la interseccin de
la lnea recta con el eje de las x se estima mediante.
al despejar Xr
Figura 6. Formula de la regla falsa
sta es la frmula de la falsa posicin. El valor de xr calculado con la ecuacin, reemplazar,
despus, a cualquiera de los dos valores iniciales, xl o xu, y da un valor de la funcin con el
mismo signo de f(xr). De esta manera, los valores xl y xu siempre encierran la verdadera raz.
El proceso se repite hasta que la aproximacin a la raz sea adecuada. El algoritmo es idntico
al de la biseccin, excepto en que la ecuacin se usa en el paso 2. Adems, se usa el mismo
criterio de terminacin para concluir los clculos.
Figura 7. Representacin grfica del mtodo de la falsa posicin. Con los tringulos
semejantes sombreados se obtiene la frmula para el mtodo.
{
cout<<"\n \n Para el intervalo x1: "<<x1<<"
Para el intervalo x2:
"<<x2<<endl;
cout<<"\n El proceso converge: "<<raiz<<"\n \n \n"<<endl;
}
else
{
cout<<"\n \n Para el intervalo x1: "<<x1<<"
Para el intervalo x2:
"<<x2<<endl;
cout<<"\n \n El proceso no converge"<< endl;
system("PAUSE");
system("cls");
}
system("PAUSE");
system("cls");
}
}
int regfal(float xa, float xb, float Eps, int nit, float *res)
{
int i, con;
float x1, x2, x3, x4, Ea, y1, y2, y3;
con=0;
x1=xa;
x2=xb;
x4=0;
printf(" It
x1
x2
x3 |xi+1 - xi| Ea
y1
y2
y3");
for(i=1;i<=nit;i++)
{
y1=f1(x1);
y2=f1(x2);
x3= x2 - ( ((f1(x2))*(x1-x2)) / ((f1(x1))-(f1(x2))) );
y3=f1(x3);
if(y3==0)
{
*res=x3;
con=1;
break;
}
if(i==1)
{
printf("\n %2d %8.4f %8.4f %8.4f \t \t \t %8.4f %8.4f %8.4f", i ,
x1, x2, x3, y1, y2, y3);
}
else
{
Ea=fabs((x3-x4)/x3)*100;
printf("\n %2d %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f", i ,
x1, x2, x3, fabs(x2-x3), Ea,y1, y2, y3);
if(fabs(x3-x4)<=Eps)
{
*res=x3;
con=1;
break;
}
if((y1)*(y3)>0.0)
{
x1=x3;
}
else
{
x2=x3;
}
x4=x3;
}
}
return(con);
}
void Tabula(float xa, float xb, int np, float x[50], float y[50])
{
int i;
float x1, dx;
x1 = xa;
dx=(xb-xa)/np;
for (i=1; i<=np ;i++)
{
x[i]=x1;
y[i]= f1(x[i]);
x1=x1+dx;
}
}
void escvec2(int n, float x[50],char nomx[5], float y[50], char nomy[5])
{
int i;
for(i=1; i<=n; i++)
{
cout << nomx << "[" <<i<<"]="<<x[i]<<"
"<<nomy<< "["
<<i<<"]="<<y[i]<< endl;
}
}
float f1(float x)
{
return (4.0*pow(x,3)-30.0*pow(x,2)+70*x-50);
}
1.2.1.
Tal vez, de las frmulas para localizar races, la frmula de NewtonRaphson sea la ms
ampliamente utilizada. Si el valor inicial para la raz es xi, entonces se puede trazar una
tangente desde el punto [xi, f (xi)] de la curva. Por lo comn, el punto donde esta tangente
cruza al eje x representa una aproximacin mejorada de la raz. El mtodo de NewtonRaphson
se deduce a partir de esta interpretacin geomtrica (un mtodo alternativo basado en la serie
de Taylor). Se tiene que la primera derivada en x es equivalente a la pendiente:
cout<<"
Metodo de Newton-Raphson \n"<< endl;
cout<<"
Tabular el Polinomio \n"<< endl;
cout<<"xa: Intervalo inicial xb: Intervalo final np: Numero de partes \n"
<<endl;
cout<<"xa= ";cin>>xa;
cout<<"xb= ";cin>>xb;
cout<<"np= ";cin>>np;
Tabula(xa, xb,np,x,y);
escvec2(np+1,x,"x",y,"y");
system("PAUSE");
system("cls");
cout<<"
Metodo de Newton-Raphson \n"<< endl;
cout<<"Encontrar las raices \n"<< endl;
cout<<"Numero de raices del Polinomio= ";cin>>nr;
system("PAUSE");
system("cls");
for(i=1;i<=nr;i++)
{
cout<<"Raiz"<<"["<<i<<"]"<<endl;
cout<<"x1= ";cin>>x1;
cout<<"x2= ";cin>>x2;
cout<<"Eps= ";cin>>Eps;
cout<<"nit= ";cin>>nit;
if (newrap (x1,x2,Eps,nit,&raiz)==1)
{
cout<<"\n \n Para el intervalo x11: "<<x1<<"
Para el intervalo x12:
"<<x1<<endl;
cout<<"\n El proceso converge: "<<raiz<<"\n \n \n"<<endl;
}
else
{
cout<<"\n \n Para el intervalo x11: "<<x1<<"
Para el intervalo x12:
"<<x1<<endl;
cout<<"\n \n El proceso no converge"<< endl;
}
system("PAUSE");
system("cls");
}
system("PAUSE");
system("cls");
}
int newrap(float xa, float xb, float Eps, int nit, float *res)
{
int con, i;
float y1, y2, yp, x1, x2, x3, Ea;
con=0;
x1=xa;
x2=xb;
x1=(x1+x2)/2.0;
printf(" It
x1
x2 |xi+1 - xi| Ea
y1
y2
yp");
for(i=1; i<=nit;i++)
{
y1=f1(x1);
yp=fp1(x1);
x2=x1-y1/yp;
y2=f1(x2);
if(yp==0.0)
{
cout<<"La derivada es cero "<<endl;
system("PAUSE");
return(0);
}
if(i==1)
printf("\n %2d %8.2f %8.2f \t \t \t %8.2f %8.2f %8.2f", i , x1, x2, y1, y2,
yp);
else
{
Ea=fabs((x2-x3)/x2)*100;
printf("\n %2d %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f %8.2f", i , x1,
x2, fabs(x2-x3), Ea,y1, y2, yp);
}
if(fabs(x2-x3)<=Eps)
{
*res=x2;
con=1;
break;
}
else
{
x1=x2;
}
x3=x2;
}
return(con);
}
void Tabula(float xa, float xb, int np, float x[50], float y[50])
{
int i;
float x1, dx;
x1 = xa;
dx=(xb-xa)/np;
for (i=1; i<=np ;i++)
{
x[i]=x1;
y[i]= f1(x[i]);
x1=x1+dx;
}
}
void escvec2(int n, float x[50],char nomx[5], float y[50], char nomy[5])
{
int i;
for(i=1; i<=n; i++)
{
cout << nomx << "[" <<i<<"]="<<x[i]<<"
"<<nomy<< "["
<<i<<"]="<<y[i]<< endl;
}
}
float f1(float x)
{
return (4.0*pow(x,3)-30.0*pow(x,2)+70*x-50);
}
float fp1(float x)
{
return (12.0*pow(x,2)-60.0*x+70);
}
1.2.2.
MTODO DE LA SECANTE.
system("PAUSE");
system("cls");
cout<<"
Metodo de la Secante \n"<< endl;
cout<<"Encontrar las raices \n"<< endl;
cout<<"Numero de raices del Polinomio= ";cin>>nr;
system("PAUSE");
system("cls");
for(i=1;i<=nr;i++)
{
cout<<"Raiz"<<"["<<i<<"]"<<endl;
cout<<"x1= ";cin>>x1;
cout<<"x2= ";cin>>x2;
cout<<"Eps= ";cin>>Eps;
cout<<"nit= ";cin>>nit;
if (sec(x1,x2,Eps,nit,&raiz)==1)
{
cout<<"\n \n Para el intervalo x1: "<<x1<<"
Para el intervalo x2: "<<x2<<endl;
cout<<"\n El proceso converge: "<<raiz<<"\n \n \n"<<endl;
}
else
{
cout<<"\n \n Para el intervalo x1: "<<x1<<"
Para el intervalo x2: "<<x2<<endl;
cout<<"\n \n El proceso no converge"<< endl;
system("PAUSE");
system("cls");
}
system("PAUSE");
system("cls");
}
int sec(float xa, float xb, float Eps, int nit, float *res)
{
int i, con;
float x1, x2, x3, x4, Ea, y1, y2, y3, yp;
con=0;
x1=xa;
x2=xb;
printf(" It x1
x2
x3 |xi+1 - xi| Ea
for(i=1;i<=nit;i++)
{
y1=f1(x1);
y1
y2
y3
yp");
y2=f1(x2);
yp=(y2-y1)/(x2-x1);
x3=x2-( y2/yp );
y3=f1(x3);
if(i==1)
{
printf("\n %2d %8.4f %8.4f %8.4f \t \t \t %8.4f %8.4f %8.4f %8.4f", i , x1, x2, x3,
y1, y2, y3, yp);
}
else
{
Ea=fabs((x3-x4)/x3)*100;
printf("\n %2d %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f", i ,
x1, x2, x3, fabs(x2-x3), Ea,y1, y2, y3,yp);
if(fabs(x3-x2)<=Eps)
{
*res=x3;
con=1;
break;
}
}
x1=x2;
x2=x3;
x4=x3;
}
return(con);
}
void Tabula(float xa, float xb, int np, float x[50], float y[50])
{
int i;
float x1, dx;
x1 = xa;
dx=(xb-xa)/np;
for (i=1; i<=np ;i++)
{
x[i]=x1;
y[i]= f1(x[i]);
x1=x1+dx;
}
}
void escvec2(int n, float x[50],char nomx[5], float y[50], char nomy[5])
{
int i;
for(i=1; i<=n; i++)
{
float f1(float x)
{
return (4.0*pow(x,3)-30.0*pow(x,2)+70*x-50);
}
1)
2)
3)
Determine si hay un residuo diferente de cero. Si no, el valor inicial es perfecto y la raz
es igual a t. Si existe un residuo, se ajusta el valor inicial en forma sistemtica y se repite el
procedimiento hasta que el residuo desaparezca y se localice la raz. Una vez hecho esto, se
repite el procedimiento totalmente, ahora con el cociente para localizar otra raz.
Por lo general, el mtodo de Bairstow se basa en esta manera de proceder. Por consiguiente,
depende del proceso matemtico de dividir un polinomio entre un factor.
para i = n 1 a 0
Observe que si t es una raz del polinomio original, el residuo b0 sera igual a cero.
Para permitir la evaluacin de races complejas, el mtodo de Bairstow divide el polinomio entre
un factor cuadrtico x2 rx s. Si esto se hace con la ecuacin, el resultado es un nuevo
polinomio
n 2(x) = b2 + b3x + + bn 1xn3 + bn xn2
Con un residuo
R = b1(x r) + b0
Como con la divisin sinttica normal, se utiliza una relacin de recurrencia simple para realizar
la divisin entre el factor cuadrtico:
bn = an
bn-1 = an-1 + rbn
bi = ai + rbi+1 + sbi+2
para i = n 2 a 0
El factor cuadrtico se introduce para permitir la determinacin de las races complejas. Esto se
relaciona con el hecho de que, si los coeficientes del polinomio original son reales, las races
complejas se presentan en pares conjugados. Si x2 rx s es un divisor exacto del polinomio,
las races complejas pueden determinarse con la frmula cuadrtica. As, el mtodo se reduce
a determinar los valores de r y s que hacen que el factor cuadrtico sea un divisor exacto. En
otras palabras, se buscan los valores que hacen que el residuo sea igual a cero.
La inspeccin de la ecuacin nos lleva a concluir que para que el residuo sea cero, b0 y b1
deben ser cero. Como es improbable que los valores iniciales para evaluar r y s conduzcan a
este resultado, debemos determinar una forma sistemtica para modificar los valores iniciales,
de tal forma que b0 y b1 tiendan a cero. Para lograrlo, el mtodo de Bairstow usa una
estrategia similar a la del mtodo de NewtonRaphson. Como tanto b0 como b1 son funciones
de r y s, se pueden expandir usando una serie de Taylor y se obtiene un sistema de ecuaciones
de derivadas parciales dnde las variables son incrementos de los factores de la aproximacin
del factor cuadrtico, r y
s. Bairstow demostr que las derivadas parciales se obtienen por divisin sinttica de las b en
forma similar a como las b mismas fueron obtenidas:
en = bn
en-1 = bn-1 + ren
ei = bi + rei+1 + sei+2 para i = n 2 a 1
Las derivadas parciales se obtienen por la divisin sinttica de las b y se sustituyen en el
sistema de ecuaciones de derivadas parciales junto con las b para dar el siguiente sistema:
e2r + e3s = b1
e1r + e2s = b0
Estas ecuaciones se resuelven para r y s, las cuales, a su vez, se emplean para mejorar los
valores iniciales de r y s. En cada paso, se estima un error aproximado en r y s:
Cuando ambos errores estimados caen por debajo de un criterio especificado de terminacin
es, los valores de las races se determinan mediante:
2)
El cociente es cuadrtico. Aqu es posible evaluar directamente las dos races restantes
con la ecuacin.
3)
El cociente es un polinomio de primer grado. En este caso, la raz restante se evala
simplemente como
alpha0=(a1)/(a2);
alpha1=(a0)/(a2);
if(a2==0)
{
a2=1;
}
n=3;
for(i=0;i<=n;i++)
{
q=i-2;
b[q];
if(q==3)
{
b[3]=0;
}
if(q==2)
{
b[2]=0;
}
b[q]=a[i]-(alpha0*b[i-1])-(alpha1*b[i]);
if(q==1)
{
b[1]=a3-(alpha0*b[2])-(alpha1*b[3]);
}
if(q==0)
{
b[0]=a2-(alpha0*b[1])-(alpha1*b[2]);
}
if(q==-1)
{
b[-1]=a1-(alpha0*b[0])-(alpha1*b[1]);
}
if(q==-2)
{
b[-2]=a0-(alpha0*b[-1])-(alpha1*b[0]);
}
}
for(i=0;i<=n;i++)
{
r=i;
c[r];
}
if(r==2)
{
c[2]=0;
}
if(r==3)
{
c[3]=0;
}
}
Donde los valores de an,m y bn se calculan como (para k=1,2,3,,N 1 [Tamao del sistema]):
Donde el superndice prima indica que los elementos han cambiado sus valores originales. El
elemento ak,kse denomina el coeficiente o elemento pivote. En particular cuando dicho
elemento es cero hay una divisin entre cero y el mtodo falla, para eso en el Programa de
eliminacin Gaussiana Simple desarrollado en C++ se implementa un algoritmo que
intercambia filas hasta encontrar un elemento diferente de cero, si no se encuentra un valor
diferente a cero el programa indica que el sistema no tiene solucin o hay infinidad de
soluciones. Ya que en dado caso no habra matriz inversa del sistema o su determinante sera
igual a cero, por lo cual se llega a la misma conclusin de que no existe solucin o hay infinidad
de ellas.
Al final de la implementacin del mtodo de Eliminacin Gaussiana Simple, se llega a un
sistema donde se tiene una matriz triangular superior, cmo se muestra a continuacin.
El siguiente paso para resolver el sistema es emplear sustitucin hacia atrs. Este resultado se
puede sustituir hacia atrs en la (n 1) sima ecuacin y despegar xn 1. El procedimiento,
que se repite para evaluar las x restantes, se representa mediante la frmula:
PROGRAMA
#include <cstdlib>
#include <iostream>
#include <math.h>
#include <iomanip>
#include <stdio.h>
using namespace std;
int main(int argc, char *argv[])
{
int n, i, j, k;
float aux, a[30][30],x[30];
cout<<"Solucion de Sistema de Ecuaciones Lineales"<<endl;
cout<<"Metodo de Eliminacion de Gauss"<<endl;
cout<<" \n ";
cout<<" \n Numero de Ecuacuaciones: ";
cin>>n;
system("pause");
system("cls");
cout<<"Solucion de Sistema de Ecuaciones Lineales"<<endl;
cout<<"Metodo de Eliminacion de Gauss"<<endl;
cout<<" \n ";
cout<<" \n Dame los valores de la matriz: "<<endl;
cout<<" \n "<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n+1;j++)
{
cout<< "a[" <<i<<"]["<<j<<"]= ";
cin>> a[i][j];
}
}
system("pause");
system("cls");
for(i=1;i<=n-1;i++)
{
aux=a[i][i];
for(j=i;j<=n+1;j++)
{
a[i][j]=(a[i][j])/aux;
}
for(j=i+1;j<=n;j++)
{
aux=a[j][i];
for(k=i;k<=n+1;k++)
{
a[j][k]=(a[j][k])-((a[i][k])*aux);
}
}
}
x[n]=(a[n][n+1])/(a[n][n]);
for(i=n-1;i>=1;i--)
{
x[i]=a[i][n+1];
k=i+1;
for(j=k;j<=n;j++)
{
x[i]=(x[i])-(a[i][j])*(x[j]);
}
}
cout<<"Solucion de Sistema de Ecuaciones Lineales"<<endl;
cout<<"Metodo de Eliminacion de Gauss"<<endl;
cout<<"Solucion"<<endl;
cout<<"\n "<<endl;
for(i=1;i<=n;i++)
{
cout<<"x["<<i<<"]="<<x[i]<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
2.2. GaussJordn
El mtodo de GaussJordn es una variacin de la eliminacin de Gauss. La principal
diferencia consiste en que cuando una incgnita se elimina en el mtodo de GaussJordn,
sta es eliminada de todas las otras ecuaciones, no slo de las subsecuentes. Adems, todos
los renglones se normalizan al dividirlos entre su elemento pivote. De esta forma, el paso de
eliminacin genera una matriz identidad en vez de una triangular. En consecuencia, no es
necesario usar la sustitucin hacia atrs para obtener la solucin.
{
a[i][j]=a[i][j]/aux;
}
for(j=1;j<=n;j++)
{
if(j!=i)
{
aux=a[j][i];
for(k=i;k<=n+1;k++)
{
a[j][k]=(a[j][k])-((a[i][k])*aux);
}
}
}
}
cout<<"Solucion de Sistema de Ecuaciones Lineales"<<endl;
cout<<"Metodo de Eliminacion de Gauss-Jordan"<<endl;
cout<<"Solucion"<<endl;
cout<<"\n "<<endl;
for(i=1;i<=n;i++)
{
x[i]=a[i][n+1];
}
for(i=1;i<=n;i++)
{
x[i];
cout<<"x["<<i<<"]="<<x[i]<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
Figura 27. Resultado del programa, concuerda con el resultado del mtodo de gauss.
cin>>n;
cout<<"\n "<<endl;
leematinv(n, a);
system("pause");
system("cls");
invmat(n, a,x);
cout<<"Inversion de Matrices"<<endl;
cout<<"\n "<<endl;
cout<<"La matriz invertida es: "<<endl;
cout<<"\n "<<endl;
escmatinv(n, a , b);
system("PAUSE");
return EXIT_SUCCESS;
}
float invmat(int n, float a[30][30],float x[30])
{
int i, j, k;
float aux;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j)
{
a[i][n+j]=1.0;
}
else
{
a[i][n+j]=0;
}
}
}
for(i=1;i<=n;i++)
{
aux=a[i][i];
for(j=i;j<=2*n;j++)
{
a[i][j]=a[i][j]/aux;
}
for(j=1;j<=n;j++)
{
if(j!=i)
{
aux=a[j][i];
for(k=i;k<=2*n;k++)
{
a[j][k]=(a[j][k])-((a[i][k])*aux);
}
}
}
}
}
void leematinv(int n, float a[30][30])
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<< "a[" <<i<<"]["<<j<<"]= ";
cin>> a[i][j];
}
}
}
void escmatinv(int n, float a[30][30],float b[30][30])
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
b[i][j]=a[i][j+n];
cout<< "b[" <<i<<"]["<<j<<"]= "<<b[i][j]<<endl;
}
}
}
El criterio de convergencia que se maneja para ste mtodo es el valor absoluto de la norma
del vector de soluciones de la iteracin anterior menos la norma del vector de soluciones de la
iteracin actual, entre la norma del vector de soluciones de la iteracin anterior.
PROGRAMA
#include <cstdlib>
#include <iostream>
#include <math.h>
#include <iomanip>
#include <stdio.h>
using namespace std;
int main(int argc, char *argv[])
{
int i, j, k, con, n, nit;
float Eps, a[30][30],x[30],Xs[30],Xc[30],aux;
cout<<"Solucion de Sistema de Ecuaciones Lineales"<<endl;
cout<<"Metodo de Iterativo de Gauss"<<endl;
system("pause");
system("cls");
cout<<"Inserte el numero de ecuaciones= ";
cin>>n;
cout<<"Inserte el numero iteraciones= ";
cin>>nit;
cout<<"Inserte el Eps= ";
cin>>Eps;
system("pause");
system("cls");
for(i=1;i<=n;i++)
{
for(j=1;j<=n+1;j++)
{
cout<<"a["<<i<<"]["<<j<<"]= ";
cin>>a[i][j];
}
}
system("pause");
system("cls");
for(i=1;i<=n;i++)
{
aux=a[i][i];
for(j=1;j<=n;j++)
{
if(i==j)
{
a[i][j]=(a[i][n+1])/aux;
}
else
{
a[i][j]=(-a[i][j])/aux;
}
}
}
for(i=1;i<=n;i++)
{
Xs[i]=a[i][i];
}
for(i=1;i<=nit;i++)
{
for(j=1;j<=n;j++)
{
Xc[j]=a[j][j];
for(k=1;k<=n;k++)
{
if(j!=k)
{
Xc[j]=Xc[j]+(a[j][k]*Xs[k]);
}
}
}
con=0;
for(j=1;j<=n;j++)
{
if(fabs(Xc[j]-Xs[j])>Eps)
{
con=1;
break;
}
}
if(con==0)
{
cout<<"\n Iteraccion: "<<i<<endl;
for(j=1;j<=n;j++)
{
cout<<"\n Converge";
cout<<"\n x["<<j<<"]="<<Xc[j]<<endl;
}
break;
}
else
{
for(j=1;j<=n;j++)
{
Xs[j]=Xc[j];
}
}
}
if(con==1)
{
cout<<"\n No converge";
}
system("PAUSE");
return EXIT_SUCCESS;
}
Figura 31. Caratula para insertar los valores que ocupa el programa
Utilizando la serie de Taylor se puede hacer una aproximacin lineal para una funcin
en un incremento
como:
En forma compacta:
Donde J(x) es la matriz de primeras derivada o Jacobiano. Como se quiere encontrar el cero de
la funcin, la aproximacin lineal que se debe resolver es:
El Jacobiano es:
Y el arreglo de funciones
f ( x , y ) =x3 + x4
PROGRAMA
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <conio.h>
#include <time.h>
int main()
{
int i;
float p0, pn, er, tol; // Variables Utilizadas |
printf("\t\tMETODO DE NEWTON-RAPHSON Para encontrar la raiz de la\n");
printf("\t\t funcion F(X)= X^3 + X - 4 , en el intervalo [1,2]\n\n\n");
printf("Ingrese aproximacion inicial P[0] = ");
scanf("%f",&p0);
printf("\nIngrese tolerancia Tol = ");
scanf("%f",&tol);
printf("\n\n\t Pn\t\t\tPorcentaje de Error\n\n");
i=1; // Valores Iniciales
er=1;
while (er>=tol)
{
pn = p0 - (((pow(p0,3)+ p0-4))/(3*(pow(p0,2))-1)); // Clculo de Sucesiones
er=(fabs((pn-p0)/pn)); // Clculo de errores
printf(" P[%d]= %f\t\t",i, pn); // Impresin de resultados
printf("porc. error = %f \n",er);
i=i+1; // Contador n-simo termino
p0=pn; // Redefinicin de Pn
}
printf("\n\nPor lo tanto la RAIZ es = %f", p0); // Impresin Solucin
printf("\n\nEncontrado con %d Iteraciones\n\n", i-1);
system("pause"); //Finaliza y cierra el programa
}
4.
AJUSTE DE CURVAS
Es comn que los datos se dan como valores discretos a lo largo de un continuo. Sin embargo,
quizs usted requiera la estimacin de un punto entre valores discretos. Adems, usted puede
necesitar la versin simplificada de una funcin complicada. Una manera de hacerlo es calcular
valores de la funcin en un nmero discreto de valores en el intervalo de inters. Despus, se
obtiene una funcin ms simple para ajustar dichos valores. Estas dos aplicaciones se conocen
como ajuste de curvas.
Existen dos mtodos generales para el ajuste de curvas que se distinguen entre s al
considerar la cantidad de error asociado con los datos. Primero, si los datos exhiben un grado
significativo de error o ruido, la estrategia ser obtener una sola curva que represente la
tendencia general de los datos. Como cualquier dato individual puede ser incorrecto, no se
busca intersecar todos los puntos. En lugar de esto, se construye una curva que siga la
tendencia de los puntos tomados como un grupo. Un procedimiento de este tipo se llama
regresin por mnimos cuadrados.
Segundo, si se sabe que los datos son muy precisos, el procedimiento bsico ser colocar una
curva o una serie de curvas que pasen por cada uno de los puntos en forma directa.
Usualmente tales datos provienen de tablas. Como ejemplos se tienen los valores de la
densidad del agua o la capacidad calorfica de los gases en funcin de la temperatura. La
estimacin de valores entre puntos discretos bien conocidos se llama interpolacin.
Donde todas las sumatorias van desde i = 1 hasta n. Observe que las tres ecuaciones
anteriores son lineales y tienen tres incgnitas: a0, a1 y a2. Los coeficientes de las incgnitas
se evalan de manera directa, a partir de los datos observados. En este caso, observamos que
el problema de determinar un polinomio de segundo grado por mnimos cuadrados es
El anlisis anterior se puede extender fcilmente a este caso ms general. As, se reconoce
que la determinacin de los coeficientes de un polinomio de msimo grado es equivalente a
resolver un sistema de m + 1 ecuaciones lineales simultneas. En forma general, para ajustar a
un polinomio de grado n, se tiene:
PROGRAMA
#include<iostream>
#include<cstdlib>
#include<stdio.h>
#include<math.h>
#include<iomanip>
using namespace std;
void leevec(int, float [30], char [30]);
int main(int argc, char *argv[])
{
int n, i, j,k,l;
float x[30],y[30], b[30],pol[30][30],aux[30],p[30],v1[30],v2[30],v3[30],a[30],m;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
pol[i][j]=0;
}
}
for(i=1;i<=n;i++)
{
k=1;
for(j=1;j<=n;j++)
{
if(i!=j)
{
aux[k]=j;
k=k+1;
}
for(j=1;j<=n;j++)
{
v1[j]=0;
v2[j]=0;
}
v1[1]=1;
v1[2]=-m*(aux[1]);
for(j=2;j<=n-1;j++)
{
for(k=1;k<=j;k++)
{
v2[k+1]=v1[k]*(-m*(aux[j]));
}
for(k=1;k<=j;k++)
{
v1[k]=v1[k]+v2[k];
}
for(k=1;k<=j;k++)
{
v2[k]=0;
}
}
}
for(j=1;j<=n;j++)
{
pol[i][j]=v1[j]*b[i];
}
}
for(i=1;i<=n;i++)
{
p[i]=0;
for(j=1;j<=n;j++)
{
p[i]=p[i]+pol[j][i];
}
}
cout<<"El valor del polinomio son:"<<endl;
for(i=1;i<=n;i++)
{
cout<<"p["<<i<<"]="<<p[i]<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
void leevec(int n, float a[30], char nom[30])
{
int i;
for(i=1;i<=n;i++)
{
cout<<nom<<"["<<i<<"]=";
cin>>a[i];
}
}
Figura 35. Pantalla de inicio para introducir los datos del polinomio y los puntos de
interpolacin.
Reordenndose se tiene:
Que es una frmula de interpolacin lineal. La notacin f1(x) designa que ste es un polinomio
de interpolacin de primer grado. Observe que adems de representar la pendiente de la lnea
que une los puntos, el trmino [f(x1) f(x0)]/(x1 x0) es una aproximacin en diferencia
dividida finita a la primer derivada. En general, cuanto menor sea el intervalo entre los datos,
mejor ser la aproximacin. Esto se debe al hecho de que, conforme el intervalo disminuye,
una funcin continua estar mejor aproximada por una lnea recta.
Figura 37. Ejemplos de interpolacin polinomial: a) de primer grado (lineal) que une dos
puntos, b) de segundo grado (cuadrtica o parablica) que une tres puntos y
c) de tercer grado (cbica) que une cuatro puntos.
Si se tienen tres puntos como datos, stos pueden ajustarse en un polinomio de segundo grado
(tambin conocido como polinomio cuadrtico o parbola). Una forma particularmente
conveniente para ello es
f2(x) = b0 + b1(x x0) + b2(x x0)(x x1)
Observe que aunque la ecuacin parece diferir del polinomio general
f(x) = a0 + a1x + a2x2 + + anxn, las dos ecuaciones son equivalentes.
El anlisis anterior puede generalizarse para ajustar un polinomio de nsimo grado a n+ 1
datos.
El polinomio de nsimo grado es
fn(x) = b0 + b1(x x0) + + bn(x x0) (x x1) (x xn1)
Como se hizo antes con las interpolaciones lineales y cuadrticas, los puntos asociados con
datos se utilizan para evaluar los coeficientes b0, b1,..., bn.
Para un polinomio de nsimo grado se requieren n + 1 puntos: [x0, f(x0)], [x1, f(x1)],..., [xn,
f(xn)]. Se usan estos datos y las siguientes ecuaciones para evaluar los coeficientes:
Donde las evaluaciones de la funcin colocadas entre parntesis son diferencias divididas
finitas. Por ejemplo, la primera diferencia dividida finita en forma general se representa como:
La segunda diferencia dividida finita, que representa la diferencia de las dos primeras
diferencias divididas, se expresa en forma general como:
Estas diferencias sirven para evaluar los coeficientes en las ecuaciones, los cuales se
sustituirn en la ecuacin para obtener el polinomio de interpolacin
PROGRAMA
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include<conio.h>
#include<stdio.h>
#include<math.h>
using namespace std;
void leemat(int ,int , float [50][50]);
void leevec (int , float [50], char [5]);
void leevec(int, float [20], char [5]);
main()
{
int i,j,k,m,n;
float x[50],y[50],a[50],dif[50][50],difdiv[50][50],b[50],pol[50]
[50],p[50],sumx[50],sumxy[20];
cout<<"Diferencias Divididas de Newton";
cout<<"Numero de Puntos= ";cin>>n;
leevec(n,x,"X");
leevec(n,y,"Y");
for(i=1;i<=n;i++)
{
dif[i][1]=y[i];
}
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-i;j++)
dif[j][i+1]=(dif[j+1][i]-dif[j][i])/(x[i+j]-x[j]);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
difdiv[i][j]=0.0;
}
for(j=1;j<=n;j++)
{
difdiv[j][1]=y[j];
}
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-i;j++)
difdiv[j][i+1]=(difdiv[j+1][i]-difdiv[j][i])/(x[i+j]-x[j]);
}
for(i=1;i<=n;i++)
{
b[i]=difdiv[1][i];
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
pol[i][j]=0.0;
}
pol[1][1]=1;
pol[2][1]=1;
pol[2][2]=-x[1];
for(i=2;i<=n;i++)
{
for(j=1;j<=i;j++)
{
pol[i+1][j+1]=pol[i][j]*(-x[i]);
}
for(j=1;j<=i;j++)
{
pol[i+1][j]=pol[i+1][j]+pol[i][j];
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
pol[i][j]=pol[i][j]*b[i];
}
}
for(i=1;i<=n-1;i++)
{
k=2;
p[n+1-i]=pol[i][1];
for(j=i+1;j<=n;j++)
{
p[n+1-i]=p[n+1-i]+pol[j][k];
k=k+1;
}
}
p[1]=pol[n][1];
for(i=1;i<=n;i++)
{
cout<<"\n";
cout<<"["<<i<<"]="<<x[i];
}
}
void leevec(int n, float X[20], char nom[5])
{
int i;
for(i=1;i<=n;i++)
{
cout<<nom<<"["<<i<<"]=";
cin>>X[i];
}
}
Figura 39. Pantalla de inicio para ingresar los valores de los puntos.
Donde
if(i!=j)
{
aux[k]=j;
k=k+1;
}
for(j=1;j<=n;j++)
{
v1[j]=0;
v2[j]=0;
}
v1[1]=1;
v1[2]=-x[aux[1]];
for(j=2;j<=n-1;j++)
{
for(k=1;k<=j;k++)
{
v2[k+1]=v1[k]*(-
x[aux[j]]);
for(k=1;k<=j;k++)
{
v1[k]=v1[k]+v2[k];
}
for(k=1;k<=j;k++)
{
}
v2[k]=0;
}
for(j=1;j<=n;j++)
{
pol[i][j]=v1[j]*b[i];
}
}
for(i=1;i<=n;i++)
{
p[i]=0;
for(j=1;j<=n;j++)
{
p[i]=p[i]+pol[j][i];
}
}
cout<<"El valor del polinomio son:"<<endl;
for(i=1;i<=n;i++)
{
cout<<"p["<<i<<"]="<<p[i]<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
for(i=1;i<=n;i++)
{
b[i]=1;
for(j=1;j<=n;j++)
{
if(i!=j)
{
b[i]=b[i]*(x[i]-x[j]);
}
b[i]=y[i]/b[i];
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
pol[i][j]=0;
}
}
for(i=1;i<=n;i++)
{
k=1;
for(j=1;j<=n;j++)
{
if(i!=j)
{
aux[k]=j;
k=k+1;
}
for(j=1;j<=n;j++)
{
v1[j]=0;
v2[j]=0;
}
v1[1]=1;
v1[2]=-x[aux[1]];
for(j=2;j<=n-1;j++)
{
for(k=1;k<=j;k++)
{
v2[k+1]=v1[k]*(-
x[aux[j]]);
}
for(k=1;k<=j;k++)
{
v1[k]=v1[k]+v2[k];
}
for(k=1;k<=j;k++)
{
}
v2[k]=0;
}
for(j=1;j<=n;j++)
{
pol[i][j]=v1[j]*b[i];
}
}
for(i=1;i<=n;i++)
{
p[i]=0;
for(j=1;j<=n;j++)
{
p[i]=p[i]+pol[j][i];
}
}
cout<<"El valor del polinomio son:"<<endl;
for(i=1;i<=n;i++)
{
cout<<"p["<<i<<"]="<<p[i]<<endl;
}
fx(0)= 2.10 fx(1)= 7.70 fx(2)= 13.60 fx(3)= 27.20 fx(4)= 40.90 fx(5)= 61.10
/n El polinomio de Lagrange :
Process exited after 29.03 seconds with return value 0 Presione una tecla para continuar . . .
V.
(65)
Y sea
(66)
Esta frmula se aplica paso a paso para calcular un valor posterior y, por lo tanto, para trazar la
trayectoria de la solucin. Todos los mtodos de un paso que se expresen de esta forma
general, tan slo van a diferir en la manera en la que se estima la pendiente. En otras palabras,
se toma la pendiente al inicio del intervalo como una aproximacin de la pendiente promedio
sobre todo el intervalo. Tal procedimiento, llamado mtodo de Euler. Despus se revisa otro
mtodo de un paso que emplean otras formas de estimar la pendiente que dan como resultado
predicciones ms exactas. Todas estas tcnicas en general se conocen como mtodos de
RungeKutta.
Mtodo de Euler
La primera derivada ofrece una estimacin directa de la pendiente en xi
fp(x,y)(exp(x)*2*cos(2*x)exp(x)*sin(2*x))
Como el programa proporciona tambin los puntos de la solucin original, se define tambin
f(x,y)(sin(2*x)*exp(x))
En las directivas #define, la cul es la solucin a dicha EDO. El programa muestra en forma
tabulada los resultados paso a paso.
yi
ytrue
f(x,y)
+0.000000+0.000000+0.000000+2.000000
+0.300000+0.600000+0.418297+0.804550
+0.600000+0.841365+0.5115140.113782
+0.900000+0.807230+0.3959370.580684
+1.200000+0.633025+0.2034460.647643
+1.500000+0.438732+0.0314880.473282
+1.800000+0.2967480.0731480.223318
+2.100000+0.2297520.1067300.013341
+2.400000+0.2257500.090370+0.106245
+2.700000+0.2576240.051934+0.137244
+3.000000+0.2987970.013911+0.109519
+3.300000+0.331652+0.011491+0.058605
+3.600000+0.349234+0.021686+0.011559
+3.900000+0.352701+0.0202120.018028
+4.200000+0.347293+0.0128150.028389
+4.500000+0.338776+0.0045780.024822
+4.800000+0.3313300.0014350.014773
+5.100000+0.3268980.0042670.004442
+5.400000+0.3255650.004430+0.002675
+5.700000+0.3263680.003076+0.005709
+6.000000+0.3280800.001330+0.005513
+6.300000+0.329735+0.000062+0.003609
Process exited after 64.68 seconds with return value 0 Presione una tecla para continuar . . .
(70)
Observe que con las EDO que estn en funcin slo de x, el mtodo RK clsico de cuarto
orden es similar a la regla de Simpson 1/3. Adems, el mtodo RK de cuarto orden tiene
similitud con el procedimiento de Heun en cuanto a que se usan mltiples estimaciones de la
pendiente para obtener una mejor pendiente promedio en el intervalo. Como se muestra en la
figura 5.2, cada una de las k representa una pendiente.
Para RK de 4to orden, se usa la misma funcin que se us para Euler, con el mismo paso y
condiciones iniciales.
yi
y true k1
k2
k3
k4
Pend tot
+0.000000+0.000000+0.000000+2.000000+1.390175+1.390175+0.804550+0.418262
+0.300000+0.418262+0.418297+0.804550+0.293241+0.2932410.113782+0.093187
+0.600000+0.511449+0.5115140.1137820.4043550.4043550.5806840.115594
+0.900000+0.395855+0.3959370.5806840.6553990.6553990.6476430.192496
+1.200000+0.203359+0.2034460.6476430.5795380.5795380.4732820.171954
+1.500000+0.031405+0.0314880.4732820.3489960.3489960.2233180.104629
+1.8000000.0732250.0731480.2233180.1087110.1087110.0133410.033575
+2.1000000.1068000.1067300.013341+0.058595+0.058595+0.106245+0.016364
+2.4000000.0904350.090370+0.106245+0.131315+0.131315+0.137244+0.038438
+2.7000000.0519980.051934+0.137244+0.128421+0.128421+0.109519+0.038022
+3.0000000.0139760.013911+0.109519+0.084972+0.084972+0.058605+0.025401
+3.300000+0.011425+0.011491+0.058605+0.033428+0.033428+0.011559+0.010194
+3.600000+0.021619+0.021686+0.0115590.0057550.0057550.0180280.001475
+3.900000+0.020144+0.0202120.0180280.0253840.0253840.0283890.007398
+4.200000+0.012747+0.0128150.0283890.0278820.0278820.0248220.008237
+4.500000+0.004510+0.0045780.0248220.0201650.0201650.0147730.006013
+4.8000000.0015030.0014350.0147730.0093560.0093560.0044420.002832
+5.1000000.0043350.0042670.0044420.0003750.000375+0.0026750.000163
+5.4000000.0044980.004430+0.002675+0.004677+0.004677+0.005709+0.001355
+5.7000000.0031440.003076+0.005709+0.005924+0.005924+0.005513+0.001746
+6.0000000.0013980.001330+0.005513+0.004678+0.004678+0.003609+0.001392
+6.3000000.000006+0.000062+0.003609+0.002469+0.002469+0.001387+0.000744
Process exited after 47.91 seconds with return value 0 Presione una tecla para continuar . . .
Se modific el cdigo original para aplicar el mtodo por separado, para ejecutar un script
(exp_sin_b_2.m) por separado llamando a las funciones originales, en ste caso el mtodo de
Euler, cmo su funcin es la primera en ser llamada, es en el que se grafica la funcin original,
ese cdigo se omite en las funciones de los dems mtodos. Los archivos .m por separado,
estn programados para proporcionar la grfica del mtodo en comparacin con la funcin
original, que se introduzca su derivada, cada funcin recibe dicha funcin y calcula su primitiva
para ser comparada; adems se proporcionan los valores en forma tabulada.
Nota: En los archivos .m originales, hay vario cdigo en comentarios, la mayora es significativo
y sin gran relevancia, ya que se fue perfeccionando poco a poco hasta corregir errores de
programacin y se omite en ste documento. Hay otro cdigo que se puede usar para
proporcionar valores que se omiten en las tabulaciones. Al final de ste texto, se agregan los
cdigos de las funciones utilizadas.
Para b=2
syms x f;
f='exp(-x)*(2*cos(2*x)-sin(2*x))'; ti=0;
tf=2*pi; Xi=0; Yi=0; h=0.3;
Euler_Method(f,ti,tf,Xi,Yi,h); Heun_Method(f,ti,tf,Xi,Yi,h); Mid_Method(f,ti,tf,Xi,Yi,h);
Runge_Kutta2_Ralston(f,ti,tf,Xi,Yi,h); Runge_Kutta3(f,ti,tf,Xi,Yi,h); Runge_Kutta4(f,ti,tf,Xi,Yi,h);
Runge_Kutta5_Butcher(f,ti,tf,Xi,Yi,h);
title('Comparacin de los mtodos de Runge Kutta con la funcin original');
xlabel('Tiempo t (seg)');
ylabel('f(t)');
legend('Euler','Solucin verdadera','Heun','Punto Medio','Ralston','Runge Kutta 3', 'Runge Kutta
4','Runge Kutta 5 (Butcher)');
1.2
0.8
0.6
Euler
Solucin verdadera Heun
Punto Medio Ralston
Runge Kutta 3
Runge Kutta 4
Runge Kutta 5 (Butcher)
0.4
0.2
-0.2
Tiempo t (seg)
Figura 5.5 Comparacin grafica de los mtodos de Runge Kutta, para la EDO.
primitiva = sin(2*x)*exp(-x)
i
Y_Verdadero Y_Euler
Pendiente
Y+1_Euler
B=
0.8072
0.6330
0.4387
0.2967 -0.4733
0.2967
0.2298 -0.2233
0.2298
0.2257 -0.0133
0.2257
10.0000
3.0000 -0.0139
11.0000
12.0000
13.0000
14.0000
0.3473
15.0000
0.3388
16.0000
4.8000 -0.0014
0.3313 -0.0248
0.3313
17.0000
5.1000 -0.0043
0.3269 -0.0148
0.3269
18.0000
5.4000 -0.0044
0.3256 -0.0044
0.3256
19.0000
5.7000 -0.0031
20.0000
6.0000 -0.0013
x
B
Y_Verdadero Y_Heun
=
0
-0.0368
2.1000 -0.1067
-0.0722
2.4000 -0.0904
-0.0583
2.7000 -0.0519
-0.0218
3.0000 -0.0139
0.0152
0.0291
5.1000 -0.0043
0.0262
5.4000 -0.0044
0.0260
5.7000 -0.0031
0.0272
6.0000 -0.0013
0.0289
B=
Y_Verdadero
Y_Punto_Medio
0
0.3000 0.4183 0.4171
0.6000 0.5115 0.5050
0.9000 0.3959 0.3837
1.2000 0.2034 0.1871
1.5000 0.0315 0.0132
1.8000 -0.0731
-0.0915
2.1000 -0.1067
-0.1241
2.4000 -0.0904
-0.1065
2.7000 -0.0519
-0.0671
3.0000 -0.0139
-0.0286
-0.0168
5.1000 -0.0043
-0.0196
5.4000 -0.0044
-0.0197
5.7000 -0.0031
-0.0183
6.0000 -0.0013
-0.0166
x
B
Y_Verdadero Y_Runge_Kutta2_Ralston
=
0
-0.0642
2.1000 -0.1067
-0.0982
2.4000 -0.0904
-0.0825
2.7000 -0.0519
-0.0446
3.0000 -0.0139
-0.0068
0.0059
5.1000 -0.0043
0.0031
5.4000 -0.0044
0.0029
5.7000 -0.0031
0.0042
6.0000 -0.0013
0.0060
B=
Y_Verdadero
Y_Runge_Kutta3
0
0.3000 0.4183 0.4183
0.6000 0.5115 0.5114
0.9000 0.3959 0.3959
1.2000 0.2034 0.2034
1.5000 0.0315 0.0314
1.8000 -0.0731
-0.0732
2.1000 -0.1067
-0.1068
2.4000 -0.0904
-0.0904
2.7000 -0.0519
-0.0520
3.0000 -0.0139
-0.0140
-0.0015
5.1000 -0.0043
-0.0043
5.4000 -0.0044
-0.0045
5.7000 -0.0031
-0.0031
6.0000 -0.0013
B=
Y_Verdadero
Y_Runge_Kutta4
0
0.3000 0.4183 0.4183
0.6000 0.5115 0.5114
0.9000 0.3959 0.3959
1.2000 0.2034 0.2034
-0.0014
-0.0732
2.1000 -0.1067
-0.1068
2.4000 -0.0904
-0.0904
2.7000 -0.0519
-0.0520
3.0000 -0.0139
-0.0140
-0.0015
5.1000 -0.0043
-0.0043
5.4000 -0.0044
-0.0045
5.7000 -0.0031
6.0000 -0.0013
-0.0014
B=
Y_Verdadero
Y_Runge_Kutta5_Butcher
-0.0031
0
0.3000 0.4183 0.4183
0.6000 0.5115 0.5115
0.9000 0.3959 0.3959
1.2000 0.2034 0.2034
1.5000 0.0315 0.0315
1.8000 -0.0731
-0.0731
2.1000 -0.1067
-0.1067
2.4000 -0.0904
-0.0904
2.7000 -0.0519
-0.0519
3.0000 -0.0139
-0.0139
-0.0014
5.1000 -0.0043
-0.0043
5.4000 -0.0044
-0.0044
5.7000 -0.0031
-0.0031
6.0000 -0.0013
-0.0013
end
x=x1(u); y3(u)=eval(primitiva);
hold on plot(x1,y3,'-b')
disp(' i
Y_Verdadero Y_Euler
Pendiente Y+1_Euler')
y2(1)=Yi;
A(1)=0;
for k=1:n
x=x1(k);
y=y1(k); fp(k+1)=eval(f);
y2(k+1)=y1(k)+(fp(k+1))*h; y=y2(k+1);
x=x1(k+1); fp2(k+1)=eval(f);
feval(k+1)=(fp(k+1)+fp2(k+1))/2; y1(k+1)=y1(k)+feval(k+1)*h; A(k+1,1)=k;
end
plot(x1,y1,'-g') primitiva=int(sym(f)); Q=length(x1);
for u=1:Q
x=x1(u); y4(u)=eval(primitiva);
end
disp(' x
end
y1(1)=Yi;
y2(1)=Yi;
A(1)=0;
for k=1:n
x=x1(k);
y=y1(k); fp(k+1)=eval(f);
y2(k+1)=y1(k)+((fp(k+1))*h)/2; y=y2(k+1);
x=x1(k)+h/2; fp2(k+1)=eval(f); y1(k+1)=y1(k)+(fp2(k+1))*h; A(k+1,1)=k;
end
plot(x1,y1,'-m') primitiva=int(sym(f)); Q=length(x1);
for u=1:Q
x=x1(u); y4(u)=eval(primitiva);
end
disp(' x
end
end
end
end
end
x=x1(k)+(3/4)*h;
k5(k+1)=eval(f);
y6(k+1)=y1(k)-(3/7)*(k1(k+1))*h+(2/7)*(k2(k+1))*h+(12/7)*(k3(k+1))*h(12/7)*(k4(k+1))*h+(8/7)*(k5(k+1))*h;
y=y6(k+1); x=x1(k)+h; k6(k+1)=eval(f);
y1(k+1)=y1(k)+(1/90)*(7*(k1(k+1))+32*(k3(k+1))+12*(k4(k+1))+32*(k5(k+1))+
7*(k6(k+1)))*h; A(k+1,1)=k;
end plot(x1,y1,'xk')
primitiva=int(sym(f)) Q=length(x1);
for u=1:Q
x=x1(u); y4(u)=eval(primitiva);
end
disp(' x
end