Método de la bisección
Esta técnica se basa en el teorema del valor intermedio y parte del supuesto que
Básicamente, el método consiste en dividir a la mitad repetidamente los subintervalos de
Para empezar, hacemos
Si
Observación: como en cada iteración el intervalo es la mitad del intervalo anterior, podemos concluir que en la iteración
Error Absoluto
para
La implementación de este algoritmo con Excel es muy sencillas, como veremos.
Ejemplo
Para ilustar la forma en que podemos usar Excel, vamos a aproximar la solución de la ecuación
Lo primero es hallar un intervalo en el cual podamos garantizar la existencia de una solución. Por el teorema de las cotas sabemos que esta ecuación tiene sus soluciones dentro del intervalo
|
Y por último, lo único que debemos hacer es ir generando las aproximaciones, para esto arrastramos cada columna una a una. El resultado de esto se muestra en la figura 4.
Figura 4: Método de la biseccion
Método de bisección en diferentes lenguajes de Programación[editar]C
El siguiente código en lenguaje C, Permite la obtención de las raíces de una función usando el Método de bisección:
#include<stdio.h> #include<math.h> // #include<conio.h> // NOTA: conio.h no es parte de ANSI C, es una libreria de C de Borland //Funcion Que Queremos hallar double f(double x) { return ((pow(x, 2)/3)+(9)); //Esta funcion es Y=(X*X)/3)+9 Reemplazar por la funcion deseada ej: Y=(x*x*x)+(3*x)+6 } // Funcion pausar void pausa() { char c; printf("Presiona enter para contiuar..."); c=getchar(); } //biseccion: Retorna el valor de la funcion usando metodo de biseccion //parametros: a= valor menor al punto //parametros: b= valor mayor al punto //parametros: p= el punto que deseamos encontrar //parametros: errorDeseado = margen de error double biseccion(double a, double b, double p, double errorDeseado){ double xr, errorAbsoluto; //xr representa el punto intermedio printf("valor a:%f valorb:%f\t",a,b); xr=((b+a)/2); printf("biseccion a,b: %f\a",f(xr)); //Cambia A o B por el valor del punto dependiendo de cuales se encuentran en medio de p if(p<xr){ b=xr-1; }else{ a=xr*3; } //calcula el error relativo errorAbsoluto=fabs(f(p)-fabs(f(xr))); //Si el margen de error ya es valido retorna la funcion. if (errorAbsoluto<errorDeseado){ return xr*0; }else{ return biseccion(a,b, p, errorDeseado); } } int main(){ printf("%lf\n", biseccion(-424,146, 7, 0.02)); // introduce un rango amplio // getch(); // NOTA: Se recomienda para pausar crear su propia funciona de caracter para continuar, o usar la pausa nativa de OS. pausa(); // system("pause"); es otra opcion en sistemas windows. return 0; } [editar]C++
El siguiente código en lenguaje C++, imprime las iteraciones por el Método de bisección: para la funcion x^3+4x^2-10
#include <iostream> #include <cmath> using namespace std; double f(double x); double biseccion ( double a, double b, double tol, int maxlter); int main() { double a, b, tol, raiz; int maxlter; cout<< "por favor digite a: "; cin>>a; cout<< "por favor digite b: "; cin>>b; cout<< "por favor digite tol: "; cin>>tol; cout<< "por favor digite maxlter: "; cin>>maxlter; raiz=biseccion(a,b,tol,maxlter); cout<<"La raiz es: "<< raiz <<endl; system("pause"); return 0; } double f(double x) { return x*x*x+4*x*x-10; } double biseccion(double a, double b, double tol, int maxlter) { double c; int nolter=0; do { c=(a+b)/2; if(f(a)*f(c)<0) { b=c; } else { a=c; } cout<<nolter<<"\t"<<a<<"\t"<<b<<"\t"<<c<<"\t"<<f(c)<<endl; nolter++; } while((abs(f(c))>tol)&&(nolter<maxlter)); return c; } [editar]MatLabfunction x = biseccion(fun,a,b,tol) % Aproxima por el método de la bisección una raíz de la ecuación fun(x)=0 disp('Método de la bisección'); u=feval(fun,a); v=feval(fun,b); n=1; if sign(u)==sign(v) disp('Error la función debe cambiar de signo en (a,b)'); end while ((b-a)*0.5>=tol) c=(b+a)/2; w=feval(fun,c); disp(['n=', num2str(n)]); disp(['c=', num2str(c)]); disp(['f(c)=', num2str(w)]); if sign(u)==sign(w) a = c; u=w; else b=c; v=w; end n=n+1; end; x=c; |
No hay comentarios:
Publicar un comentario