Issuu on Google+

INSTITUTO POLITÉCNICO POLITÉCNICO NACIONAL ESCUELA SUPERIOR DE INGENIERÍA MECANICA Y ELECTRICA DEPARTAMENTO DE INGENIERÍA INGENIERÍA ELÉCTRICA ACADEMIA DE COMPUTACIÓN COMPUTACIÓN

MÉTODOS NUMÉRICOS TAREA 2:

MÉTODOS PARA SOLUCIÓN DE RAÍCES

Nombre: Ríos Flores Alan Gerardo Boleta: 2011300876

Grupo: 2SM2

Carrera: Ingeniería en Sistemas Automotrices

Profesor: ING. ENRIQUE MARTÍNEZ ROLDÁN Fecha:

14 de Marzo de 2011


Método de la Bisección

Análisis: Datos de entrada: Intervalo(xa, xb), Tolerancia, Número Máximo de iteraciones Cálculos: Datos de Salida: Raíz de la función (xm)

Algoritmo : Bisección

Inicio: Var: Real: xa,xb,xm,fxa,fxb,fxm,tol. Imprimir:

Entero: maxit,cont0.

Dar el valor de xa:

Leer: xa Imprimir:

Dar el valor de xb:

Leer: xb Imprimir:

Dar el valor de tolerancia:

Leer: tol Imprimir:

Dar el valor máximo de iteraciones:

Leer: maxit Si fxa*fxb<0 hacer: Mirntras cont<=maxit hacer: xm (xa+xb)/2 Si fxa*fxm<0 hacer: xb xm De lo contrario hacer: xa xm Si abs fxm<=tol hacer:


Terminar cont++ fin_mientras Imprimir:

El valor de la raíz es xm

De lo contrario hacer: Imprimir:

No existe raíz en este intervalo

Fin

Implementación en Lenguaje C: #include <stdio.h> #include <stdlib.h>

#include <math.h> void biseccion (void) { int maxit,cont=0; float xa,xb,xm,fxa,fxb,fxm,tol; printf("===BISECION===\n"); printf("Dar el valor de xa: \n"); scanf("%f",&xa); printf("Dar el valor de xb: \n"); scanf("%f",&xb); printf("Dar el valor de la tolerancia: \n"); scanf("%f",&tol); printf("Dar el valor maximo de iteraciones: \n"); scanf("%i",&maxit); if(f(xa)*f(xb)<0) { while(cont<=maxit) { xm=(xa+xb)/2; if(f(xa)*f(xm)<0) { xb=xm; } else { xa=xm; } if(fabs(f(xm))<=tol) { break; } cont++; }


printf("El "El valor de la raiz es: %f \n",xm); } else { printf("No "No existe raiz en este intervalo\n"); intervalo } }

Captura de Pantalla de Salida:


Método de la Regla Falsa

Análisis: Datos de entrada: Intervalo(xa, xb), Tolerancia, Número Máximo de iteraciones

Cálculos: Datos de Salida: Raíz de la función (xr)

Algoritmo : Regla Falsa

Inicio: Var: Real: xa,xb,xr,tol. Imprimir:

Entero: maxit,cont0.

Dar el valor de xa:

Leer: xa Imprimir:

Dar el valor de xb:

Leer: xb Imprimir:

Dar el valor de tolerancia:

Leer: tol Imprimir:

Dar el valor máximo de iteraciones:


Leer: maxit Si fxa*fxb<0 hacer: Mirntras cont<=maxit cont<=maxit hacer: xr xb- (fxb*(xa-xb))/(fxa-fxb) Si fxa*fxr<0 fxa*fxr<0 hacer: xb xr De lo contrario hacer: xa xr Si abs fxr<=tol fxr<=tol hacer: Terminar cont++ fin_mientras Imprimir:

El valor de la raíz es xm

De lo contrario hacer: Imprimir:

No existe raíz en este intervalo

Fin

Implementación en Lenguaje C: #include <stdio.h> #include <stdlib.h>

#include <math.h> void reglafalsa (void) { int maxit,cont=0; float xa,xb,xr,tol; printf("===REGLA FALSA===\n"); printf("Dar el valor de xa: \n"); scanf("%f",&xa); printf("Dar el valor de xb: \n"); scanf("%f",&xb); printf("Dar el valor de la tolerancia: \n"); scanf("%f",&tol); printf("Dar el valor maximo de iteraciones: \n"); scanf("%i",&maxit); if(f(xa)*f(xb)<0)


{ while(cont<=maxit) { xr=xb-((f(xb)*(xa-xb)))/(f(xa)-f(xb)); if(f(xa)*f(xr)<0) { xb=xr; } else { xa=xr; } if(fabs(f(xr))<=tol) { break; } cont++; } printf("El valor de la raiz es: %f \n",xr); } else { printf("No existe raiz en este intervalo \n"); }

}

Captura de Pantalla de Salida:


Método de NewtonNewton-Raphson

Análisis: Datos de entrada: Intervalo(xa, xb), Tolerancia, Número Máximo de iteraciones

Cálculos: Datos de Salida: Raíz de la función (x1)

Algoritmo : Regla Falsa

Inicio: Var: Real: x0,x1,tol. Imprimir:

Entero: maxit,cont0.

Dar el valor de x0:

Leer: x0 Imprimir:

Dar el valor de tolerancia:

Leer: tol Imprimir:

Dar el valor máximo de iteraciones:

Leer: maxit Mirntras cont<=maxit hacer: x1 x0- f(x0)/df(x0) Si abs fx0<=tol fx0<=tol hacer: Terminar cont++ x0 x1 fin_mientras Imprimir: Fin

El valor de la raíz es x1


Implementaci贸n en Lenguaje C: #include <stdio.h> #include <stdlib.h>

#include <math.h> void newtonr (void) { int maxit,cont=0; float x0,x1,tol; printf("===NEWTON-RAPHSON===\n"); printf("Dar el valor de x0: \n"); scanf("%f",&x0); printf("Dar el valor de la tolerancia: \n"); scanf("%f",&tol); printf("Dar el valor maximo de iteraciones: \n"); scanf("%i",&maxit); while(cont<=maxit) { x1=x0-(f(x0)/df(x0)); if(fabs(f(x0))<=tol) { break; } cont++; x0=x1; } printf("El valor de la raiz es: %f \n",x1);

}

Captura de Pantalla de Salida:


Método de la Secante

Análisis: Datos de entrada: Intervalo(x0, x1), x1), Número Máximo de iteraciones

Cálculos: Datos de Salida: Raíz de la función (xr) (xr

Algoritmo : Secante

Inicio: Var: Real: x0,x1, 0,x1, EPS, EPS1. EPS1 Imprimir:

Entero: maxit,cont0.

Dar el valor de x0:

Leer: x0 Imprimir: Leer: x1

Dar el valor de x1:


Imprimir:

Dar el valor máximo de iteraciones:

Leer: maxit Mirntras cont<=maxit hacer: xr x1- (f(x1)(x1-x0)/(f(x1)-f(x0)) Si abs xrxr-x1 <=EPS(abs <=EPS(abs (xr(xr-x1)): x1)): Imprimir:

la raiz es xr

Terminar Si abs fxr <EPS1(abs(fx1)): Imprimir:

la raiz es xr

Terminar x0 x1 x1 xr cont++ fin_mientras Imprimir:

Error el método no converge

Fin

Implementación en Lenguaje C: #include <stdio.h> #include <stdlib.h>

#include <math.h> void secante (void) { int maxit,cont=0; float x0,x1,xr,eps,eps1; printf("===SECANTE===\n"); printf("Dar el valor de x0: \n"); scanf("%f",&x0); printf("Dar el valor de x1: \n"); scanf("%f",&x1); printf("Dar el valor maximo de iteraciones: \n"); scanf("%i",&maxit); while(cont<=maxit) {


xr=x1-((f(x1)*(x1-x0))/(f(x1)-f(x0))); if(fabs(xr-x1)<fabs(x1-x0)) { printf("El valor de la raiz es: %f\n",xr); break; } if(fabs(f(xr))<fabs(f(x1))) { printf("El valor de la raiz es: %f\n",xr); break; } x0=x1; x1=xr; cont++; } }

Captura de Pantalla de Salida:


Métodos para el Calculo de Raices

Análisis: Datos de entrada: Opcion(de cero a cuatro) para elegir uno de los métodos de cálculo de raíces o abandonar el programa: •

Biseccion

Regla Falsa

Newton-Raphson

Secante

Salir

Datos de Salida: Raíz de la función

Algoritmo : Metodos para el calculo de raíces

Inicio: Var: Entero: opc Imprimir:

1-Biseccion

Imprimir:

2-Regla Falsa

Imprimir:

3-Newton-Raphson

Imprimir:

4-Secnte

Imprimir:

0-Salir

Leer: opc Switch opc Caso 1 hacer: Bisección (vease algoritmo de Biseccion) Terminar


Caso 2 hacer: Regla Falsa (vease algoritmo de Regla falsa) Terminar Caso 3 hacer: NewtonNewton-Raphson (vease algoritmo de NewtonNewton-Raphson) Terminar Caso 4 hacer: Secante (vease algoritmo de Secante) Terminar Caso 0 hacer: Terminar Opci贸n no valida: Imprimir:

Opcion invalida

Terminar Fin

Implementaci贸n en Lenguaje C: /* * File: Calculo De Raices.cpp * Author: Alan * * Created on 7 de marzo de 2011, 8:58 */ #include <stdio.h> #include <stdlib.h> #include <math.h> void biseccion(void); void reglafalsa(void); void newtonr(void); void secante(void); double f(double); double df(double); int main(void) {


int opc; printf("===METODOS PARA SOLUCION DE RAICES===\n"); printf("===f(x)=(x*x*x)-(x*x)-9x+9===\n"); printf("1-Biseccion\n"); printf("2-Regla Falsa\n"); printf("3-Newton-Raphson\n"); printf("4-Secante\n"); printf("0-Salir\n"); scanf("%i",&opc); system("clear"); switch(opc) { case 1: biseccion(); break; case 2: reglafalsa(); break; case 3: newtonr(); break; case 4: secante(); break; case 0: break; default: printf("Opcion invalida\n"); } return 0; } void biseccion (void) { int maxit,cont=0; float xa,xb,xm,fxa,fxb,fxm,tol; printf("===BISECION===\n"); printf("Dar el valor de xa: \n"); scanf("%f",&xa); printf("Dar el valor de xb: \n"); scanf("%f",&xb); printf("Dar el valor de la tolerancia: \n"); scanf("%f",&tol); printf("Dar el valor maximo de iteraciones: \n"); scanf("%i",&maxit); if(f(xa)*f(xb)<0) { while(cont<=maxit) { xm=(xa+xb)/2; if(f(xa)*f(xm)<0) { xb=xm; }


else { xa=xm; } if(fabs(f(xm))<=tol) { break; } cont++; } printf("El valor de la raiz es: %f \n",xm); } else { printf("No existe raiz en este intervalo\n"); } main(); } void reglafalsa (void) { int maxit,cont=0; float xa,xb,xr,tol; printf("===REGLA FALSA===\n"); printf("Dar el valor de xa: \n"); scanf("%f",&xa); printf("Dar el valor de xb: \n"); scanf("%f",&xb); printf("Dar el valor de la tolerancia: \n"); scanf("%f",&tol); printf("Dar el valor maximo de iteraciones: \n"); scanf("%i",&maxit); if(f(xa)*f(xb)<0) { while(cont<=maxit) { xr=xb-((f(xb)*(xa-xb)))/(f(xa)-f(xb)); if(f(xa)*f(xr)<0) { xb=xr; } else { xa=xr; } if(fabs(f(xr))<=tol) { break; } cont++; } printf("El valor de la raiz es: %f \n",xr); } else


{ printf("No existe raiz en este intervalo \n"); } main(); } void newtonr (void) { int maxit,cont=0; float x0,x1,tol; printf("===NEWTON-RAPHSON===\n"); printf("Dar el valor de x0: \n"); scanf("%f",&x0); printf("Dar el valor de la tolerancia: \n"); scanf("%f",&tol); printf("Dar el valor maximo de iteraciones: \n"); scanf("%i",&maxit); while(cont<=maxit) { x1=x0-(f(x0)/df(x0)); if(fabs(f(x0))<=tol) { break; } cont++; x0=x1; } printf("El valor de la raiz es: %f \n",x1); main(); } void secante (void) { int maxit,cont=0; float x0,x1,xr,eps,eps1; printf("===SECANTE===\n"); printf("Dar el valor de x0: \n"); scanf("%f",&x0); printf("Dar el valor de x1: \n"); scanf("%f",&x1); printf("Dar el valor maximo de iteraciones: \n"); scanf("%i",&maxit); while(cont<=maxit) { xr=x1-((f(x1)*(x1-x0))/(f(x1)-f(x0))); if(fabs(xr-x1)<fabs(x1-x0)) { printf("El valor de la raiz es: %f\n",xr); break; } if(fabs(f(xr))<fabs(f(x1))) { printf("El valor de la raiz es: %f\n",xr); break; }


x0=x1; x1=xr; cont++; } main(); } double f(double x) { return (x*x*x)-(x*x)-(9*x)+9; } double df(double z) { return (3*(z*z))-(2*z)-9;

} Captura de Pantalla de Salida:


CONCLUSIONES Mis conclusiones respecto a esta tarea son: Me pareció una tarea con mucho sentido, es decir, me ayudo a visualizar los mètodos para el calculo de raices en acción Algo muy importante que aprendi fue a haces subprogramas dentro de un main lo cual facilita mucho el trabajo si se trabaja con un menú para realizar distintas actividades También aprendí y como se declara una función la cual se puede llamar en el momento que sea a un subprograma o al programa main , lo cual es muy útil tambien Elaborar y comprennder los métodos me resulto sencillo a excepción del método de la Secante ya que la formula para obtener la raiz (xr) es casi identica a la del Metodo de la Regla Falsa, incluso llego a pensar que es la misma ya que solo obtiene el valor de la raiz con ciertas funciones y valores especificos para le intervalo en las equis, revise mi algoritmo y codigo y no encontre fallo alguno, es tal cual y como lo vimos en clase, pero aun asi no funciona bien con la función de ejemplo de los otros metodos y/o con los intervalos


Mi Sir