Está en la página 1de 22

INSTITUTO POLITÉCNICO NACIONAL

ESCUELA SUPERIOR DE INGENIERÍA MECÁNICA Y ELÉCTRICA


INGENIERÍA EN COMUNICACIONES Y ELECTRÓNICA

ANALISIS NUMERICO
DOCENTE: CALZADA SERAFIN FELIPE

PRACTICA 7
METODO DE LA SECANTE

2020303263
GARCIA MARTINEZ LESLIE
GRUPO: 4CV9

FECHA DE ENTREGA: 29/09/21


INTRODUCCION
Un problema potencial en la implementación del método de Newton-Raphson es la
evaluación de la derivada. Aunque esto no es un inconveniente para los polinomios ni para
muchas otras funciones, existen algunas funciones cuyas derivadas en ocasiones resultan
muy difíciles de calcular. En dichos casos, la derivada se puede aproximar mediante una
diferencia finita dividida hacia atrás

Esta aproximación se sustituye en la ecuación para obtener la siguiente ecuación


iterativa

Esta ecuación es la fórmula para el método de la secante. Observe que el método


requiere de dos valores iniciales de x. Sin embargo, debido a que no se necesita que f(x)
cambie de signo entre los valores dados, este método no se clasifica como un método
cerrado.

GML 1
CODIFICACION
//GARCIA MARTINEZ LESLIE - 4CV9
#include <iostream>
#include <graphics.h>
#include<math.h>
#include <cstdlib>
#include <windows.h>
#include <iomanip>
#include <4CV9_GML_P.h>
using namespace std;
int e;
const int ANCHO = 720, ALTO = 720;
class Polinomio
{
private:
int grado,gradop;
double coef[100];
double coefp[100];
double pto,pta,delta;
public:
void pedirDatos();
void pedirCoeficientes();
void derivar();
void mostrarPolinomio();
double retdelta()
{
return delta;
}
double retpto()

GML 2
{
return pto;
}
double retpta()
{
return pta;
}

double backcoof(int n,int i)


{
if(i==0)
{
return coef[n];
}
else
{
return coefp[n];
}
}
double backgrado(int n)
{
if(n==0)
{
return grado;
}
else
{
return gradop;
}
}

GML 3
};
void Polinomio::derivar()
{
int i,g,j;
g=grado;
j=g;
for(i=0;i<j+1;i++,g--)
{
coefp[i]=g*coef[i];
}
gradop=grado-1;
}
void Polinomio::mostrarPolinomio()
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, (FOREGROUND_GREEN |
FOREGROUND_GREEN | FOREGROUND_GREEN));
cout<<endl<<"\t\t-- Polinomio ingresado --"<<endl;
SetConsoleTextAttribute(hConsole, (FOREGROUND_RED |
FOREGROUND_GREEN | FOREGROUND_BLUE));
int i,n,gr;
n=grado+1;
gr=grado;
cout<<"\t\t ";
for(i=0;i<n;i++,gr--)
{
if(gr==0)
{
cout<<coef[i]<<endl;
return ;

GML 4
}
cout<<coef[i]<<"x^"<<gr<<" + ";
}
}
void Polinomio::pedirDatos()
{

cout<<endl<<"\tIngresa el punto de origen x-1: ";


cin>>pta;
cout<<"\tIngresa el punto de origen x0: ";
cin>>pto;
cout<<"\tIngresa el tamanio de paso delta: ";
cin>>delta;
}

void Polinomio::pedirCoeficientes()
{
/*cout<<endl<<"Ingrese los coeficientes del polinomio: "<<endl<<endl;
int n,i;
n=grado+1;
for(i=0;i<n;i++)
{
cout<<"x^"<<i<<": ";
cin>>coef[i];
}*/
cout<<endl<<"\tIngresa el grado del polinomio: ";
cin>>grado;
cout<<endl<<"\tIngresa el polinomio"<<endl;
int n,i, xx;
n=grado+1;

GML 5
xx=grado;
for(i=0;i<n;i++)
{
cout<<"\t -Coeficiente de x^"<<xx<<": ";
cin>>coef[i];
xx--;
}
}
class funcion:public Polinomio{
private:
double c,fc,fp;
public:
void leer(double n){
c=n;
}
void evaluar(){
int i,j,g,h;
fc=0;
fp=0;
g=backgrado(0);
h=backgrado(1);
for(i=0,j=g;i<g+1;i++,j--)
{
fc=(backcoof(i,0)*pow(c,j))+fc;
}
for(i=0,j=h;i<h+1;i++,j--)
{
fp=(backcoof(i,1)*pow(c,j))+fp;
}
}

GML 6
double resultado(int n){
if(n==0)
{
return fc;
}
else
{
return fp;
}
}
};

class secante:public funcion


{
private:
double xa,xo,fxa,fxo,xi,e;
public:
void iniciar1()
{
xo=retpto();
xa=retpta();
}
double metodo1()
{
leer(xa);
evaluar();
fxa=resultado(0);
leer(xo);
evaluar();
fxo=resultado(0);

GML 7
xi=xo-((fxo*(xa-xo))/(fxa-fxo));
return xi;
}
double calcuerror()
{
e=(fabs((xi-xo)/xi))*100;
xa=xo;
xo=xi;
return e;
}
};
class newton:public secante
{
private:
double fcxo,fxo,erro,xi,fprima,xo;
public:
double metodo()
{
leer(xo);
evaluar();
fcxo=resultado(0);
fprima=resultado(1);
xi=(xo-(fcxo/fprima));
return xi;
}
double errorr()
{
erro=(fabs(xi-xo)/xi)*100;
xo=xi;
return erro;

GML 8
}
void inciar()
{
xo=retpto();
}
};

class modificada:public newton


{
private:
double delta,xo,xd,fxos,fxd,xi,p;
public:
void starter()
{
delta=retdelta();
xo=retpto();
}
double metodo2()
{
xd=xo+delta*xo;
leer(xo);
evaluar();
fxos=resultado(0);
leer(xd);
evaluar();
fxd=resultado(0);
xi=(xo-(fxos*delta*xo)/(fxd-fxos));
return xi;
}
double geterror()

GML 9
{
p=(fabs((xi-xo)/xi))*100;
xo=xi;
return p;
}
};

void dibujarLinea( int moverX, int moverY, int dibujarX, int dibujarY, int color, int textoX,
int textoY, char *nombre ) {
moveto ( moverX, moverY );
setcolor ( color );
lineto ( dibujarX, dibujarY );
outtextxy( textoX, textoY, nombre );
}
void dibujarExponente ( int e ){
float x, y;
for ( x = -360 ; x <= 360; x += 0.01 ) {
y = pow ( x , e ) / 100;
putpixel( 360 + x ,360 - y , YELLOW );
}
}
void pintarPlano ( ) {
initwindow( ANCHO, ALTO );
dibujarLinea( 0, ALTO / 2, ANCHO, ALTO / 2, WHITE, ANCHO - 20, ALTO / 2 + 10,
"X" );
dibujarLinea( ANCHO / 2, 0, ANCHO / 2, ALTO, WHITE, ANCHO / 2 + 10, 0, "Y" );
}

int main()

GML 10
{
PORTADA();
system("PAUSE>NULL");
system("cls");
modificada A;
int i=1,j=1,k=1;
double s,error,tolerancia,error1,raiz,raiz2,error2;
char opcion;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
do{
system("cls");
SetConsoleTextAttribute(hConsole, (FOREGROUND_RED |
FOREGROUND_RED | FOREGROUND_RED));
cout << endl << "\t\t\t ==== PROPORCIONE LOS DATOS ====" <<endl;
SetConsoleTextAttribute(hConsole, (FOREGROUND_RED |
FOREGROUND_GREEN | FOREGROUND_BLUE));
A.pedirCoeficientes();
A.mostrarPolinomio();
cout<<endl<<"\t\t El polinomio es correcto? [";
SetConsoleTextAttribute(hConsole, (FOREGROUND_GREEN |
FOREGROUND_GREEN | FOREGROUND_GREEN));
cout<<"s";
SetConsoleTextAttribute(hConsole, (FOREGROUND_RED |
FOREGROUND_GREEN | FOREGROUND_BLUE));
cout<<"/"; SetConsoleTextAttribute(hConsole, (FOREGROUND_RED |
FOREGROUND_RED | FOREGROUND_RED));
cout<<"n"; SetConsoleTextAttribute(hConsole, (FOREGROUND_RED |
FOREGROUND_GREEN | FOREGROUND_BLUE));
cout<<"] ";
cin>>opcion;

cout << "\n\n\t GRAFICACION "<< endl;

GML 11
cout << " \tPara visualizar su grafica, reingrese el grado del polinomio: ";
cin >> e;
pintarPlano();
dibujarExponente( e );
getch();
closegraph();
cout<<"\t\tGraficacion finalizada."<<endl;
system("pause>null");

}
while((opcion=='n')||(opcion=='N'));
A.pedirDatos();
A.inciar();
A.iniciar1();
A.starter();
A.derivar();
cout<<endl<<"\tIngrese la tolerancia: ";
cin>>tolerancia;
system("pause>null");
system("cls");
SetConsoleTextAttribute(hConsole, (FOREGROUND_GREEN |
FOREGROUND_BLUE | FOREGROUND_BLUE));
cout<<endl<<endl<<"\t\t\t\t ========= S E C A N T E
========="<<endl<<endl<<endl;
SetConsoleTextAttribute(hConsole, (FOREGROUND_RED | FOREGROUND_GREEN
| FOREGROUND_BLUE));
SetConsoleTextAttribute(hConsole, (FOREGROUND_BLUE | FOREGROUND_BLUE
| FOREGROUND_BLUE));
cout<<"\t\t\tIt";
SetConsoleTextAttribute(hConsole, (FOREGROUND_GREEN |
FOREGROUND_GREEN | FOREGROUND_GREEN));
cout<<"\t\t\tXi";

GML 12
SetConsoleTextAttribute(hConsole, (FOREGROUND_RED |
FOREGROUND_RED | FOREGROUND_RED));
cout<<"\t\t\t\tError"<<endl<<endl;
SetConsoleTextAttribute(hConsole, (FOREGROUND_RED |
FOREGROUND_GREEN | FOREGROUND_BLUE));
do{
raiz=A.metodo1();
error1=A.calcuerror();
cout<<"\t\t\t"<<j<<"\t\t"<<setw(20)<<setprecision(15)<<raiz<<"\t"<<"\t"<<error1<<end
l;
j++;
}while(error1>tolerancia);
cout << endl;
system("pause>null");
system("cls");
SetConsoleTextAttribute(hConsole, (FOREGROUND_GREEN |
FOREGROUND_BLUE | FOREGROUND_BLUE));
cout<<endl<<endl<<"\t\t\t ====== S E C A N T E M O D I F I C A D A
======"<<endl<<endl<<endl;
SetConsoleTextAttribute(hConsole, (FOREGROUND_RED | FOREGROUND_GREEN
| FOREGROUND_BLUE));
SetConsoleTextAttribute(hConsole, (FOREGROUND_BLUE | FOREGROUND_BLUE
| FOREGROUND_BLUE));
cout<<"\t\t\tIt";
SetConsoleTextAttribute(hConsole, (FOREGROUND_GREEN |
FOREGROUND_GREEN | FOREGROUND_GREEN));
cout<<"\t\t\tXi";
SetConsoleTextAttribute(hConsole, (FOREGROUND_RED |
FOREGROUND_RED | FOREGROUND_RED));
cout<<"\t\t\t\tError"<<endl<<endl;
SetConsoleTextAttribute(hConsole, (FOREGROUND_RED |
FOREGROUND_GREEN | FOREGROUND_BLUE));
do{

GML 13
raiz2=A.metodo2();
error2=A.geterror();
cout<<"\t\t\t"<<k<<"\t\t"<<setw(20)<<setprecision(15)<<raiz2<<"\t"<<"\t"<<error2<<e
ndl;
k++;
}while(error2>tolerancia);
SetConsoleTextAttribute(hConsole, (FOREGROUND_RED |
FOREGROUND_GREEN | FOREGROUND_GREEN));
if(i<j)
{
if(i<k)
{
cout<<endl<<"El metodo mas eficiente fue Secante";
return 0;
}
else
{
cout<<endl<<"El metodo mas eficiente fue Secante Modificada";
return 0;
}
}
else
if(j<k)
{
cout<<endl<<"El metodo mas eficiente fue Secante";
return 0;
}
else
{
cout<<"El metodo mas eficiente fue Secante Modificada";

GML 14
return 0;
}
SetConsoleTextAttribute(hConsole, (FOREGROUND_RED |
FOREGROUND_GREEN | FOREGROUND_BLUE));
return 0;
}

GML 15
PRUEBAS DEL CODIGO

GML 16
GML 17
GML 18
GML 19
GML 20
BIBLIOGRAFIA
 METODOS NUMERICOS PARA INGENIEROS, 5ta edición, Steven C
Chapra, Raymong P. Canale. Mexico 2006.

GML 21

También podría gustarte