Solución numérica de ecuaciones no lineales de una variable · 2013-09-17 · Método de la...
Transcript of Solución numérica de ecuaciones no lineales de una variable · 2013-09-17 · Método de la...
Solución numérica de ecuaciones no lineales
de una variable
Procesos Numéricos
Profesor: Gustavo Adolfo Restrepo Arboleda
Por: Melissa Arcila Montoya - 201117508012 Stefania Giraldo Jimenez - 20102001112
Manuela Piedrahita Vasco - 201119101012 Cristina Rodríguez Arrázola - 201020015012
Ingeniería de Producción Universidad EAFIT
Medellín – Antioquia 2013
TABLA DE CONTENIDOS
Página INTRODUCCIÓN OBJETIVOS TEOREMAS
1. Teorema del valor intermedio 2. Teorema de Rolle 3. Teorema del valor medio
MÉTODOS 1. Método de búsquedas incrementales 2. Método de la bisección 3. Método del punto fijo 4. Método de Newton-Raphson 5. Método de la secante 6. Método de la regla falsa 7. Método de las raíces múltiples
CONCLUSIÓN BIBLIOGRAFÍA
INTRODUCCIÓN
Los procesos numéricos es una rama de las matemáticas que utiliza algoritmos a través de
números para la simulación de procesos de la vida diaria. Dichos procesos van desde el
cálculo de los valores de una función, hasta la programación de una herramienta de
simulación como CREO Parametric o SolidWorks.
La producción de este trabajo está enfocada a explicar los diversos métodos de solución
de ecuaciones no lineales de una variable. Entre los métodos se encuentran el método de
búsquedas incrementales, el método de la bisección, el método del punto fijo, el método
de Newton-Raphson, el método de la secante, el método de la regla falsa, y el método de
las raíces múltiples.
Adicionalmente, se explicaran tres teoremas que son esenciales para entender y aplicar
dichos métodos. Estos son: teorema del valor intermedio, teorema de Rolle, y teorema del
valor medio.
Es importante tener en cuenta lo siguiente:
Sea f una función. Se dice que P es una raíz de la ecuación f(x) = 0 si f(P) = 0.
También se dice que P es un cero (0) de f.
OBJETIVOS
Fortalecer lo aprendido en clase por medio de la producción de este trabajo y de los
códigos en el lenguaje de Octave.
Proveer diversos métodos que faciliten la búsqueda de raíces.
Servir de fuente de búsqueda a otros estudiantes que requieran la información
suministrada.
TEOREMAS
1. Teorema del valor intermedio
Sea f una función continua en el intervalo cerrado [a, b], [ ] , y sea k
un número entre f(a) y f(b). Existe un c que pertenece a (a, b) tal que f(c) = k.
Este teorema sirve para demostrar la existencia de raíces cuando f(a) y f(b)
tienen signos contrarios.
Este teorema también sirve para demostrar la existencia de una única raíz
cuando se cumple la siguiente condición:
F es diferenciable en (a, b) y f’(x) no cambia de signo para todo x que
pertenece a [a, b]; entonces existe un único xm en [a, b] que es raíz de la
ecuación f(x) = 0.
Ilustración 1 - Teorema del valor intermedio
2. Teorema de Rolle
Sea f una función continua en el intervalo cerrado [a,b] y diferenciable en el
intervalo (a,b). Si entonces existe un punto c (a,b) en donde
la derivada es igual a 0 (f’(c)=0).
Este teorema sirve para demostrar la existencia de una única raíz en un
intervalo cerrado y por esta misma razón soluciones a ecuaciones de una
variable.
También se utiliza para demostrar el Teorema del Valor medioAdemás, el
Teorema de Rolle se puede usar para deducir numerosas propiedades de
las funciones, por ejemplo, la búsqueda de soluciones de una ecuación
(equivalente a buscar los ceros de una función f(x)=0)
Ilustración 2 - Teorema de Rolle
3. Teorema de valor medio
Teorema de los incrementos finitos es una propiedad de las funciones derivables
en un intervalo. Se usa normalmente para demostrar otros teoremas.
Si es una función continua en el intervalo [ ] y diferenciable en
entonces existe al menos algún punto ƺ en el intervalo tal que:
Ilustración 3 - Teorema del valor medio
MÉTODOS
1. Método de Búsquedas Incrementales
Este método se utiliza principalmente como una introducción al método de la
bisección con el fin de encontrar un intervalo que contenga una raíz. Consiste en
empezar en un extremo del intervalo de interés y evaluar la función con pequeños
incrementos a los largo de dicho intervalo. Este método se basa en el teorema del
valor intermedio, el cual se explicó anteriormente. Es importante tener en cuenta
que si la longitud del incremento no es la adecuada (lo suficientemente pequeña),
algunas raíces pueden pasar inadvertidas.
Paso a paso:
a) Se selecciona un valor arbitrario de salida (dentro del intervalo de
interés), y un valor para los incrementos , donde .
b) Se genera una sucesión de valores tal que
.
c) Cada vez que se genere un valor de , se halla el valor de .
d) Se observan los signos de y de .
e) Se suspende el proceso cuando se presente un cambio de signo en
y o cuando se llegue a un límite de iteraciones sin
encontrar dicho cambio.
Ilustración 3 - Método de búsquedas incrementales
Ejemplo:
Se hará uso de esta ecuación para ejemplificar todos los métodos. La gráfica es la
siguiente:
Vamos a buscar un intervalo de la siguiente ecuación, que contenga una raíz:
f(x)= cos (x) – cos (3.1*x)
Valor inicial: 0.005
Incremento: 0.1
Número de iteraciones: 100
El intervalo donde se encuentra la raíz es [1.50500, 1.60500]
Código en Octave:
clear all
clear
clc
%En esta parte el usuario ingresa los datos iniciales que requiere el metodo
ingresefuncion=input('ingrese la funcion: ', 's'); %el usuario ingresa la funcion que desea
encontrarle la raiz
x0=input('ingrese valor inicial: '); %se debe ingresar un valor de partida
delta=input('ingrese incremento: '); %esto expresa el tamaño del intervalo que se desea
encontrar
iter=input('ingrese el numero de iteraciones: '); %se debe ingresar el numero de
iteraciones deseadas
funcion=inline(ingresefuncion); %aqui se transforma a funcion una cadena de caracteres
para poder evaluar valores
fx0=funcion(x0); %se evalua la funcion en el punto inicial
if fx0==0
fprintf('La raiz esta en x0(%g)',x0); %si fx0 es igual a cero entonces que indique que
x0 es la raiz
else
x1=x0+delta; %haga un incremento en x0 para obtener el primer intervalo
i=1; %empieza el contador
fx1=funcion(x1); %evalua la funcion en x1
while fx0*fx1>0 && i<iter %mientras no hay un cambio en la funcion o el contador
sea menor al numero de iteraciones
x0=x1; %x1 sera el valor inicial del intervalo
fx0=fx1; %el valor inicial de la funcion sera el valor de la funcion en x1
x1=x0+delta; %realiza el incremento para el nuevo intervalo
fx1=funcion(x1); %evalua la funcion el x1
tabla(i,1)=i;
tabla(i,2)=x0;
tabla(i,3)=x1;
i=i+1; %incrementa el intervalo
end
tabla
if fx0==0 %si la funcion evaluada en x0 es 0
fprintf('La raiz esta en x0 (%g)',x0); %indicar que x0 es la raiz
else
if fx1==0 %si la funcion evaluada en x1 es 0
fprintf('La raiz esta en x1 (%g)',x1); %indicar que x1 es la raiz
else
if fx0*fx1<0 %sino evalue si la raíz está contenida en ese intervalo
fprintf('La raiz esta entre x0 : (%g) y x1 : (%g) \n',x0,x1);
else
fprintf('No fue encontrada la raiz'); %sino la raiz no fue encontrada
en ese numero de iteraciones
end
end
end
end
2. Método de la Bisección
Es un método de búsqueda de raíces en el cual, teniendo un intervalo [a, b] que
contenga la raíz, se divide en sub-intervalos, que a medida que se repite el proceso
se hacen más pequeños y el resultado se aproxima cada vez más el valor de la raíz.
Partiendo de una función continua y de dos valores iniciales es necesario que la
función evaluada en dichos puntos tome signos opuestos, es decir:
Luego se obtiene la primera aproximación a la raíz por medio de la siguiente
fórmula:
Al evaluar se deben tener en cuenta los siguientes casos:
En dicho caso ya se habría encontrado la raíz, la cual sería
Lo cual indicaría que la raíz se encuentra en dicho intervalo y se procede a buscar
nuevamente el punto medio del intervalo haciendo y dejando el mismo .
Indica que la raíz no se encuentra en este intervalo y por lo tanto hacemos
y dejamos el mismo .
Repetir el proceso hasta alcanzar el error deseado.
Ilustración 4 - Método de la Bisección
Ejemplo:
Encontrar la raíz para la ecuación f(x)=cos (x) – cos(3.1*x)
Intervalo: [1,2]
Tolerancia: 0.000001
Número de iteraciones: 1000
La raíz está en 1.53249 con un error de 9.53674x10-7.
Código en Octave
clc
clear
clear all
format long
ingresefuncion = input('ingrese la funcion: ', 's'); %aqui el usuario debe ingresar la funcion
para calcularle la raiz
a = input('ingrese limite inferior del intervalo: '); %se debe ingresar el limite izquierdo del
intervalo
b = input('ingrese limite superior del intervalo: '); %se debe ingresar el limite derecho del
intervalo
tol = input('ingrese la tolerancia deseada: '); %se debe ingresar la tolerancia deseada por el
usuario
iter = input('ingrese el numero de iteraciones: '); %se debe ingresar el maximo numero de
iteraciones a realizar
funcion = inline(ingresefuncion); %aqui se convierte a funcion una serie de caracteres para
poder evaluar valores
fa = funcion(a); %aqui se evalua la funcion en a
fb = funcion(b); %aqui se evalua la funcion en b
tabla = 0;
%x1 = -50:0.5:50;
%y1 = funcion(x1);
%plot(x1,y1)
if fa==0
fprintf('La raiz es : %g \n',a); %si al evaluar la funcion en a da 0 entonces indica que
la raiz es a
else
if fb==0
fprintf('La raiz es : %g \n',b); %si al evaluar la funcion en b da 0 entonces
indica que la raiz es b
else
if fa*fb<0 %si la funcion en a y b tiene cambio de signo entonces se utiliza
este intervalo
xm=(a+b)/2; %encuentra el valor medio del intervalo
fxm=funcion(xm); %evalua la funcion en el punto medio
encontrado
i=1; %se inicia el contador
error=tol+1; %se inicia el error
tabla(i,1) = i;
tabla(i,2) = xm;
tabla(i,3) = fxm;
tabla(i,4) = error;
while error>tol && fxm~=0 && i<=iter %mientras el error sea
mayor a la tolerancia, fxm diferente de 0 y la iteracion actual sea menor o igual a iter,
evalue las siguientes condiciones
if fa*fxm<0 %si la funcion evaluada en a y xm cambia de
signo entonces hacer limite superior xm y evalue la funcion
b=xm; %se iguala el punto b al punto medio
fb=fxm; %como los puntos b y xm son iguales. las
funciones son iguales
else %sino esto quiere decir que la raiz se
encuentra en el otro intervalo
a=xm; %y se iguala a y xm
fa=fxm; %como los puntos a y xm son iguales. las
funciones son iguales
end
xaux=xm;
xm=(a+b)/2; %encuentra el valor medio del intervalo
fxm=funcion(xm); %evalua la funcion en el punto medio
encontrado
error=abs(xm-xaux); %se compara el error con la tolerancia
i=i+1; %incrementa el numero de iteraciones
tabla(i,1) = i; %En la columna 1 se muestra el numero de
iteraciones
tabla(i,2) = xm; %En la columna 2 se muestra el punto
medio o sea la raiz
tabla(i,3) = fxm; %En la columna 3 se muestra la funcion
evaluada en la raiz
tabla(i,4) = error; %En la columna 4 se muestra el error
absoluto
end
if fxm==0
fprintf('La raiz es : %g \n',xm); %si al evaluar la funcion en
xm da 0 entonces indica que la raiz es xm
else
if error<tol %no se encontro la raiz pero se llego a una
aproximacion a esta con un error menor a la tolerancia
fprintf('La aproximacion a la raiz es : %g con un
error de: %g \n ',xm,error);
else
fprintf('El numero de iteraciones ingresadas no fue
suficiente');
end
end
else %no se encontro la raiz con el numero de iteraciones
ingresadas
fprintf('El intervalo ingresado es indaecuado');
end
end
end
tabla
3. Método del Punto Fijo
También llamado método de aproximación sucesiva.
Permite resolver sistemas de ecuaciones no necesariamente lineales. Busca raíces
de una función, siempre y cuando se cumplan los criterios de convergencia.
El Método de Punto Fijo (también conocido como iteración de punto fijo), es otro
método para hallar los ceros de Para resolver , se reordena en una
forma equivalente:
es un punto fijo de g por cumplir la anterior relación.
Los puntos fijos de son las “intersecciones” de la gráfica de con la recta
.
Ejemplos
1) La ecuación se puede transformar en .
2) La ecuación se puede transformar en .
Teorema
Supongamos que
g es continua [a,b]
g(x) [a,b] para toda x [a,b], entonces g tiene un punto fijo en [a,b].
Si además g’(x) existe en (a, b) y existe una constante positiva K < 1 con
|g'(x)| K, para todo x (a,b), entonces el punto fijo en [a,b] es único.
Demostración
Si g(a)=a o si g(b)=b, entonces g tendrá un punto fijo en un extremo del intervalo [a,b].
Si se supone que g(a) a y g(b) b entonces se debe tener que: g(a) > a y g(b) < b (porque g(x) [a,b] para todo x [a,b])
g(a) - a > 0 y g(b) - b < 0.
Si se define t(x) = g(x) - x, t es continua en [a,b] y
t(a) = g(a) - a > 0
t(b) = g(b) - b < 0
Por el teorema del valor intermedio existe un c (a,b) tal que t(c)=0, es decir g(c) – c = 0, g(c) = c, luego c es un punto fijo de g.
Si se supone además que |g'(x)| K <1 y que c1 y c2 son dos puntos fijos de g en [a,b] con c1 c2, por el teorema del valor medio, existe un número z entre c1 y c2 tal
que o |g(c2) – g(c1)| = |g’(z)| |c2 - c1|.
Como c1 y c2 son puntos fijos de g, g(c2) = c2 y g(c1) = c1, entonces |c2 - c1| = |g(c2) - g(c1)| = |g(c2)| |c2 - c1| k|c2 - c1| < 1|c2 - c1| (porque |g’(x)| k <1).
Luego, |c2 - c1|<|c2 - c1|, lo cual es una contradicción, por lo tanto el punto fijo de g en [a,b] es único.
Ejemplo:
Hallar la raíz para la ecuación f(x)=cos(x)-cos(3.1*x)
Se observa que en el método de punto fijo al darle una tolerancia tan pequeña (0.1*10^-5)
no puede encontrar una solución en 1000 iteraciones; esto se debe a que aunque es un
método que por lo general encuentra la raíz, no lo hace rápidamente. Al darle una mayor
tolerancia (1), el método converge en pocas iteraciones pero con un error elevado
(0.805843).
Código en Octave:
clc
clear
clear all
format long
inputfuncion = input('Ingrese la funcion f(x) : ', 's'); %El usuario debe ingresar la función a
la cual va a calcularle la raiz
funcion = inline(inputfuncion); %Aqui se convierte la funcion en una serie de caracteres
para poder evaluar valores
inputfunciongx = input('Ingrese la funcion g(x) : ', 's'); %El usuario debe ingresar la derivada
de la funcion
funciongx = inline(inputfunciongx); %Aqui se convierte la derivada en una serie de
caracteres para poder evaluar valores
x0=input ('Ingrese el primer valor a evaluar en la funcion : ');%Aqui se debe ingresar el
valor inicial a evaluar
tol=input ('Ingrese la tolerancia deseada : ');%Se pide ingresar la tolerancia
iter=input ('Ingrese el número maximo de iteraciones permitidas : ');%Aqui se ingresa el
numero e iteraciones permitidas
fx=funcion(x0) %Aqui se evalua fx en x0
i=1; %Se inicia el contador de iteraciones
error=tol+1; %Se le da un valor inicial error
while fx~=0 && error>tol && i<iter %Mientras no se haya encontrado la raiz y el error sea
mayor que la tolerancia y el contador menor que iter comenzara a iterar el metodo
x1=funciongx(x0) %Evalua la funcion gx en x0 encontrando x1
fx=funcion(x1) %Evalua fx en x1
error=abs(x1-x0); %Calcula el error
x0=x1; %Se repite la iteracion haciendo x0=x1
i=i+1; %Incrementa el numero de iteraciones
tabla(i,1)=i; %En la columna 1 se muestra el numero de iteraciones
tabla(i,2)=x0; %En la columna 2 se muestra el valor de x0
tabla(i,3)=fx; %En la columna 3 se muestra el valor de fx
tabla(i,4)=error; %En la columna 4 se muestra el error absoluto
end
disp(tabla); %Muestra la tabla
if fx==0 %Si encontro la raiz muestra el valor de p donde esta la raiz
fprintf('La raiz es : %g \n',x0);
else
if error<tol %No se encontro la raiz pero se llego a una aproximacion a esta con un
error menor a la tolerancia
fprintf('La aproximacion a la raiz es : %g con un error de: %g \n',x0,error);
else %No se encontro la raiz con el numero de iteraciones ingresadas
fprintf('El numero de iteraciones ingresadas no fue suficiente \n');
end
end
4. Método de Newton-Raphson
También conocido como el método de las tangentes, pues utiliza rectas tangentes
para acercarse a la raíz. Es un método iterativo que permite aproximar la solución
de una ecuación f(x)=0, partiendo de una estimación inicial. Es uno de los métodos
más utilizados debido a su rapidez y efectividad.
Nota:
El método Newton-Rapson puede divergir en los siguientes casos:
P
f ’(P0)=0
(P0,f(P0)
)
P P0
(P1,f(P1)
)
P1
Ilustración 5 - Método Newton-Raphson
Teorema
Sea (existe y y son continuas) si es tal que
para y entonces el método de Newton dado por la iteración:
Genera una sucesión tal que , para lo suficientemente
cercano a .
P
(P0
PP
(P1
PP
f ’(Pn)=0
P
P
El método puede entrar en un
ciclo infinito.
f ’(P)=0
Ilustración 6 - Caso 1
Ilustración 7 - caso 2
Ilustración 8 - caso 3
Ilustración 9 caso 4
Método Newton y Punto fijo
Sean f y g dos funciones, g es una una función de punto fijo asociada a f, si solo si:
Ejemplo:
Hallar la raíz para la ecuación f(x)=cos(x)-cos(3.1*x)
La raíz es: 3.06497
El error es: 6.88*10^-6
Este método encontró la raíz en 8 iteraciones. La raíz que encontró no es la más cercana al
valor inicial ingresado ya que al realizar la primera iteración, la recta tangente al punto
inicial (x0=1), el intercepto con el eje x esta en 3.1604, lo cual al hace que en las siguientes
iteraciones encuentre más rápidamente la raíz que está en X=3.06497
Código en Octave:
clc
clear
clear all
format long
inputfuncion = input('Ingrese la función a la que le quiere calcular la raiz: ', 's'); %El usuario
debe ingresar la función a la cual va a calcularle la raiz
funcion = inline(inputfuncion); %Aqui se convierte la funcion en una serie de caracteres
para poder evaluar valores
inputderivada = input('Ingrese la derivada de la funcion', 's'); %Aqui el usuario ingresa la
derivada de f(x)
derivada = inline(inputderivada); %Aqui se convierte la derivada en una serie de caracteres
para poder evaluar valores
x0 = input('Ingrese el valor inicial inicial: '); %Aqui se debe ingresar el valor inicial a evaluar
tol = input('Ingrese el valor de tolerancia deseada: '); %Se pide ingresar la tolerancia
iter = input('Ingrese el número máximo de iteraciones: '); %Ingresar numero maximo de
iteraciones a realizar
fx = funcion(x0); %Aqui se evalua fx en el punto inicial ingresado
dx = derivada(x0); %Aqui se evalua dx en el punto inicial ingresado
i=1; %Se inicia el contador de iteraciones
error=tol+1; %Se le da un valor inicial error
while fx~=0 && dx~=0 && error>tol && i<iter %Mientras no se haya encontrado la raiz y el
error sea mayor que la tolerancia y el contador menor que iter comenzara a iterar el
metodo
x1=x0-(fx/dx); %Se halla el valor de x1 por medio de x0
fx=funcion(x1); %Evalua fx en x1
dx=derivada(x1); %Evalua dx en x1
error=abs(x1-x0); %Calcula el error
x0=x1; %Se repite la iteracion haciendo x0=x1
i=i+1; %Incrementa el numero de iteraciones
tabla(i,1)=i; %En la columna 1 se muestra el numero de iteraciones
tabla(i,2)=x0; %En la columna 2 se muestra
tabla(i,3)=fx; %En la columna 3 se muestra
tabla(i,4)=error; %En la columna 4 se muestra el error absoluto
end
disp(tabla); %Muestra la tabla
if fx==0 %Si encontro la raiz muestra el valor de x donde esta la raiz
fprintf('La raiz es : %g \n',x0);
else
if error<tol %No se encontro la raiz pero se llego a una aproximacion a esta con un error
menor a la tolerancia
fprintf('La aproximacion a la raiz es : %g con un error de: %g ',x0,error);
else
if dx==0
fprintf('no se puede ejecutar el metodo porque p0 (%g) es una
posible raiz multiple',x0)
else %No se encontro la raiz con el numero de iteraciones ingresadas
fprintf('El numero de iteraciones ingresadas no fue suficiente');
end
end
end
5. Método de la Secante
El método de la secante se define como una variante del Método de Newton. A
partir de la ecuación iterativa del método de Newton, se sustituye la derivada por
una expresión próxima.
El método de Newton está dado por:
Y la derivada evaluada en está dada por:
Al aproximar el valor del límite evaluado en , tenemos que:
Al sustituir este valor en la ecuación que define la iteración del método de Newton,
se obtiene el método de la secante:
Paso a paso:
a) Se seleccionan dos valores como punto de partida y (dentro del
intervalo de interés), y se obtiene mediante la ecuación iterativa.
b) Se genera una sucesión de valores que se espera
converja a la raíz de la ecuación .
c) Se suspende el proceso cuando se llegue al valor de la raíz o a la
aproximación de ésta tomando en cuenta la precisión deseada.
Ilustración 10 - Método de la Secante
Ejemplo:
Encontrar la raíz de la ecuación f(x)=cos(x)-cos(3.1*x)
Límite izquierdo del intervalo: 1
Límite derecho del intervalo: 2
Tolerancia: 0.000001
Número de iteraciones: 1000
La aproximación a la raíz es 1.53248 con un error de 2.23894x10-10.
Este método es bastante rápido puesto que encontró la aproximación a la raíz en
seis (6) iteraciones. Además es bastante preciso ya que el error es del orden de 10
a la menos 10.
Código en Octave:
clc
clear
clear all
format long
inputfuncion = input('Ingrese la función : ', 's'); %Aqui el usuario debe ingresar la
funcion para calcularle la raiz
funcion = inline(inputfuncion);%Aqui se convierte a funcion una serie de caracteres
para poder evaluar valores
x0 = input ('Ingrese el límite izquierdo del intervalo: '); %Aqui se debe ingresar la
primera aproximacion para evaluar en f(x)
x1 = input ('Ingrese el límite derecho del intervalo: '); %Aqui se debe ingresar la
segunda aproximacion para evaluar en f(x)
tol = input ('Ingrese la tolerancia deseada : '); %Se pide ingresar la tolerancia
iter = input ('Ingrese el número de iteraciones máximas : '); %Ingresar el numero
maximo de iteraciones a realizar
fx0=funcion(x0); %Aqui se evalua x0 en la funcion
if fx0==0 %Si encontro la raiz muestra el valor de x donde esta la raiz
fprintf('La raiz es : %g \n',x0);
else
fx1=funcion(x1); %Se evalua la funcion en el punto x1
i=1; %Se inicia el contador de iteraciones
error=tol+1; %Se le da un valor inicial error
denominador=fx1-fx0; %Se calcula el denominador
while error>tol && fx1~=0 && denominador~=0 && i<iter
x2=x1-((fx1*(x1-x0))/denominador); %Se halla el valor de x2
error=abs(x2-x1); %Calcula el error
x0=x1; %Se hace x0=x1
fx0=fx1; %Se hace fx0=fx1
x1=x2; %sS hace x1=x2
fx1=funcion(x1); %Se evalua la funcion en el punto x1
denominador=fx1-fx0; %Se calcula el denominador
i=i+1; %Incrementa el numero de iteraciones
tabla(i,1)=i; %En la columna 1 se muestra el numero de
iteraciones
tabla(i,2)=x1; %En la columna 2 se muestra
tabla(i,3)=fx1; %En la columna 3 se muestra
tabla(i,4)=error; %En la columna 4 se muestra el error
absoluto
end
disp(tabla); %Muestra la tabla
if fx1==0 %Si encontro la raiz muestra el valor de x donde
esta la raiz
fprintf('La raiz es : %g \n',x1);
else
if error<tol %No se encontro la raiz pero se
llego a una aproximacion a esta con un error menor a la tolerancia
fprintf('La aproximacion a la raiz es : %g
con un error de: %g ',x1,error);
else
if denominador==0 %Si el
denominador es 0 no se puede ejecutar el metodo
fprintf('no se puede
ejecutar el metodo porque x1 (%g) es una posible raiz multiple',x1);
else %No se encontro la
raiz con el numero de iteraciones ingresadas
fprintf('El numero
de iteraciones ingresadas no fue suficiente');
end
end
end
end
6. Método de la Regla Falsa
Es un método que conserva las características y condiciones del método de la
bisección, su diferencia se encuentra al calcular los puntos para nuevos intervalos.
Requiere dos puntos iniciales, se construye una recta secante a estos puntos y se
evalúa donde cruza al eje x, de esta forma se aproximara más rápido a la raíz
P
P3 P2
P1
Ilustración 11 - Método de la Regla falsa
Paso a paso
a) Se seleccionan dos valores arbitrarios P0 y P1 (dentro del intervalo de interés), se traza una recta secante a estos dos puntos.
b) Se evalúa f(P0) f(P1)<0 para garantizar que tienen signos opuestos.
c) Se observa el intercepto de la recta secante con el eje x, para hallar P2.
d) Se evalúa f(P2):
Si f(P2)=0 P2 es la raíz
Si f(P1)f(P2)<0 se usa P1 y P2 para la siguiente iteración.
Si f(P1)f(P2)>0 se usa P0 y P2 para la siguiente iteración.
Ejemplo:
Encontrar la raíz de f(x)=cos(x)-cos(3.1*x)
Primer valor inicial: 1
Segundo valor inicial: 2
Tolerancia: 0.000001
Número de iteraciones: 1000
La aproximación a la raíz es 1.53248 con un error de 3.80929x10-10.
Código en Octave
clc
clear
clear all
format long
ingresefuncion=input('ingrese la funcion: ', 's'); %Aqui el usuario debe ingresar la
funcion para calcularle la raiz
x0=input('ingrese el primer valor inicial: '); %Se debe ingresar la primera
aproximacion
x1=input('ingrese el segundo valor inicial: '); %Se debe ingresar la segunda
aproximacion
tol=input('ingrese la tolerancia deseada: '); %Se debe ingresar la tolerancia
deseada por el usuario
iter=input('ingrese el numero de iteraciones: '); %Se debe ingresar el maximo
numero de iteraciones a realizar
funcion=inline(ingresefuncion); %Aqui se convierte la funcion en una serie de
caracteres para poder evaluar valores
fx0=funcion(x0); %Aqui se evalua la funcion en x0
fx1=funcion(x1); %Aqui se evalua la funcion en x1
if fx1==0 %Si al evaluar la funcion en x1 da 0 entonces indica que la raiz es x1
fprintf('La raiz es : %g \n',x1);
else
if fx0==0
fprintf('La raiz es : %g \n',x0); %Si al evaluar la funcion en x0 da 0
entonces indica que la raiz es x0
else
if fx0*fx1<0 %Si la funcion en x0 y x1 tiene cambio de signo entonces
se utiliza este intervalo
x2= x0-((fx0*(x1-x0))/(fx1-fx0)); %Encuentra el valor del
punto medio
fx2=funcion(x2); %Evalua la funcion en el punto medio
encontrado
i=1; %Se inicia el contador
error=tol+1; %Se inicia el error
while error>tol && fx2~=0 && i<=iter %Mientras el error sea
mayor a la tolerancia, fxm diferente de 0 y la iteracion actual sea menor o igual a
iter, evalue las siguientes condiciones
if fx0*fx2<0 %Si la funcion evaluada en a y xm cambia
de signo entonces hacer limite superior xm y evalue la funcion
x1=x2; %Se iguala x1 con x2
fx1=fx2; %Como las variables son iguales. Las
respectivas funciones también lo seran
else %Sino esto quiere decir que la raiz se
encuentra en el otro intervalo
x0=x2; %Igualo x0 a x2
fx0=fx2; %Como las variables son iguales. Las
respectivas funcions también lo seran
end
xaux=x2;
x2=x0-((fx0*(x1-x0))/(fx1-fx0)); %Encuentra el valor
medio del intervalo
fx2=funcion(x2); %Evalua la funcion en el punto
medio encontrado
error=abs(x2-xaux); %Se compara el error con la
tolerancia
i=i+1; %Incrementa el numero de iteraciones
tabla(i,1)=i; %En la columna 1 se muestra el numero
de iteraciones
tabla(i,2)=x2; %En la columna 2 se muestra
tabla(i,3)=fx2; %En la columna 3 se muestra
tabla(i,4)=error; %En la columna 4 se muestra el error
absoluto
end
if fx2==0
fprintf('La raiz es : %g \n',x2); %Si al evaluar la funcion
en xm da 0 entonces indica que la raiz es xm
else
if error<tol %N se encontro la raiz pero se llego a una
aproximacion a esta con un error menor a la tolerancia
fprintf('La aproximacion a la raiz es : %g con un
error de: %g \n ',x2,error);
else %El numero maximo de iteraciones que
ingreso el usuario, no son suficientes para encontrar la raiz
fprintf('El numero de iteraciones ingresadas no
fue suficiente: \n ');
end
end
else %Ls valores ingresados estan errados, vuelva a dar un
nuevo intervalo
fprintf('El intervalo ingresado es indaecuado: \n ');
end
end
disp(tabla); %Muestra la tabla
end
7. Método de las Raíces Múltiples
Es conocido como el método de Newton-Raphson modificado.
Una de las condiciones para garantizar la convergencia del método de Newton-
Raphson es que , donde P es la raíz de la ecuación . Si al
momento de ejecutar el método de Newton-Raphson se observa que se
aproxima a 0 (cero), se nota que la rapidez de convergencia del método disminuye.
Del mismo modo se entiende que si en un valor de P se presenta simultáneamente
que y que , entonces P es un valor crítico.x
Se dice que P es una raíz de multiplicidad m de f si puede escribirse:
, donde . Si , se llama raíz simple.
El criterio de multiplicidad de una raíz se determina con el siguiente teorema:
Sea [ ]. La función f tiene una raíz de multiplicidad m en P si y sólo si
pero .
Paso a paso:
a) Elegir un punto inicial cualquiera x1 como aproximación de la raíz.
b) Obtener los valores de la función, de su primera y de su segunda
derivada en ese punto.
c) Establecer la función
y obtener el valor de la misma en el
punto inicial.
d) Trazar una recta tangente a la función por ese punto.
e) El punto de intersección de esta recta con el eje de las abscisas (x2, 0),
constituye una segunda aproximación de la raíz.
f) El proceso se repite n veces hasta que el punto de intersección xn
coincide prácticamente con el valor exacto de la raíz.
Se utiliza la siguiente ecuación para hallar el intercepto con el eje x:
Ejemplo:
Encontrar la raíz de la ecuación f(x)=cos(X)-COS(3.1*X)
La raíz es: 1.53248
Error: 0.80007*10^-13
Se puede observar que el método converge rápidamente y con gran precisión ya que
encontró la raíz en 7 iteraciones.
Código en Octave:
clc
clear
clear all
format long
inputfuncion = input('Ingrese la función : ', 's'); %El usuario debe ingresar la función
a la cual va a calcularle la raiz
funcion = inline(inputfuncion); %Aqui se convierte la funcion en una serie de
caracteres para poder evaluar valores
inputderivada = input('Ingrese la derivada : ', 's'); %Aqui el usuario ingresa la
primera derivada de f(x)
derivada = inline(inputderivada); %Aqui se convierte la primera derivada en una
serie de caracteres para poder evaluar valores
input2daderivada = input('Ingrese la segunda derivada : ', 's'); %Aqui el usuario
ingresa la segunda derivada de f(x)
derivada2 = inline(input2daderivada); %Aqui se convierte la segunda derivada en
una serie de caracteres para poder evaluar valores
x0 = input('Ingrese un valor aproximado a la raíz : '); %Aqui se debe ingresar el
valor inicial a evaluar
tol = input('Ingrese la tolerancia permitida : '); %Se pide ingresar la tolerancia
iter = input('Ingrese el número de iteraciones máximas : ');%Ingresar numero
maximo de iteraciones a realizar
fx = funcion(x0); %Aqui se evalua fx en el punto inicial ingresado
dx = derivada(x0); %Aqui se evalua la primera derivada en el punto x0
d2x = derivada2(x0); %Aqui se evalua la segunda derivada en el punto x0
denominador=(dx^2-(fx*d2x)); %Aqui se calcula el valor del denominador
i=1; %Se inicia el contador de iteraciones
error=tol+1; %Se le da un valor inicial error
while fx~=0 && dx~=0 && error>tol && i<iter && denominador~=0 %Mientras no
se haya encontrado la raiz y el error sea mayor que la tolerancia y el contador
menor que iter comenzara a iterar el metodo
x1=x0-((fx*dx)/denominador); %Se halla el valor de x1
fx=funcion(x1); %Evalua fx en x1
dx=derivada(x1); %Evalua la primera derivada en x1
d2x=derivada2(x1); %Evalua la segunda derivada en x1
denominador=(dx^2-(fx*d2x)); %Se reevalua el denominador
error=abs(x1-x0); %Calcula el error
x0=x1; %Se repite la iteracion haciendo x0=x1
i=i+1; %Incrementa el numero de iteraciones
tabla(i,1)=i; %En la columna 1 se muestra el numero de iteraciones
tabla(i,2)=x0; %En la columna 2 se muestra el valor de x1
tabla(i,3)=fx; %En la columna 3 se muestra el valor de fx1
tabla(i,4)=error; %En la columna 4 se muestra el error absoluto
end
disp(tabla); %Muestra la tabla
if fx==0 %Si encontro la raiz muestra el valor de x donde esta la raiz
fprintf('La raiz es : %g \n',x0);
else
if error<tol %No se encontro la raiz pero se llego a una aproximacion a esta
con un error menor a la tolerancia
fprintf('La aproximacion a la raiz es : %g con un error de: %g
',x0,error);
else
if denominador==0 %Si el denominador es 0 no se puede ejecutar el
metodo
fprintf('no se puede ejecutar el metodo porque el
denominador (%g) es igual a ',denominador)
else %No se encontro la raiz con el numero de iteraciones
ingresadas
fprintf('El numero de iteraciones ingresadas no fue suficiente');
end
end
end
CONCLUSIONES
El método de Newton-Raphson es el que tiene más precisión al encontrar las
raíces, además converge más rápido que otros métodos como bisección, regla falsa
y punto fijo. Sin embargo el método de la secante también presenta alto rapidez
de convergencia, pues encuentra la raíz en pocas iteraciones.
Para garantizar la convergencia de los métodos es necesario que la función sea
continua al menos en el intervalo a evaluar. Sin embargo bajo ciertas condiciones
especiales, los métodos como el de Newton, punto fijo, secante y raíces múltiples
pueden llegar a divergir, en tales casos resultan más efectivos los métodos de
búsquedas incrementales y bisección, ya que aunque requieran de más iteraciones
siempre convergen.
Para el método de búsquedas incrementales, no es estrictamente necesario que al
evaluar la función en los extremos del intervalo, exista un cambio de signo.
Para realizar las demostraciones de los métodos es necesario tener conceptos
claros sobre algunos teoremas (Teorema de valor intermedio, teorema del valor
medio y el teorema de rolle).
BIBLIOGRAFÍA
Capitulo 5: Ceros de Funciones. (s.f.). Recuperado el 12 de Septiembre de 2013, de
http://portales.puj.edu.co/objetosdeaprendizaje/Online/OA10/AnimacionesFlash/i
ndicecap5.html
Mario Cesca, M. C. (2012). Procesos Industriales. Recuperado el 12 de Septiembre
de 2013, de Métodos Numéricos:
http://www1.herrera.unt.edu.ar/faceyt/procesosindustriales/files/2011/04/MN20
12.pdf
Métodos Numéricos. (s.f.). Recuperado el 12 de Septiembre de 2013, de
http://noosfera.indivia.net/metodos/puntoFijo.html
Resolución de Ecuaciones no Lineales. (s.f.). Recuperado el 12 de Septiembre de
2013, de
http://www.docentes.unal.edu.co/afedosova/docs/Metodo%20de%20punto%20fij
o.pdf
Romero, L. N. (s.f.). SlideShare. Recuperado el 12 de Septiembre de 2013, de
MéTodo De IteracióN De Punto Fijo:
http://www.slideshare.net/lisset_1534/mtodo-de-iteracin-de-punto-fijo
Zabala, F. J. (2010). Métodos Numéricos. Medellín: Fondo Editorial Universidad
EAFIT.