Sie sind auf Seite 1von 9

Instituto Tecnolgico de Veracruz

Alumnos: Riviello Egremy Ulises, Daz rincn Juan mariano Materia: Mtodos numricos Carrera: Ing. Elctrica

Mtodo de biseccin

Unas cuantas iteraciones del mtodo de biseccin aplicadas en un intervalo [a1;b1]. El punto rojo es la raz de la funcin. En matemticas, el mtodo de biseccin es un algoritmo de bsqueda de races que trabaja dividiendo el intervalo a la mitad y seleccionando el subintervalo que tiene la raz. introduccin Este es uno de los mtodos ms sencillos y de fcil intuicin para resolver ecuaciones en una variable. Se basa en el teorema del valor intermedio (TVI), el cual establece que toda funcin continua f en un intervalo cerrado [a,b] toma todos los valores que se hallan entre f(a) y f(b). Esto es que todo valor entre f(a) y f(b) es la imagen de al menos un valor en el intervalo [a,b]. En caso de que f(a) y f(b) tengan signos opuestos, el valor cero sera un valor intermedio entre f(a) y f(b), por lo que con certeza existe un p en [a,b] que cumple f(p)=0. De esta forma, se asegura la existencia de al menos una solucin de la ecuacin f(a)=0. El mtodo consiste en lo siguiente:

Debe existir seguridad sobre la continuidad de la funcin f(x) en el intervalo [a,b] A continuacin se verifica que

Se calcula el punto medio m del intervalo [a,b] y se evala f(m) si ese valor es igual a cero, ya hemos encontrado la raz buscada En caso de que no lo sea, verificamos si f(m) tiene signo opuesto con f(a) o con f(b) Se redefine el intervalo [a, b] como [a, m] [m, b] segn se haya determinado en cul de estos intervalos ocurre un cambio de signo Con este nuevo intervalo se contina sucesivamente encerrando la solucin en un intervalo cada vez ms pequeo, hasta alcanzar la precisin deseada

En la siguiente figura se ilustra el procedimiento descrito. El mtodo de biseccin es menos eficiente que el mtodo de Newton, pero es mucho ms seguro para garantizar la convergencia. Si f es una funcin continua en el intervalo [a, b] y f(a)f(b) < 0, entonces este mtodo converge a la raz de f. De hecho, una cota del error absoluto es:

en la n-sima iteracin. La biseccin converge linealmente, por lo cual es un poco lento. Sin embargo, se garantiza la convergencia si f(a) y f(b) tienen distinto signo. Si existieran ms de una raz en el intervalo entonces el mtodo sigue siendo convergente pero no resulta tan fcil caracterizar hacia qu raz converge el mtodo. Algoritmo Para aplicar el mtodo consideremos tres sucesiones por las siguientes relaciones: definidas

Donde los valores iniciales vienen dados por:

Se puede probar que las tres sucesiones convergen al valor de la nica raz del intervalo:

Mtodo de biseccin en diferentes lenguajes de Programacin


C
El siguiente cdigo en lenguaje C, Permite la obtencin de las races de una funcin usando el Mtodo de biseccin:
#include<stdio.h> #include<math.h> // #include<conio.h> 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))); // NOTA: conio.h no es parte de ANSI C, es una libreria de C de Borland //Funcion Que Queremos hallar

//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(); pausa(); return 0; } // NOTA: Se recomienda para pausar crear su propia funciona de caracter para // system("pause"); es otra opcion en sistemas windows. continuar, o usar la pausa nativa de OS.

C++
El siguiente cdigo en lenguaje C++, imprime las iteraciones por el Mtodo de biseccin: 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; }

MatLab
function x = biseccion(fun,a,b,tol) % Aproxima por el mtodo de la biseccin una raz de la ecuacin fun(x)=0 disp('Mtodo de la biseccin'); u=feval(fun,a); v=feval(fun,b); n=1; if sign(u)==sign(v) disp('Error la funcin 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;

Python
# -*- coding: utf-8 -*from math import sin,cos,tan,asin,acos,atan,sqrt,log,exp from math import sinh,cosh,tanh,asinh,acosh,atanh ec=raw_input('De la funcion a resolver: ') x1=float(input('de el extremo inferior del intervalo aproximado: ')) x2=float(input('de el extremo superior del intervalo aproximado: ')) errordeseado=input('De el error deseado: ') def f(x): return eval(ec) while True: xmed=(x1+x2)/2 if f(xmed)==0.0: break if (f(x1)*f(xmed))<0: x2=xmed else: x1=xmed error=abs(x2-x1) if error<errordeseado: break print 'La raiz es',xmed

SciLab
El siguiente cdigo para SciLab, Permite la obtencin de de las races de una funcin usando el Mtodo de biseccin:
function x = biseccion(LaFuncion,a,b,tolerancia) disp('Mtodo de la biseccin'); u=evstr("LaFuncion(a)"); v=evstr("LaFuncion(b)"); n=1; disp(sign(u)); disp(sign(v)); if sign(u)==sign(v)

disp('Error la La funcin debe cambiar de signo en (a,b)'); end while ((b-a)*0.5>tolerancia) c=(b+a)/2; w=evstr("LaFuncion(c)"); disp(['************ Paso : ', string(n), '************'] ); disp(['Valor c=', string(c)]); disp(['f(c)=', string(w)]); if sign(u)==sign(w) a=c; u=w; else b=c; v=w; end n=n+1; end; disp('************* La Raiz : *************'); x=c; endfunction;

VB.Net 2005
Public Class metodos Dim c As Double Dim f_a As Double Dim f_b As Double Dim f_c As Double Dim er As Double Dim reporte As String Public i As Integer Dim valorfuncion As New EvalEcuaciones Public Function biseccion(ByVal a As Double, ByVal b As Double, ByVal tolerancia As Double) f_a = valorfuncion.EvaluaEcua(frmPrincipal.txtFuncion.Text, frmPrincipal.txtX_1.Text) f_b = valorfuncion.EvaluaEcua(frmPrincipal.txtFuncion.Text, frmPrincipal.txtX_2.Text) If ((f_a * f_b) < 0) Then c = (a + b) / 2 f_c = valorfuncion.EvaluaEcua(frmPrincipal.txtFuncion.Text, c) er = Math.Abs(a - c) reporte = CStr(i + 1) + "" + Chr(9) + "x= " + CStr(c) + Chr(9) + " f(x)= " + CStr(f_c) + Chr(9) + " eror= " + CStr(er) + Chr(13) + Chr(10) i += 1 If (tolerancia <= er) Then If ((f_c * f_a) < 0) Then reporte += Convert.ToString(biseccion(a, c, tolerancia)) End If

If ((f_c * f_b) < 0) Then reporte += Convert.ToString(biseccion(b, c, tolerancia)) End If End If End If Return reporte End Function End Class

Das könnte Ihnen auch gefallen