Está en la página 1de 25

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  4x  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
modificada método 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'
Los métodos de bisección, falsa posición y falsa posición
modificado tienen algunas características comunes; a saber:
estos esquemas pueden encontrar una raíz si se conoce su
intervalo de x que contenga a la raíz. Por lo tanto, todos 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 necesitan una estimación
inicial, pero no es necesaria 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ínmo de pasos de
iteración necesarios es el que satisface:

c  a 0 c  a 0
 Equivalente a: n  log 2
2 n 2n
Por ejemplo, si (c – a)0 = 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

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 siguiente paso i =
2. Así, f(a) y f(b) del paso i = 1 se copian a f(a) y f(c) para el paso i = 2. La b
para el paso i = 2 es b = (a+c)/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
Ejemplo: Elaborar un código en MATLAB para el método de la bisección y
resolver el problema del ejemplo anterior para una tolerancia de 0.001

Solución
%Metodo 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;

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.

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 cuando se lleva a cabo el método de
bisección.
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

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


una o más raíces (impares) de y = -19(x–0.5)(x–1)+exp(x)–
exp(-2x), -10 < x < 10. Repetir con tamaño de intervalo 0.1.

Solución: Calculamos y para x = -10, -9, -8, . . . ,10 y hacemos


una tabla de valores. Después, marcamos el intervalo en el
que la función cambia de signo (ver siguiente tabla):
x y x y
-10 -485167389.91 0 -9.50
-9 -65661774.14 1 2.58
-8 -8887564.02 2 -21.13
-7 -1203744.28 3 -74.92
-6 -163619.29 4 -144.90
-5 -22653.46 5 -193.59
-4 -3408.44 6 -119.07
-3 -669.38 7 355.63
-2 -196.96 8 1983.46
-1 -64.02 9 6811.08
0 10 20401.97

Así, se encuentran tres intervalos, [0,1], [1,2] y [6,7], cada


uno de los cuales contiene al menos una raíz.
100

50

0
-1 0 1 2 3 4 5 6 7
-50
y

-100

-150

-200
x
Método de la falsa posición y de la falsa posición modificada

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 
y  f a   x  a  x a
ca f c   f a 

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

Después de encontrar b, el intervalo [a,c] 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  /2

Solución: El problema equivale a encontrar el cero de: f  x 2  1  tan( x)


Para resolver el problema se ha elaborado el siguiente código 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 A B C F(a) F(b) F(c) |c-a|
break; 0.0000 0.8747 1.0000 1.0000 0.1318 -0.1432 1.0000
else 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
if Fa*Fb<=0 0.9408 0.9414 1.0000 0.0015 0.0001 -0.1432 0.0592
c=b; 0.9414 0.9415 1.0000 0.0001 0.0000 -0.1432 0.0586
Fc=Fb; 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
else 0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585
a=b; 0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585
Fa=Fb; 0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585
end 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
end 0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585
end 0.9415 0.9415 1.0000 0.0000 0.0000 -0.1432 0.0585
fprintf('\nEl resultado sera %.4f',b); 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
ezplot(Fx);%graficamos la funcion
grid on; El resultado es: 0.9415

>> falsaposicion
Ingrese la funcion: sqrt(x^2+1)-tan(x)
Ingrese a : 0
Ingrese c : 1
Ingrese el error: 0.001
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 ´( x 0 )( x  x 0 )  f ( x 0 )
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 xn  xn  a 2
3
a
xn 1  xn   xn   xn  2
f ' xn  2
3x n 3 3x n

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 de la ecuación del
ejemplo anterior:

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
f1 y n1  y n2
f2

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 de la ecuación del
ejemplo anterior, mediante el método de la Secante.

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);

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


Ingresar la funcion f(x) : 1.15*x^2+1.4*x^1.5-1962
Ingresar el primer valor inicial de x; x0: 30
Ingresar el primer valor inicial de x; x1: 31
Ingrese la precisión de cálculo; precis: 0.0001
Iter. x0 x1 xi
0.0000 30.0000 31.0000 38.5257
1.0000 31.0000 38.5257 37.6631
2.0000 38.5257 37.6631 37.7339
3.0000 37.6631 37.7339 37.7346
4.0000 37.7339 37.7346 37.7346
5.0000 37.7346 37.7346 37.7346

También podría gustarte