Está en la página 1de 10

Taller: Métodos numéricos con MATLAB. SESIÓN # 2.

SESIÓN # 2: Solución numérica de ecuaciones de una variable (métodos cerrados).

La solución de ecuaciones de la forma f(x) = 0 implica encontrar el/los valor(es) de la variable


independiente que hacen que la ecuación se cumpla.

Los algoritmos para la solución numérica de ecuaciones de una variable se pueden clasificar en
dos grandes grupos:

1. Métodos cerrados: son aquellos que necesitan dos valores iniciales de la variable
independiente entre los cuales se encuentra la raíz. Los siguientes son ejemplos de métodos
cerrados:
a. Método de bisecciones.
b. Método de interpolación lineal (regla falsa).
2. Métodos abiertos: requieren uno o dos valores iniciales de la variable independiente, pero no
necesariamente que la raíz se encuentre entre ellos. Ejemplos de métodos abiertos:
a. Métodos de Newton-Raphson (1er y 2do orden).
b. Método de Von Mises.
c. Método de Virge Vieta.

2.1 Operaciones simbólicas y gráficas.

Todos los cálculos que hemos realizado en MATLAB hasta el momento han sido numéricos
porque si bien es cierto se han utilizado variables, estas siempre han tenido valores numéricos
asignados.

MATLAB también presenta la opción de realizar cálculos simbólicos. Para ello primero se deben
definir las variables que se han de utilizar como simbólicas utilizando el comando syms.

>> syms x %La variable “x” se define como simbólica.

A continuación se presentan una serie de funciones que están relacionadas con manipulaciones
simbólicas en MATLAB:
diff( ) int( ) pretty( ) simple( ) subs( ) ezplot( )

Ejemplo 2.1.1. Define la función f(x) que se muestra a continuación en MATLAB y realiza lo
solicitado en los incisos.

a) Calcula f ’(x).
b) Integra f(x).
c) Evalúa f(x) para los valores x = -3, -2, … , 2, 3.
d) Grafica f(x) para -3 < x < 3.

Enrique René Bastidas Puga. Página 1 de 10


Taller: Métodos numéricos con MATLAB. SESIÓN # 2.
>> syms x %Se define la variable “x” como simbólica.
>> f = x^2 %Se define la función f(x) en la variable “f”.

f =

x^2

>> df = diff(f,x) %Se calcula f’(x) y se almacena en la variable “df”.

df =

2*x

>> pretty(df) %Se despliega la variable simbólica “df” de forma amigable.

2 x
>> F = int(f,x) %Se integra la función f(x) y se almacena en la variable “F”.

F =

x^3/3

>> pretty(F) %Se despliega la variable simbólica “F” de forma amigable.

3
x
--
3
>> X = [-3:3] %Se define el vector con los valores de “x” para evaluar en “f”.

X =

-3 -2 -1 0 1 2 3

>> Y = subs(f,x,X) %Se sustituyen los valores de “X” en la variable “x” de la


%función “f”

Y =

9 4 1 0 1 4 9

>> ezplot(f,[-3,3]) %Se grafica la función “f” de -3 a 3.


>> grid on %Se activa la cuadrícula.

Enrique René Bastidas Puga. Página 2 de 10


Taller: Métodos numéricos con MATLAB. SESIÓN # 2.
2.2 Método de bisecciones.

Se utiliza para encontrar una raíz x = xr de una función f(x) cuando se encuentra entre el
intervalo xi < xr < xs.

Parámetros:

xi : valor inferior para la variable independiente.


xs : valor superior para la variable independiente.
xr : valor calculado para la raíz de la función.
ER: mínimo error relativo requerido.
k: contador de iteraciones.

Enrique René Bastidas Puga. Página 3 de 10


Taller: Métodos numéricos con MATLAB. SESIÓN # 2.
Algoritmo del método de bisecciones:

<1> Se eligen los valores iniciales xi y xs, de tal forma que la función cambie de signo en el
intervalo, lo cual se verifica comprobando que 0, de lo contrario se
seleccionan nuevos valores.
<2> Se calcula la aproximación de la raíz:
=
2
<3> Se realizan las siguientes evaluaciones:
a. Si f(xr) = 0, entonces xr es la solución buscada. Se termina el cálculo.
b. Si f(xi) f(xr) < 0, entonces la raíz se encuentra en el sub-intervalo izquierdo. Se
cambia el valor superior: xs = xr.
c. Si f(xi) f(xr) > 0, entonces la raíz se encuentra en el sub-intervalo derecho. Se
cambia el valor inferior: xi = xr.
<4> A partir de la segunda iteración (k ≥ 2) se calcula el error relativo:
a. Si el error relativo calculado es menor o igual a ER se termina el cálculo. El
resultado de la raíz es xr.
b. Si el error relativo es mayor a ER se regresa al paso <2>.

Ejemplo 2.2.1: Escribe una función de MATLAB que aplique el algoritmo de bisecciones para
encontrar una raíz de la función f(x) = 0. La función debe entregar el resultado en la variable xr.

La función debe recibir como parámetros de entrada:


La variable f que contiene a la función simbólica que se quiere resolver.
La variable xi que contiene el valor inferior inicial de x.
La variable xs que contiene el valor superior inicial de x.
La variable error que contiene el valor del error relativo requerido para el
cálculo.
Desplegar en pantalla los valores calculados en cada iteración a manera de tabla.
Graficar la función f(x) en el intervalo inicial para efectos de comparación con el
resultado obtenido para la raíz de la función por el programa.

Enrique René Bastidas Puga. Página 4 de 10


Taller: Métodos numéricos con MATLAB. SESIÓN # 2.
function xr = bisecciones(f, xi, xs, error)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Programa que calcula la raíz de una función utilizando el método de
% bisecciones.
% USO:
% xr = bisecciones(f, xi, xs, error)
% donde:
% xr : Resultado de la raíz aproximada de la función.
% f : Función (debe ser simbólica).
% xi : Valor inferior inicial.
% xs : Valor superior inicial.
% error : Error relativo deseado.
%
%Escrito por: René Bastidas.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
close all; %Se cierran todas las ventanas.
clc; %Se limpia la pantalla.
syms x %Se declara la variable "x" como simbólica.

f_xi(1) = subs(f, x, xi); %Se evalúa por primera vez la función para xi.
f_xs(1) = subs(f, x, xs); %Se evalúa la función para xs.

Paso <1> if (f_xi(1)*f_xs(1) > 0)


disp('Valores iniciales no válidos!!!')
xr = [];
return %Instrucción para terminar el programa debido a que los valores
%iniciales de "x" no son adecuados.
end

ezplot(f,[xi,xs])%Gráfica de la función para efectos de comparación.


grid on %Se activa la cuadrícula para la gráfica.

%Se inicializan valores:


ER = 100; %Error relativo "dummy".
k = 0; %Variable para el conteo de las iteraciones.

%Encabezado para la tabla de valores:


disp(sprintf('%12s','k','xi','xs','xr','f(xi)','f(xr)','f(xi)f(xr)','ER'))

while (ER >= error) %Este ciclo se ejecuta indefinidamente mientras no se


%alcance el error relativo deseado.
k = k + 1; %Se incrementa el contador de iteraciones.
Paso <2> xr(k) = (xi + xs) / 2; %Se obtiene la aproximación de la raíz: xr.
f_xi(k) = subs(f,x,xi); %Se evalúa la función para xi.
f_xr(k) = subs(f,x,xr(k)); %Se evalúa la función para xr.

Paso <3> if f_xr(k) == 0


break; %Se abortan las iteraciones porque f(xr) = 0.
elseif ((f_xi(k) * f_xr(k)) < 0)
xs = xr(k); %Porque la raíz se encuentra en el sub-intervalo izquierdo.
elseif ((f_xi(k) * f_xr(k)) > 0)
xi = xr(k); %Porque la raíz se encuentra en el sub-intervalo derecho.
end

Paso <4> if (k >= 2)


ER = errRel(xr(k),xr(k-1)); %Se calcula el error relativo partir de
%la segunda iteración.
end

Enrique René Bastidas Puga. Página 5 de 10


Taller: Métodos numéricos con MATLAB. SESIÓN # 2.

%Se despliegan los valores de la tabla de la iteración actual:


disp(sprintf('%+12.5f',[k,xi,xs,xr(k),f_xi(k),f_xr(k),sign(f_xi(k)*f_xr(k)),ER]))

end

xr = xr(k); %Se asigna sólo el valor final al parámetro de salida.

Ejemplo 2.2.2: Ejecuta la función bisecciones( ) de MATLAB que se escribió en el


Ejemplo 2.1.1 para encontrar las raíces de la función o ecuación que se muestra a continuación:
.
a) = . Utilizar xi = 1 y xs = 10 para un ER ≤ 0.005%.
b) = . − 75. Graficar la función para elegir los valores apropiados de xi y xs. Utiliza
un ER ≤ 0.002%.

Ejecución para el inciso a):


>> syms x %Se declara la variable simbólica para la función.
>> f = (1 - 0.3*x)/x %Se define la función.

f =

-((3*x)/10 - 1)/x

>> xr = bisecciones(f, 1, 10, 0.005) %Se ejecuta el programa bisecciones( )


k xi xs xr f(xi) f(xr) f(xi)f(xr) ER
+1.00000 +1.00000 +5.50000 +5.50000 +0.70000 -0.11818 -1.00000 +100.00000
+2.00000 +3.25000 +5.50000 +3.25000 +0.70000 +0.00769 +1.00000 +69.23077
+3.00000 +3.25000 +4.37500 +4.37500 +0.00769 -0.07143 -1.00000 +25.71429
+4.00000 +3.25000 +3.81250 +3.81250 +0.00769 -0.03770 -1.00000 +14.75410
+5.00000 +3.25000 +3.53125 +3.53125 +0.00769 -0.01681 -1.00000 +7.96460
+6.00000 +3.25000 +3.39063 +3.39063 +0.00769 -0.00507 -1.00000 +4.14747
+7.00000 +3.32031 +3.39063 +3.32031 +0.00769 +0.00118 +1.00000 +2.11765
+8.00000 +3.32031 +3.35547 +3.35547 +0.00118 -0.00198 -1.00000 +1.04773
+9.00000 +3.32031 +3.33789 +3.33789 +0.00118 -0.00041 -1.00000 +0.52662
+10.00000 +3.32910 +3.33789 +3.32910 +0.00118 +0.00038 +1.00000 +0.26401
+11.00000 +3.32910 +3.33350 +3.33350 +0.00038 -0.00001 -1.00000 +0.13183
+12.00000 +3.33130 +3.33350 +3.33130 +0.00038 +0.00018 +1.00000 +0.06596
+13.00000 +3.33240 +3.33350 +3.33240 +0.00018 +0.00008 +1.00000 +0.03297
+14.00000 +3.33295 +3.33350 +3.33295 +0.00008 +0.00003 +1.00000 +0.01648
+15.00000 +3.33322 +3.33350 +3.33322 +0.00003 +0.00001 +1.00000 +0.00824
+16.00000 +3.33322 +3.33336 +3.33336 +0.00001 -0.00000 -1.00000 +0.00412

xr =

3.3334

Enrique René Bastidas Puga. Página 6 de 10


Taller: Métodos numéricos con MATLAB. SESIÓN # 2.
Ejecución para el inciso b):
>> f = x^2.1 – 75 %Se define la función.

f =

x^(21/10) - 75

>> ezplot(f, [-10, 10]) %Se grafica la función para seleccionar los
%valores iniciales para “xi” y “xs”.

>> xr = bisecciones(f, 7, 8, 0.002) %Se ejecuta el programa bisecciones( )


%para “xi=7” y “xs=8” de acuerdo a la
%figura anterior.
k xi xs xr f(xi) f(xr) f(xi)f(xr) ER
+1.00000 +7.50000 +8.00000 +7.50000 -15.47411 -6.19363 +1.00000 +100.00000
+2.00000 +7.75000 +8.00000 +7.75000 -6.19363 -1.28878 +1.00000 +3.22581
+3.00000 +7.75000 +7.87500 +7.87500 -1.28878 +1.23005 -1.00000 +1.58730
+4.00000 +7.81250 +7.87500 +7.81250 -1.28878 -0.03491 +1.00000 +0.80000
+5.00000 +7.81250 +7.84375 +7.84375 -0.03491 +0.59618 -1.00000 +0.39841
+6.00000 +7.81250 +7.82813 +7.82813 -0.03491 +0.28029 -1.00000 +0.19960
+7.00000 +7.81250 +7.82031 +7.82031 -0.03491 +0.12260 -1.00000 +0.09990
+8.00000 +7.81250 +7.81641 +7.81641 -0.03491 +0.04382 -1.00000 +0.04998
+9.00000 +7.81250 +7.81445 +7.81445 -0.03491 +0.00445 -1.00000 +0.02499
+10.00000 +7.81348 +7.81445 +7.81348 -0.03491 -0.01523 +1.00000 +0.01250
+11.00000 +7.81396 +7.81445 +7.81396 -0.01523 -0.00539 +1.00000 +0.00625
+12.00000 +7.81421 +7.81445 +7.81421 -0.00539 -0.00047 +1.00000 +0.00312
+13.00000 +7.81421 +7.81433 +7.81433 -0.00047 +0.00199 -1.00000 +0.00156

xr =

7.8143

Enrique René Bastidas Puga. Página 7 de 10


Taller: Métodos numéricos con MATLAB. SESIÓN # 2.
2.3 Método de interpolación lineal.

El método de bisecciones si bien es


cierto es válido para determinar las
raíces de una función, puede no ser
el más eficiente si la raíz se
encuentra más cercana a uno de los
valores iniciales del intervalo
seleccionado.

El método de interpolación lineal o


la regla falsa traza una recta entre
f(xi) y f(xs) y considera al punto
donde la recta intersecta al eje
horizontal como la aproximación
de la raíz xr.

El algoritmo del método de interpolación lineal es prácticamente idéntico al de bisecciones, con


la diferencia del cálculo de xr.

Algoritmo del método de interpolación lineal (regla falsa):

<1> Se eligen los valores iniciales xi y xs, de tal forma que la función cambie de signo en el
intervalo, lo cual se verifica comprobando que 0, de lo contrario se
seleccionan nuevos valores.
<2> Se calcula la aproximación de la raíz:

=

<3> Se realizan las siguientes evaluaciones:
a. Si f(xr) = 0, entonces xr es la solución buscada. Se termina el cálculo.
b. Si f(xi) f(xr) < 0, entonces la raíz se encuentra en el sub-intervalo izquierdo. Se
cambia el valor superior: xs = xr.
c. Si f(xi) f(xr) > 0, entonces la raíz se encuentra en el sub-intervalo derecho. Se
cambia el valor inferior: xi = xr.
<4> A partir de la segunda iteración (k ≥ 2) se calcula el error relativo:
a. Si el error relativo calculado es menor o igual a ER se termina el cálculo. El
resultado de la raíz es xr.
b. Si el error relativo es mayor a ER se regresa al paso <2>.

Enrique René Bastidas Puga. Página 8 de 10


Taller: Métodos numéricos con MATLAB. SESIÓN # 2.
Ejercicio 2.3.1: Escribe una función de MATLAB que aplique el algoritmo de interpolación
lineal para encontrar una raíz de la función f(x) = 0.

La función debe entregar el resultado en la variable xr.


La función debe recibir como parámetros de entrada:
La variable f que contiene a la función simbólica que se quiere resolver.
La variable xi que contiene el valor inferior inicial de x.
La variable xs que contiene el valor superior inicial de x.
La variable error que contiene el valor del error relativo requerido para el
cálculo.
Desplegar en pantalla los valores calculados en cada iteración a manera de tabla.
Graficar la función f(x) en el intervalo inicial para efectos de comparación con el
resultado obtenido para la raíz de la función por el programa.
Utiliza el siguiente encabezado para la función:
function xr = interpLineal(f, xi, xs, error)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Programa que calcula la raíz de una función utilizando el método de
% bisecciones.
% USO:
% xr = interpLineal(f, xi, xs, error)
% donde:
% xr : Resultado de la raíz aproximada de la función.
% f : Función (debe ser simbólica)
% xi : Valor inferior inicial.
% xs : Valor superior inicial.
% error : Error relativo deseado.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

NOTA: Se te recomienda que utilices como base el programa bisecciones( ) ya que los
algoritmos son muy parecidos.

Ejercicio 2.3.2: Ejecuta la función interpLineal( ) de MATLAB que escribiste en el


Ejercicio 2.3.1 para encontrar la raíz de la siguiente función. Para esta función compara la
cantidad de iteraciones requeridas por el algoritmo de interpolación lineal contra el de
bisecciones que se utilizó en el Ejemplo 2.2.2 inciso b).

a) = . − 75. Graficar la función para elegir los valores apropiados de xi y xs. Utiliza
un ER ≤ 0.002%.

Enrique René Bastidas Puga. Página 9 de 10


Taller: Métodos numéricos con MATLAB. SESIÓN # 2.
A continuación se muestra la ejecución de un programa que implementa el método de
interpolación lineal para el Ejercicio 2.3.2 de tal manera que sirva de referencia. Es de resaltar
que en este caso se necesitaron 3 iteraciones para encontrar el resultado en contraste con las 13
requeridas por el método de bisecciones para esta misma ecuaciones tal y como se mostró en el
Ejemplo 2.2.2 b).
>> syms x
>> f = x^2.1 - 75

f =

x^(21/10) - 75

>> xr = interpLineal(f, 7, 8, 0.002)

k xi xs xr f(xi) f(xr) f(xi)f(xr) ER


+1.00000 +7.80313 +8.00000 +7.80313 -15.47411 -0.22368 +1.00000 +100.00000
+2.00000 +7.81409 +8.00000 +7.81409 -0.22368 -0.00289 +1.00000 +0.14030
+3.00000 +7.81423 +8.00000 +7.81423 -0.00289 -0.00004 +1.00000 +0.00181

xr =

7.8142

Referencias.

[1] Documentación de ayuda de MATLAB.


[2] Chapra, Steven C.; Canale, Raymond P. “Métodos numéricos para ingenieros”. 2011. 6ta
edición. McGraw-Hill.

Enrique René Bastidas Puga. Página 10 de 10