0% encontró este documento útil (0 votos)
736 vistas9 páginas

Metodo Numerico Biseccion Matlab

Este documento describe el método de bisección para encontrar las raíces de una función. Explica que el método consiste en dividir iterativamente el intervalo en el que se encuentra la raíz a la mitad, evaluando la función en el punto medio, hasta alcanzar un error deseado. Además, proporciona ejemplos de código del método de bisección en diferentes lenguajes de programación como C, C++, MatLab, Python, SciLab, VB.Net y Java.
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
736 vistas9 páginas

Metodo Numerico Biseccion Matlab

Este documento describe el método de bisección para encontrar las raíces de una función. Explica que el método consiste en dividir iterativamente el intervalo en el que se encuentra la raíz a la mitad, evaluando la función en el punto medio, hasta alcanzar un error deseado. Además, proporciona ejemplos de código del método de bisección en diferentes lenguajes de programación como C, C++, MatLab, Python, SciLab, VB.Net y Java.
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Wiki Loves Monuments: Fotografa un monumento, ayuda a Wikipedia y gana!

Mtodo de biseccin
Saltar a: navegacin, bsqueda

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.

Contenido

1 Introduccin 2 Algoritmo 3 Mtodo de biseccin en diferentes lenguajes de Programacin 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 Bibliografa

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 siguientes relaciones: definidas por las

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> // 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; }

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=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.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, 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, 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) +_ " error= " + 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

Java
/**
* * @author fredy Mosquera Lemus */

public class Biseccion {


/**

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

}while(Math.abs(fc) >= error); } System.out.println("valor de la funcion: "+funcion(c)); return c;

También podría gustarte