P. 1
METODO NUMERICO BISECCION MATLAB

METODO NUMERICO BISECCION MATLAB

|Views: 143|Likes:

More info:

Published by: Anzel Alejndr Extrda on Sep 19, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

09/03/2013

pdf

text

original

Wiki Loves Monuments: ¡Fotografía un monumento, ayuda a Wikipedia y gana!

Método de bisección
Saltar a: navegación, búsqueda

Unas cuantas iteraciones del método de bisección aplicadas en un intervalo [a1;b1]. El punto rojo es la raíz de la función. En matemáticas, el método de bisección es un algoritmo de búsqueda de raíces que trabaja dividiendo el intervalo a la mitad y seleccionando el subintervalo que tiene la raíz.

Contenido
  

1 Introducción 2 Algoritmo 3 Método de bisección en diferentes lenguajes de Programación o 3.1 C o 3.2 C++ o 3.3 MatLab o 3.4 Python o 3.5 SciLab o 3.6 VB.Net 2005, 2008 y 2010 o 3.7 Java 4 Bibliografía

b] y f(a)f(b) < 0.b] y se evalúa f(m) si ese valor es igual a cero. m] ó [m.b]. hasta alcanzar la precisión deseada En la siguiente figura se ilustra el procedimiento descrito. b] según se haya determinado en cuál de estos intervalos ocurre un cambio de signo Con este nuevo intervalo se continúa sucesivamente encerrando la solución en un intervalo cada vez más pequeño. Si existieran más de una raíz en el intervalo entonces el método sigue siendo convergente pero no resulta tan fácil caracterizar hacia qué raíz converge el método. por lo que con certeza existe un p en [a. se garantiza la convergencia si f(a) y f(b) tienen distinto signo. El método consiste en lo siguiente:       Debe existir seguridad sobre la continuidad de la función f(x) en el intervalo [a. Si f es una función continua en el intervalo [a. La bisección converge linealmente. entonces este método converge a la raíz de f. ya hemos encontrado la raíz buscada En caso de que no lo sea. se asegura la existencia de al menos una solución de la ecuación f(a)=0. Algoritmo Para aplicar el método consideremos tres sucesiones siguientes relaciones: definidas por las . b] como [a.b] toma todos los valores que se hallan entre f(a) y f(b). el cual establece que toda función continua f en un intervalo cerrado [a.Introducción Este es uno de los métodos más sencillos y de fácil intuición para resolver ecuaciones en una variable. En caso de que f(a) y f(b) tengan signos opuestos. El método de bisección es menos eficiente que el método de Newton. Se basa en el teorema del valor intermedio (TVI). Esto es que todo valor entre f(a) y f(b) es la imagen de al menos un valor en el intervalo [a. el valor cero sería un valor intermedio entre f(a) y f(b). De esta forma. una cota del error absoluto es: en la n-ésima iteración. Sin embargo.b] A continuación se verifica que Se calcula el punto medio m del intervalo [a. verificamos si f(m) tiene signo opuesto con f(a) o con f(b) Se redefine el intervalo [a. pero es mucho más seguro para garantizar la convergencia. De hecho.b] que cumple f(p)=0. por lo cual es un poco lento.

errorAbsoluto. c=getchar()..h> #include<math.h> // NOTA: conio. double p.b). //xr representa el punto intermedio printf("valor a:%f valorb:%f\t". } //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.b: %f\a".").Donde los valores iniciales vienen dados por: Se puede probar que las tres sucesiones convergen al valor de la única raíz del intervalo: Método de bisección en diferentes lenguajes de Programación C El siguiente código en lenguaje C.h> // #include<conio. Permite la obtención de las raíces de una función usando el Método de bisección: #include<stdio.a. 2)/3)+(9)).f(xr)). xr=((b+a)/2). double errorDeseado){ double xr. . //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("biseccion a.. printf("Presiona enter para contiuar.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. double b.

cout<< "por favor digite tol: ". b. system("pause"). double b. raiz=biseccion(a. // system("pause"). cin>>b. pausa(). double f(double x). biseccion(-424. //Si el margen de error ya es valido retorna la funcion. } //calcula el error relativo errorAbsoluto=fabs(f(p)-fabs(f(xr))). cout<< "por favor digite a: ". if (errorAbsoluto<errorDeseado){ return xr*0. cin>>a. es otra opcion en sistemas windows. int maxlter. cin>>maxlter. } C++ El siguiente código en lenguaje C++.b. return 0. tol. cout<<"La raiz es: "<< raiz <<endl. 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.maxlter). errorDeseado).146. o usar la pausa nativa de OS.02)). int main() { double a. 7. double tol. cout<< "por favor digite b: ". double biseccion ( double a. raiz.tol. int maxlter). } } int main(){ printf("%lf\n". }else{ a=xr*3. } double f(double x) . cout<< "por favor digite maxlter: ". return 0.b. p. }else{ return biseccion(a. cin>>tol. 0.//Cambia A o B por el valor del punto dependiendo de cuales se encuentran en medio de p if(p<xr){ b=xr-1. // introduce un rango amplio // getch(). // NOTA: Se recomienda para pausar crear su propia funciona de caracter para continuar.

acos. if sign(u)==sign(w) a = c. v=feval(fun. u=feval(fun. if(f(a)*f(c)<0) { b=c. Python # -*. double b. } while((abs(f(c))>tol)&&(nolter<maxlter)). return c.b).c). int maxlter) { double c. } double biseccion(double a. double tol. u=w. } cout<<nolter<<"\t"<<a<<"\t"<<b<<"\t"<<c<<"\t"<<f(c)<<endl.exp .asin. disp(['n='.b)'). do { c=(a+b)/2. int nolter=0. disp(['c='. x=c. else b=c. num2str(w)]).log.5>=tol) c=(b+a)/2.{ return x*x*x+4*x*x-10. if sign(u)==sign(v) disp('Error la función debe cambiar de signo en (a.cos. end while ((b-a)*0.a.tan. w=feval(fun.coding: utf-8 -*from math import sin.b. nolter++. n=1.atan.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'). num2str(n)]). end. num2str(c)]).a). v=w. } MatLab function x = biseccion(fun.sqrt. disp(['f(c)='. } else { a=c. end n=n+1.

b)').from math import sinh. disp(['************ Paso : '.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'. end while ((b-a)*0. else b=c. string(n). x=c. . u=evstr("LaFuncion(a)"). n=1. string(w)]). disp(['f(c)='. end n=n+1. Permite la obtención de de las raíces de una función usando el Método de bisección: function x = biseccion(LaFuncion. disp(sign(u)).acosh.tolerancia) disp('Método de la bisección').tanh.atanh ec=raw_input('De la funcion a resolver: ') x1=floath(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. v=w.cosh. disp(sign(v)).5>tolerancia) c=(b+a)/2.b. disp(['Valor c='. if sign(u)==sign(v) disp('Error la La función debe cambiar de signo en (a. v=evstr("LaFuncion(b)"). disp('************* La Raiz : *************'). u=w. '************'] ).xmed SciLab El siguiente código para SciLab. string(c)]).asinh.a. end. if sign(u)==sign(w) a=c. w=evstr("LaFuncion(c)").

tolerancia)) End If If ((f_c * f_b) < 0) Then reporte += Convert. c. ByVal b As Double.Net 2005.endfunction. 2008 y 2010 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.EvaluaEcua(frmPrincipal.Text. tolerancia)) End If End If End If Return reporte End Function End Class Java /** * * @author fredy Mosquera Lemus */ public class Biseccion { /** .txtX_1.Abs(a .txtFuncion.c) reporte = CStr(i + 1) + "ª" + Chr(9) + "x= " + CStr(c) + Chr(9) + " f(x)= " + CStr(f_c) + Chr(9) +_ " error= " + CStr(er) + Chr(13) + Chr(10) i += 1 If (tolerancia <= er) Then If ((f_c * f_a) < 0) Then reporte += Convert. VB.txtFuncion.Text) f_b = valorfuncion. c. c) er = Math.txtX_2.EvaluaEcua(frmPrincipal.ToString(biseccion(a.Text. frmPrincipal.ToString(biseccion(b.EvaluaEcua(frmPrincipal. ByVal tolerancia As Double) f_a = valorfuncion.Text) If ((f_a * f_b) < 0) Then c = (a + b) / 2 f_c = valorfuncion.Text. frmPrincipal.txtFuncion.

} }while(Math. double b. fb = funcion(b). if((funcion(a) * funcion(b)) > 0){ System. if((fa * fc) > 0){ a = c. fc = funcion(c). double fc. fb = funcion(b). fc = funcion(c). }else{ c = (a + b) /(double) 2. }else if((fb * fc) > 0 ){ b = c.* Este metodo crea un funcion a la cual se le aplicara el método de * Biseccion teniendo como parametro de entrada un double x.0. c = (a + b) /(double) 2. double error){ double c = 0. c = (a + b) /(double) 2.abs(fc) >= error). double fa. fb = funcion(b). b] y un el error con el cual * deseamos hallar nuestra funcion * @param a * @param b * @param error * @return */ public double metodoDeBiseccion(double a.println("valor de la funcion: "+funcion(c)). return c. el cual * sirve para la construccion de la funcion dentro del metodo * @param x * @return */ private double funcion(double x){ // return Math. en ese intervalo no existen raices").println("Error en el intervalo. fc = funcion(c). fa = funcion(a).sqrt( x*x +1 ) -4.3. fa = funcion(a). return (x*x) . } System.out. do{ fa = funcion(a). } /** * Metodo de Biseccion el cual le halla las raices de una funciones en un intervalo * ingresado como parametro de entrada [a. double fb.out. .

} } .

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->