You are on page 1of 28

Universidad Nacional Agraria La Molina

Facultad de Ingeniería Agrícola


Departamento de Recursos Hídricos

Análisis Numérico en Ingeniería


(Aplicaciones con MATLAB)

Solución de
Ecuaciones
no Lineales

Jesús Abel Mejía Marcacuzco, Ph.D.


Lima - Perú
SOLUCIÓN DE ECUACIONES NO LINEALES
Los siguientes son algunos ejemplos de ecuaciones no lineales.

1  4 x  16x 2  3x 3  3x 4  0 ecuación polinomial

f ( x)    0, a xb
x(2.1  0.5 x)1 / 2
 3.69  0 0  x 1
(1  x)(1.1  0.5 x) 1/ 2

tan(x) = tanh(2x) ecuación trascendental

Este tipo de ecuaciones carecen de solución exacta, excepto para


muy pocos problemas. La solución analítica de las ecuaciones
polinomiales existe solo hasta el cuarto orden. Por lo tanto, las
raíces de esas ecuaciones no lineales se obtienen mediante
métodos computacionales basados en procedimientos iterativos.
Los métodos numéricos diseñados para encontrar las raíces
son poderosos aunque cada uno tiene sus propias limitaciones
y defectos. Por lo tanto, se deben conocer los pros y los contras
de cada método y sus dificultades.
Algunos esquemas para encontrar raíces de ecuaciones
Método Necesidad de un Necesidad de Tipo de Otras características
intervalo que continuidad ecuación especiales
contenga la raíz de f'
Bisección “si” no cualquiera Robusto, aplicable a
funciones no analíticas
Falsa posición “si” “si” cualquiera Convergencia lenta en un
intervalo grande
Falsa posición “si” “si” cualquiera Más rápido que el método
modificada de falsa posición
Método de no “ si” cualquiera Rápido, se necesita
Newton calcular f‘. Aplicable a
raíces complejas
Método de la no “si” cualquiera Rápido no se requiere
secante calcular f'
Punto fijo o no “si” Cualquiera Puede no converger
sustituciones
sucesivas
Los métodos de bisección, falsa posición y falsa posición
modificado tienen algunas características comunes como
encontrar una raíz si se conoce su intervalo de x que contenga
a la raíz. Por lo tanto, estos métodos necesitan un esfuerzo
preliminar para estimar el intervalo adecuado que contenga a
la raíz deseada. Los métodos de Newton y de la secante y de
punto fijo o sustituciones sucesivas necesitan una
estimación inicial y no la estimación de un intervalo.
Los métodos de programación de MATLAB permiten abordar
las técnicas de cálculo numérico mediante la implementación
sencilla de los algoritmos teóricos que resuelven un caso
importante de aproximación a soluciones de problemas. Entre
estos problemas juega un papel primordial la resolución de
ecuaciones no lineales mediante algoritmos que no es otra
cosa que el código MATLAB que simplemente ejecuta una
serie de comandos o funciones que aceptan argumentos y
producen una salida.
Método de la Bisección

Secuencia de los intervalos y puntos medios


Es un método simple, seguro y
1ro.
y sólido para encontrar una 2do.
raíz en un intervalo dado, 3ro.
donde se sabe que existe
dicha raíz. Funciona aún a b c
x
para funciones no analíticas.
Método de bisección

Suponga que el intervalo entre x = a y x = c denotado por


[a,c], equivalente a  x  c, tiene una sola raíz, como se
muestra en la figura. El método de bisección se basa en el
hecho de que, para que un intervalo [a,c] tenga una raíz,
basta que los signos de f(a) y f(c) sean opuestos; es decir
f(a).f(c)  0.
El primer paso para utilizar este método es bisectar el
intervalo [a,c] en dos mitades; a saber, [a,b] y [b,c],
donde b = (a + c)/2. Así, si f(a).f(b)  0, el intervalo
[a,b] que incluye a x = a y x = b contiene a la raíz, en
caso contrario el intervalo [b,c] tiene la raíz. El nuevo
intervalo que contiene a la raíz se bisecta de nuevo.
Al repetir este proceso, el tamaño del intervalo con la
raíz se vuelve cada vez más pequeño. La iteración se
detiene cuando la mitad del intervalo está dentro de
una tolerancia dada . El número mínimo de pasos de
iteración necesarios es el que satisface:

c  a    ca
Equivalente a: n  1.4427 ln  
2n   

Por ejemplo, si (c – a) = 1 y  = 0.0001, entonces n = 14.


Ejemplo: Si la raíz de ex – 2 = 0, está en [0,2]. Hallar un valor aproximado de
la raíz con una tolerancia de  = 0.01. Elaborar el código en MATLAB y
aplicar a la solución del problema.
Solución: En la primera iteración, i = 1, con a = 0 y c = 2 y b = (0+2)/2 = 1,
se calculan los valores de f(a), f(b) y f(c). Al examinar los signos de los
valores de f, vemos que la raíz se localiza entre a y b. Por lo tanto, a y b del
paso i =1 se convierten respectivamente, en a y c para el paso i = 2. La
nueva b para el paso i = 2 es b = (0+1)/2 = 0.5 y se calcula f(b). La iteración
para el resto continúa de manera similar hasta que se alcanza la tolerancia.
La octava aproximación para la raíz es b = 0.6953, con un error de 0.0078,
que está dentro de la tolerancia.
Nº a b c f(a) f(b) f(c) Error
1 0 1 2 -1 0.7182 5.3890 1
2 0 0.5 1 -1 -0.3512 0.7182 0.5
3 0.5 0.75 1 -0.3512 0.1170 0.7182 0.25
4 0.5 0.625 0.75 -0.3512 -0.1317 0.1170 0.125
5 0.625 0.6875 0.75 -0.1317 -0.0112 0.1170 0.0625
6 0.6875 0.7187 0.75 -0.0112 0.0518 0.1170 0.03125
7 0.6875 0.7031 0.7187 -0.0112 0.0200 0.0518 0.015625
8 0.6875 0.6953 0.7031 -0.0112 0.0043 0.0200 0.0078125
%Programa de Cómputo en MATLAB para el Método de Bisección
clc;
Fx=input('Ingrese la funcion: ','s');
a=input('Ingrese a : ');
c=input('Ingrese c : ');
e=input('Ingrese el error : ');
x=a;
Fa=eval(Fx);
x=c;
Fc=eval(Fx);
fprintf('\n %6s %7s %8s %10s %8s %8s %8s \n ','A','B','C','F(a)','F(b)','F(c)','|c-a|');
while abs(c-a)>e
b=(a+c)/2;
x=b;
Fb=eval(Fx);
fprintf('\n %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f \n',a,b,c,Fa,Fb,Fc,abs(c-a));
if Fa*Fb<=0
c=b;
Fc=Fb;
Else
a=b;
Fa=Fb;
end
end
fprintf('\nEl resultado es: %.4f\n',b);
ezplot(Fx);%graficamos la funcion
grid on;
Aplicación:

Ingrese la funcion: exp(x)-2


Ingrese a : 0
Ingrese c : 2
Ingrese el error : 0.001
A B C F(a) F(b) F(c) |c-a|
0.0000 1.0000 2.0000 -1.0000 0.7183 5.3891 2.0000
0.0000 0.5000 1.0000 -1.0000 -0.3513 0.7183 1.0000
0.5000 0.7500 1.0000 -0.3513 0.1170 0.7183 0.5000
0.5000 0.6250 0.7500 -0.3513 -0.1318 0.1170 0.2500
0.6250 0.6875 0.7500 -0.1318 -0.0113 0.1170 0.1250
0.6875 0.7188 0.7500 -0.0113 0.0519 0.1170 0.0625
0.6875 0.7031 0.7188 -0.0113 0.0201 0.0519 0.0313
0.6875 0.6953 0.7031 -0.0113 0.0043 0.0201 0.0156
0.6875 0.6914 0.6953 -0.0113 -0.0035 0.0043 0.0078
0.6914 0.6934 0.6953 -0.0035 0.0004 0.0043 0.0039
0.6914 0.6924 0.6934 -0.0035 -0.0015 0.0004 0.0020
El resultado es: 0.6924
Hemos supuesto que el intervalo inicial tiene sólo una raíz y
que f(a).f(b) 0. Sin embargo, f(a).f(b)0 se satisface siempre
que el intervalo tenga un número impar de raíces, como se
ilustra en la siguiente figura a. En este caso, el método de
bisección encontrará una de las raíces separadas en el
intervalo dado. El método de bisección no puede encontrar
una pareja de raíces dobles, debido a que la función toca el
eje x de manera tangencial en las raíces dobles, como se
muestra en la figura b.
f(x) f(x) f(x)

x=a
x=c

Figura a: Nº impar de Figura b: Función con Figura c: Función con


raíces en un intervalo un punto en el eje x un punto singular
Un defecto del método de bisección es que éste puede
atrapar a una singularidad como si fuera una raíz, debido a
que dicho método no reconoce la diferencia entre una raíz
y una singularidad. Un punto singular es aquel en el que el
valor de la función tiende a infinito, lo cual se ilustra en la
figura c. Para evitar este problema, se debe verificar si
|f(c) - f(a)| converge a cero para aplicar el método de
bisección.

Ejemplo: Determinar intervalos de tamaño 0.5, que contengan


una o más raíces (impares) de:
y = -19(x–0.5)(x–1)+exp(x)– exp(-2x), -0.5 < x < 6.5.
Solución: Calculamos y para x = -0.5, -1, -1.5, . . . ,6, 6.5 y
hacemos una tabla de valores. Después, marcamos el
intervalo en el que la función cambia de signo (ver tabla):
x y
-0.5 -30.612
0.0 -9.500
0.5 1.281
1.0 2.583
1.5 -5.068
2.0 -21.129
2.5 -44.824
3.0 -74.917
3.5 -109.385
4.0 -144.902
4.5 -175.983
5.0 -193.587
5.5 -182.808
6.0 -119.071
6.5 38.142

Así, se encuentran tres intervalos, [0,0.5], [1,1.5] y [6,6.5],


cada uno de los cuales contiene al menos una raíz.
Método de la falsa posición
En este método el tamaño del intervalo que
contiene a la raíz se reduce mediante
iteración, para ello se utiliza una interpolación
lineal ajustada a dos puntos extremos para
encontrar una aproximación de la raíz, por lo
que la convergencia es más rápida que en el
método de la bisección. Dado un intervalo [a,c]
que contenga a la raíz, la función lineal que
pasa por (a,f(a)) y (c,f(c)) se escribe como:

f c   f a  ca
y  f a   x  a  x a  y  f a 
ca f c   f a 
ca af c   cf a 
Haciendo y = 0, se obtiene: ba f a  
f c   f a  f c   f a 

Después de encontrar b, el intervalo [a,c] se divide en [a,b] y [b,c]. Si f(a).f(b)


 0, la raíz se encuentra en [a,b]; en caso contrario, está en [b,c]. Los
extremos del nuevo intervalo que contiene la raíz se renombran a y c. El
procedimiento de interpolación se repite hasta que las raíces estimadas
convergen.
La desventaja del método de falsa posición es que uno de los
extremos de la sucesión de intervalos no se mueve del punto
original, por lo que las aproximaciones a la raíz, convergen a la
raíz exacta solamente por un lado.

El método de la falsa posición


modificada, supera estas
limitaciones dado que el valor de f en
un punto fijo se divide a la mitad si
este punto se ha repetido más de dos
veces. El extremo que se repite se
llama extremo fijo. La excepción a
esta regla es que para i = 2, el valor
de f en un extremo se divide entre 2
de inmediato si no se mueve.
Ejemplo: Encontrar la intersección de estas dos funciones

y  x2  1 y  tan( x ) 0  x 1 tolerancia = 0.001

Solución: El problema equivale a encontrar el cero de: f  x 2


 1  tan( x )
a b c f(a) f(b) f(c) abs(b-a)
0.00000 0.87474 1.00000 1.00000 0.13180 -0.14319 0.87474
0.87474 0.93478 1.00000 0.13180 0.01455 -0.14319 0.06004
0.93478 0.94079 1.00000 0.01455 0.00147 -0.14319 0.00601
0.94079 0.94139 1.00000 0.00147 0.00015 -0.14319 0.00060
0.94139 0.94145 1.00000 0.00015 0.00001 -0.14319 0.00006
0.94145 0.94146 1.00000 0.00001 0.00000 -0.14319 0.00001
% Programa de Cómputo en MATLAB: Método de la Falsa Posición
Fx=input('Ingrese la funcion: ','s');
a=input('Ingrese a : ');
c=input('Ingrese c : ');
e=input('Ingrese el error : ');
x=a;
Fa=eval(Fx);
x=c;
Fc=eval(Fx);
fprintf('\n %6s %7s %8s %10s %8s %8s %8s \n ','A','B','C','F(a)','F(b)','F(c)','|c-a|');
while abs(c-a)>e
b=(c*Fa-a*Fc)/(Fa-Fc);
x=b;
Fb=eval(Fx);
fprintf('\n %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f \n',a,b,c,Fa,Fb,Fc,abs(c-a));
if abs(Fc)<e
break;
else
if Fa*Fb<=0
c=b;
Fc=Fb;
else
a=b;
Fa=Fb;
end
end
end
fprintf('\nEl resultado sera %.4f',b);
ezplot(Fx);%graficamos la funcion
grid on
>> falsaposicion
Ingrese la funcion: sqrt(x^2+1)-tan(x)
Ingrese a : 0
Ingrese c : 1
Ingrese el error: 0.001
sqrt(x 2+1)-tan(x)
A B C F(a) F(b) F(c) |c-a|
0.0000 0.8747 1.0000 1.0000 0.1318 -0.1432 1.0000 12
0.8747 0.9348 1.0000 0.1318 0.0145 -0.1432 0.1253
0.9348 0.9408 1.0000 0.0145 0.0015 -0.1432 0.0652 10
0.9408 0.9414 1.0000 0.0015 0.0001 -0.1432 0.0592
8
0.9414 0.9415 1.0000 0.0001 0.0000 -0.1432 0.0586
0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585
6
0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585
0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585
4
0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585
0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585 2
0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585
0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585 0
0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585
0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585 -2
0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585
0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585 -4
El resultado es: 0.9415
-6
-6 -4 -2 0 2 4 6
x
Método de Newton
Llamado también como método de Newton-Raphson encuentra una raíz, a
partir de una estimación inicial. Al utilizar el desarrollo de Taylor de f(x)
entorno a una estimación x0 la ecuación puede escribirse como:

f ( x)  0  f ( x0 )  f ' ( x0 )( x  x0 )  O(h 2 )
y
La recta tangente que pasa por (x0,f(x0)) es:
fo
g( x)  f ´( x0 )( x  x0 )  f ( x0 )
f1
Haciendo g(x) = 0, se obtiene: f2

f  x0  f xi 1 
x1  x0  xi  xi 1  x
f ´x0  f ´xi 1 
x2 x1 xo
Método de Newton
Para funciones difíciles de derivar; la derivada puede aproximar por
aproximaciones hacia adelante o hacia atrás con h constante:
 f xi 1  h  f xi1   f xi1   f xi1  h
f ´(xi 1 )  f ´xi 1  
h h
Ejemplo: Resolver para a = 155 la siguiente ecuación cúbica,
mediante el método de Newton.
f x   x 3  a

Solución: El esquema iterativo se escribe como:

f x n  xn  a 2
3
a
x n 1  xn   xn   xn  2
f ' x n  2
3xn 3 3xn

Para un valor inicial de x = 5, Para un valor inicial de x = 10, se


se obtiene: obtiene :
n X
n X
0 10
0 5
1 7.183334
1 5.4
2 5.790176
2 5.371834
3 5.401203
3 (exacto) 5.371686
4 5.371847
5 (exacto) 5.371686
Ejemplo: Elaborar el código en MATLAB para el cálculo de raíces por el
método de Newton y aplicar a la solución del ejemplo:
Solución:
% Método de Newton para encontrar la raíz de una ecuación
clc
fprintf ('Cálculo de una raíz por el método de Newton\n');
format long
x0=input('Ingrese el valor inicial de x; x0: ');
precis=input('Ingrese la precisión de cálculo; precis: ');
fun=input('Ingrese la función entre apóstrofes: ');
dfun=input('Ingrese la derivada de la función entre apóstrofes: ');
f=inline(fun);
df=inline(dfun);
it=0;
x=x0;
d=f(x)/df(x);
fprintf('\n %6s %7s \n ','Iter.','x');
while abs(d)>precis
fprintf('\n %8.4f %8.4f \n',it,x);
x1=x-d;
it=it+1;
x=x1;
d=f(x)/df(x);
end;
fprintf('\n %8.4f %8.4f \n',it,x);
Aplicación para la solución de la ecuación: f(x) = x3 – 155

Cálculo de una raíz por el método de Newton


Ingrese el valor inicial de x; x0: 10
Ingrese la precisión de cálculo; precis: 0.0001
Ingrese la función entre apóstrofes: 'x^3-155'
Ingrese la derivada de la función entre apóstrofes: '3*x^2'

Iter. x
0.0000 10.0000
1.0000 7.1833
2.0000 5.7902
3.0000 5.4012
4.0000 5.3718
5.0000 5.3717
Método de la Secante

Se diferencia del método de Newton en que f´ se aproxima


utilizando dos valores de iteraciones consecutivas de f. Esto
elimina la necesidad de evaluar tanto f como a f' en cada
iteración. El método de la secante esta ligada con el método
de la falsa posición, ya que ambos se basan en la fórmula de
interpolación lineal; el primero utiliza extrapolaciones,
mientras que el segundo utiliza únicamente interpolaciones.

xn1  xn2
fo

xn  xn1  y n1
f2
f1 y n1  y n2
x
x2 x1 xo
Método de la Secante
Ejemplo: Determinar la velocidad terminal de un proyectil que
desciende verticalmente con una velocidad V (m/s):
1.15V 2  1.4V 1.5  1962
Solución: El problema consiste en el cálculo de la raíz de:
Y  f (V )  1.15V 2  1.4V 1.5  1962
para lo cual se requiere asignar los valores iniciales para V0 y V1 para
obtener e valor de V2, de acuerdo a la fórmula siguiente:

V1  V0 n V
V2  V1  f (V1 ) 0 30.00000
f (V1 )  f (V0 ) 1 30.10000
2 30.15411
Haciendo: V0 = 30.0 y V1 = 30.1, 3 38.62414
se obtiene la siguiente tabla de 4 37.64323
resultados donde la velocidad
5 37.73358
terminal es V = 37.7 m/s
6 37.73458
Ejemplo: Elaborar el código en MATLAB para la solución del problema anterior.
Solución
% Método de la Secante para encontrar la raíz de una ecuación
clear all;
clc;
fprintf('Cálculo de una raíz por el método de la Secante\n');
f=input('Ingresar la funcion f(x) : ','s');
x0=input('Ingresar el primer valor inicial de x; x0: ');
x1=input('Ingresar el primer valor inicial de x; x1: ');
precis=input('Ingrese la precisión de cálculo; precis: ');
error=100;
it=0;
fprintf('\n %8s %7s %7s %7s \n ','Iter.','x0','x1','xi');
while abs(error)>precis
x=x0;
g=eval(f);
x=x1;
gg=eval(f);
xi=x1-((gg*(x0-x1))/(g-gg));
error=abs(xi-x1);
fprintf('\n %8.4f %8.4f %8.4f %8.4f \n',it,x0,x1,xi);
x0=x1;
x1=xi;
it=it+1;
end
fprintf('\n %8.4f %8.4f %8.4f %8.4f \n',it,x0,x1,xi);
Aplicación del programa en MATLAB

Ingresar la funcion f(x) : 1.15*x^2+1.4*x^1.5-1962 Iter. x0 x1 xi


Ingresar el primer valor inicial de x; x0: 30 0.0000 30.0000 31.0000 38.5257
1.0000 31.0000 38.5257 37.6631
Ingresar el primer valor inicial de x; x1: 31
2.0000 38.5257 37.6631 37.7339
Ingrese la precisión de cálculo; precis: 0.0001 3.0000 37.6631 37.7339 37.7346
4.0000 37.7339 37.7346 37.7346
5.0000 37.7346 37.7346 37.7346
Método del Punto Fijo o de Sustituciones Sucesivas
Sea la ecuación general: f(x) = 0, de la cual se desea
encontrar una raíz. El primer paso consiste en transformar
f(x) a la forma: x = g(x). Por ejemplo para la siguiente
ecuación: f ( x)  2x2  x  5  0 cuyas raíces son 1.850781059 y
-1.350781059, algunas posibilidades de x = g(x), son:
x  g ( x)  2x 2  5 Despejando x del segundo término
x5
x  g ( x)  Despejando x del primer término
2
5
x  g ( x)  Factorizando y despejando x
2x 1
El siguiente paso es tantear una raíz aproximada, x0, a la solución para
calcular g(x0) = x1 y repetir el procedimiento, para un nuevo valor de x. Para
determinar si la sucesión x0, x1, x2, … está convergiendo o divergiendo,
puede calcularse la sucesión f(x0), f(x1), f(x2),…Si dicha sucesión tiende a
cero el proceso converge a la solución en caso contrario diverge de la
solución y debe ensayarse con una g(x) diferente.
Ejemplo: Encontrar la raíz de la ecuación: f ( x)  2x 2  x  5  0
Solución: x5
x0 = 2 g ( x)  2 x  5
2
x0 = 2 g ( x) 
2
i xi g(xi) |f(xi)| i xi g(xi) |f(xi)|
0 2 3 1 0 2.00000 1.87083 1.00000
1 3 13 10 1 1.87083 1.85349 0.12917
2 13 333 320 2 1.85349 1.85115 0.01734
3 333 221773 221440 3 1.85115 1.85083 0.00234

Ejemplo: Encontrar una raíz real de la ecuación: cos x – 3x = 0


Solución: dos posibilidades de g(x) = x, son: a) x=cos x-2x ; b) x = cos x/3
x0 = π/8 g(x) = cos x - 2x x0 = π/8 g(x) = (cos x)/3
i xi g(xi) |f(xi)| i xi g(xi) |f(xi)|
0 0.39270 0.13848 0.25422 0 0.39270 0.30796 0.25422
1 0.13848 0.71346 0.57498 1 0.30796 0.31765 0.02907
2 0.71346 -0.67083 1.38429 2 0.31765 0.31666 0.00298
3 -0.67083 2.12496 2.79579 3 0.31666 0.31676 0.00031
4 2.12496 -4.77616 6.90113 4 0.31676 0.31675 0.00003
Una forma de seleccionar el g(x) adecuado es determinando sus derivadas en x0, escogiendo
aquella cuyo |g’(x0)|<1
Interpretación Geométrica de |g’(x0)|<1
a) Convergencia monotónica: es
y y
cuando los valores sucesivos de
y=x
y=x xi se acercan a la raíz por un
solo lado. Ocurre cuando g’(x)
y = g(x)
y = g(x) se encuentra entre 0 y 1.
b) Convergencia oscilatoria: los
xp x3 x2 x1 x0 x x1 xp x2 x0 x valores sucesivos de xi se
acercan a la raíz por ambos
a) Convergencia monotónica b) Convergencia oscilatoria
lados. Ocurre cuando g’(x) se
encuentra entre -1 y 0.
y = g(x)
y y c) Divergencia monotónica:
y=x y=x
cuando los valores sucesivos de
xi se alejan de la raíz por un solo
lado. Ocurre cuando g’(x) es
y = g(x)
mayor que 1.
xp x0 x1 x2 x x3 x1 xp x0 x2 x d) Divergencia oscilatoria: cuando
los valores sucesivos de xi se
c) Divergencia monotónica d) Divergencia oscilatoria
alejan de la raíz oscilando
alrededor de ella. Ocurre cuando
g’(x) es menor que 1.

You might also like