Está en la página 1de 13

Tema 9

Asignatura:
Programación Científica
1er. curso
Grado en Física

Tema 9 : cálculo de raices de ecuaciones

1
Rosa Echevarría Líbano. Dpto. Ecuaciones Diferenciales y Análisis Numérico. Universidad de Sevilla
Cálculo de raíces de ecuaciones no lineales

2
Rosa Echevarría Líbano. Dpto. Ecuaciones Diferenciales y Análisis Numérico. Universidad de Sevilla
Cálculo de raíces de ecuaciones no lineales

El método más sencillo para aproximar un cero de una


función continua que tiene un único cero en un
intervalo es el método de bisección o dicotomía:
basándose en el Teorema Bolzano, en cada iteración
se descarta la mitad del intervalo que no contiene a la
raíz (en la que f no cambia de signo)

3
Rosa Echevarría Líbano. Dpto. Ecuaciones Diferenciales y Análisis Numérico. Universidad de Sevilla
Cálculo de raíces de ecuaciones no lineales

mitad del intervalo


descartada

4
Rosa Echevarría Líbano. Dpto. Ecuaciones Diferenciales y Análisis Numérico. Universidad de Sevilla
Cálculo de raíces de ecuaciones no lineales

mitad del intervalo


descartada 5
Rosa Echevarría Líbano. Dpto. Ecuaciones Diferenciales y Análisis Numérico. Universidad de Sevilla
Cálculo de raíces de ecuaciones no lineales

mitad del intervalo


descartada 6
Rosa Echevarría Líbano. Dpto. Ecuaciones Diferenciales y Análisis Numérico. Universidad de Sevilla
Cálculo de raíces de ecuaciones no lineales

Algoritmo de bisección

7
Rosa Echevarría Líbano. Dpto. Ecuaciones Diferenciales y Análisis Numérico. Universidad de Sevilla
Cálculo de raíces de ecuaciones no lineales

biseccion.m
function [x] = biseccion(fcn,a,b,eps,tol)
%
% biseccion(fcn,a,b,eps,tol) :: devuelve una aproximacion de
% un cero de la funcion fcn entre a y b
%
% fcn :: puede ser una funcion anónima o una M-funcion.
% Debe ser continua y tener signos distintos en a y b
%
% a, b :: extremos del intervalo que contiene un cero de fcn
%
% eps :: se detiene el algoritmo si abs(fcn(x))<eps
%
% tol :: ídem si abs(x-xexacto)<tol
%

8
Rosa Echevarría Líbano. Dpto. Ecuaciones Diferenciales y Análisis Numérico. Universidad de Sevilla
Cálculo de raíces de ecuaciones no lineales

biseccion.m (... sigue ...)


fa = fcn(a);
fb = fcn(b);
if fa*fb >= 0
error('La funcion no cambia de signo en el intervalo');
end
%
e=(b-a)*0.5;
x=a;
while abs(e)>tol
x = a + e;
fx = fcn(x);
if (abs(fx)<eps), return, end;
if (fa*fx > 0)
a = x;
fa = fx;
end;
e = e*0.5;
end

9
Rosa Echevarría Líbano. Dpto. Ecuaciones Diferenciales y Análisis Numérico. Universidad de Sevilla
Cálculo de raíces de ecuaciones no lineales

El método más utilizado para aproximar raíces de


ecuaciones no lineales es el método de Newton:

Este método necesita del conocimiento de la derivada


de la función, y que no se anule en ninguno de los
puntos .
Además, normalmente, requiere elegir
cercano a la solución

10
Rosa Echevarría Líbano. Dpto. Ecuaciones Diferenciales y Análisis Numérico. Universidad de Sevilla
Cálculo de raíces de ecuaciones no lineales

es el punto en que la tangente a la curva en


corta al eje de las X

11
Rosa Echevarría Líbano. Dpto. Ecuaciones Diferenciales y Análisis Numérico. Universidad de Sevilla
Cálculo de raíces de ecuaciones no lineales

newton.m
function [x,Iter] = newton(fcn, xcero, eps, tol, Nmax)
%
% newton(fcn,xcero,eps,tol,Nmax) devuelve una aproximacion de
% un cero de fcn (metodo de Newton)
% [x,Iter]=newton(fcn,xcero,eps,tol,Nmax) devuelve ademas
% el numero de iteraciones realizadas
% fcn: la funcion y su derivada:
% fcn(x,1) debe devolver el valor de la funcion en x
% fcn(x,2) debe devolver el valor de la derivada en x
% xcero: punto para iniciar el algoritmo
% eps: se detiene algoritmo si |f(x)|<eps
% tol: se detiene el algoritmo si |x_{n+1}-x_n|/|x_n|<tol
% Nmax: numero maximo de iteraciones a realizar
%
% x : aproximacion del cero de fcn
% Iter : numero de iteraciones realizadas
%

12
Rosa Echevarría Líbano. Dpto. Ecuaciones Diferenciales y Análisis Numérico. Universidad de Sevilla
Cálculo de raíces de ecuaciones no lineales

newton.m (... sigue ...)


Iter = 0;
xold = xcero;
x = xold;
for Iter = 1 : Nmax
f = fcn(x,1);
if (abs(f) < eps), return, end;
df = fcn(x,2);
fdf = f/df;
if (abs(fdf) < abs(xold)*tol), return, end;
x = xold - fdf;
xold = x;
end

13
Rosa Echevarría Líbano. Dpto. Ecuaciones Diferenciales y Análisis Numérico. Universidad de Sevilla

También podría gustarte