Vous êtes sur la page 1sur 12

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

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

3.1 Método de Newton-Raphson 1er orden.

Se utiliza para encontrar una raíz x = xr de una función f(x) tomando un valor inicial xk.

Parámetros:

xr : valor real de la raíz.


xk : valor inicial para la raíz.
xk+1 : valor nuevo para la raíz de la función.
ER: mínimo error relativo requerido.
k: contador de iteraciones.

Algoritmo del método de Newon-Raphson 1er orden:

<1> Se elige un valor inicial xk para k = 0.


<2> Se calcula la derivada de la función: f ´(x).
<3> Se evalúan f (xk) y f ´(xk).
a. Si f(xk) = 0, entonces xk es la solución buscada. Se termina el cálculo: xr = xk.
b. Si f(xk) ≠ 0 se continua con el paso <4>.
<4> Se calcula la aproximación de la raíz: xk+1.


<5> 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 xk+1.
b. Si el error relativo es mayor a ER se incrementa el contador de las iteraciones
(k = k + 1) y se regresa al paso <3> .

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


Taller: Métodos numéricos con MATLAB. SESIÓN # 3.
Ejemplo 3.1.1: Escribe una función de MATLAB que aplique el algoritmo de Newton-Raphson
1er orden 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 xk que contiene el valor 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.

function xr = newtonRaphson1er(f, xk, error)


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Programa que calcula la raíz de una función utilizando el método de
% Newton-Raphson 1er orden.
% USO:
% xr = newtonRaphson1er(f, xk, error)
% donde:
% xr : Resultado de la raíz aproximada de la función.
% f : Función (debe ser simbólica)
% xk : Valor 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.

Paso <2> df = diff(f); %Se calcula la derivada de la función "f".


df = simple(df); %Se simplifica la derivada.
disp('df/dx =') %Mensaje para la pantalla.
pretty(df) %Se despliega la derivada de forma amigable.

%Se inicializan valores:


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

%Encabezado para la tabla de valores:


disp(sprintf('%12s','k','xk','f(xk)','df(xk)','x_k+1','ER'))

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


%alcance el error relativo deseado
Paso <3> f_xk(k) = subs(f,x,xk(k)); %Se evalúa f(xk).
df_xk(k) = subs(df,x,xk(k)); %Se evalúa f’(xk).

if f_xk(k) == 0
break; %Se abortan las iteraciones porque f(xk) = 0.
end

Paso <4> xk(k+1) = xk(k) - f_xk(k)/df_xk(k); %Se obtiene la siguiente aproximación

Paso <5> ER = errRel(xk(k+1),xk(k)); %Se calcula el error relativo.

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


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

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


disp(sprintf('%+12.5f',[k-1,xk(k),f_xk(k),df_xk(k),xk(k+1),ER]))

k = k + 1; %Se incrementa el contador de iteraciones

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

end

Ejemplo 3.1.2: Ejecuta la función newtonRaphson1er( ) de MATLAB que se escribió en


el Ejemplo 3.1.1 para encontrar la raíz de la función que se muestra a continuación:
.
a) 75. Utiliza un valor de xk = 8 y ER ≤ 0.002%.
>> syms x %Se declara la variable simbólica para la función.
>> f = x^2.1 – 75 %Se define la función.

f =

x^(21/10) – 75

>> xr = newtonRaphson1er(f, 8, 0.002) %Se ejecuta el programa con un xk=8.


df/df =

11/10
21 x
---------
10
k xk f(xk) df(xk) x_k+1 ER
+0.00000 +8.00000 +3.79324 +20.68323 +7.81660 +2.34625
+1.00000 +7.81660 +0.04779 +20.16226 +7.81423 +0.03033
+2.00000 +7.81423 +0.00001 +20.15553 +7.81423 +0.00001

xr =

7.8142

3.2 Método de Newton-Raphson 2do orden.

Es muy parecido al método de Newthon-Raphson 1er orden, con la diferencia en el cálculo de la


aproximación xk+1, producto de utilizar una nueva función .

Parámetros:

xr : valor real de la raíz.


xk : valor inicial para la raíz.
xk+1 : valor nuevo 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 12


Taller: Métodos numéricos con MATLAB. SESIÓN # 3.
Algoritmo del método de Newthon-Rapshon 2do orden:

<1> Se elige un valor inicial xk para k = 0.


<2> Se calcula la derivada de la función: f ´(x).
<3> Se evalúan f (xk) y f ´(xk).
a. Si f(xk) = 0, entonces xk es la solución buscada. Se termina el cálculo: xr = xk.
b. Si f(xk) ≠ 0 se continua con el paso <4>.
<4> Se calcula la aproximación de la raíz: xk+1.

′ ′′
<5> 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 xk+1.
b. Si el error relativo es mayor a ER se incrementa el contador de las iteraciones
(k = k + 1) y se regresa al paso <3> .

Ejercicio 3.2.1: Escribe una función de MATLAB que aplique el algoritmo de Newthon-
Raphson 2do orden 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 xk que contiene el valor 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.
Utiliza el siguiente encabezado para la función:

function xr = newtonRaphson2do(f, xk, error)


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Programa que calcula la raíz de una función utilizando el método de
% Newton-Raphson 2do orden.
% USO:
% xr = newtonRaphson2do(f, xk, error)
% donde:
% xr : Resultado de la raíz aproximada de la función.
% f : Función (debe ser simbólica)
% xk : Valor inicial.
% error : Error relativo deseado.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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


Taller: Métodos numéricos con MATLAB. SESIÓN # 3.
NOTA: Se te recomienda que utilices como base el programa newthon-Raphson1er( )
ya que los algoritmos son muy parecidos.

Ejemplo 3.2.2: Ejecuta la función newtonRaphson2do( ) de MATLAB que se escribió en


el Ejercicio 3.2.1 para encontrar la raíz de la función que se muestra a continuación:
.
b) 75. Utiliza un valor de xk = 8 y ER ≤ 0.002%.

La ejecución arroja el siguiente resultado:


>> syms x %Se declara la variable simbólica para la función.
>> f = x^2.1 – 75 %Se define la función.

f =

x^(21/10) – 75

>> xr = newtonRaphson2do(f, 8, 0.002) %Se ejecuta el programa con un xk=8.


df/df =

11/10
21 x
---------
10
d^2f/df^2 =

1/10
231 x
---------
100
k xk f(xk) fx(xk) fxx(xk) x_k+1 ER
+0.00000 +8.00000 +3.79324 +20.68323 +2.84394 +7.81186 +2.40841
+1.00000 +7.81186 -0.04783 +20.14880 +2.83718 +7.81423 +0.03037
+2.00000 +7.81423 -0.00001 +20.15553 +2.83727 +7.81423 +0.00001

xr =

7.8142

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


Taller: Métodos numéricos con MATLAB. SESIÓN # 3.
3.3 Método de Von Mises.

Es una variante del método de Newthon-Raphson 1er orden, en la cual se consideran rectas
paralelas a la tangente original para calcular las aproximaciones.

Parámetros:

xr : valor real de la raíz.


xk : valor inicial para la raíz.
xk+1 : valor nuevo para la raíz de la función.
ER: mínimo error relativo requerido.
k: contador de iteraciones.

El algoritmo del método de Von Mises es prácticamente el mismo que el de Newton-Raphson 1er
grado con la diferencia en el cálculo de la aproximación.

Algoritmo del método de Von Mises:

<1> Se elige un valor inicial xk para k = 0.


<2> Se calcula la derivada de la función f ´(x) y se evalúa f ´(x0).
<3> Se evalúa f (xk).
a. Si f(xk) = 0, entonces xk es la solución buscada. Se termina el cálculo: xr = xk.
b. Si f(xk) ≠ 0 se continua con el paso <4>.
<4> Se calcula la aproximación de la raíz: xk+1.


<5> 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 xk+1.
b. Si el error relativo es mayor a ER se incrementa el contador de las iteraciones
(k = k + 1) y se regresa al paso <3> .

Ejercicio 3.3.1: Escribe una función de MATLAB que aplique el algoritmo de Von Mises para
encontrar una raíz de una 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 xk que contiene el valor 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.
Utiliza el siguiente encabezado para la función:

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


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

function xr = vonMises(f, xk, error)


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Programa que calcula la raíz de una función utilizando el método de
% Von Mises.
% USO:
% xr = vonMises(f, xk, error)
% donde:
% xr : Resultado de la raíz aproximada de la función.
% f : Función (debe ser simbólica)
% xk : Valor inicial.
% error : Error relativo deseado.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

NOTA: Se te recomienda que utilices como base el programa newthon-Raphson1er( )


ya que los algoritmos son muy parecidos.

Ejemplo 3.3.2: Ejecuta la función vonMises( ) de MATLAB que se escribió en el Ejercicio


3.3.1 para encontrar la raíz de la función que se muestra a continuación:
.
a) 75. Utiliza un valor de xk = 8 y ER ≤ 0.002%.
b) . Utiliza un valor de xk = 1 y ER ≤ 0.01%.

La ejecución para el inciso b) arroja el siguiente resultado:


df/df =

- exp(-x) - 1
k xk f(xk) df(x0) x_k+1 ER
+0.00000 +1.00000 -0.63212 -1.36788 +0.53788 +85.91409
+1.00000 +0.53788 +0.04610 -1.36788 +0.57158 +5.89626
+2.00000 +0.57158 -0.00696 -1.36788 +0.56650 +0.89756
+3.00000 +0.56650 +0.00101 -1.36788 +0.56724 +0.12988
+4.00000 +0.56724 -0.00015 -1.36788 +0.56713 +0.01894
+5.00000 +0.56713 +0.00002 -1.36788 +0.56715 +0.00276

xr =

0.5671

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


Taller: Métodos numéricos con MATLAB. SESIÓN # 3.
3.4 Manejo de polinomios en el modo simbólico de MATLAB.

Cuando se trabaja con polinomios de manera simbólica en MATLAB existen diversas funciones
que facilitan su manipulación. Dos de esas funciones son quorem( ) y sym2poly( ).

La función quorem( ) regresa el cociente y residuo al realizar una división de polinomios.

La función sym2poly( ) regresa un vector con los coeficientes de un polinomio ordenados


de mayor a menor potencia.

Ejemplo 3.4.1. Considera los siguientes polinomios:

2 +1

1
! "
+3 +5 3 +7

a) Define los polinomios en MATLAB de manera simbólica en las variables p, q, r y f


respectivamente.
>> syms x %Se define la variable simbólica “x”.
>> p = x^2 - 2*x + 1 %Se define el vector p(x):

p =

x^2 - 2*x + 1

>> q = x^2 – 1 %Se define el vector q(x):

q =

x^2 - 1

>> r = x – 1 %Se define el vector r(x):

r =

x - 1

>> f = -x^8 + 3*x^7 + 5*x^4 - 3*x + 7 %Se define el vector f(x):

f =

- x^8 + 3*x^7 + 5*x^4 - 3*x + 7

b) Calcula el cociente y el residuo al dividir p(x) / r(x).


>> [coc, res] = quorem(p, r) %El cociente se guarda en la variable “coc”
%y el residuo en la variable “res”.
coc =

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


Taller: Métodos numéricos con MATLAB. SESIÓN # 3.
x - 1

res =

c) Calcula el cociente y el residuo al dividir q(x) / r(x).


>> [coc, res] = quorem(q, r) %El cociente se guarda en la variable “coc”
%y el residuo en la variable “res”.
coc =

x + 1

res =

d) Calcula el cociente y el residuo al dividir f(x) / r(x).


>> [coc, res] = quorem(f, r) %El cociente se guarda en la variable “coc”
%y el residuo en la variable “res”.
coc =

- x^7 + 2*x^6 + 2*x^5 + 2*x^4 + 7*x^3 + 7*x^2 + 7*x + 4

res =

11

e) Encuentra los coeficientes y el grado del polinomio p(x).


>> A = sym2poly(p) %Se obtiene el vector con los coeficientes y se almacena en
%en la variable “A”.
A =

1 -2 1

>> n = length(A) – 1 %Se calcula el grado del polinomio contando el número de


%coeficientes obtenidos en el paso anterior y restándole
%uno.
n =

f) Encuentra los coeficientes y el valor del término constante del polinomio f(x).
>> A = sym2poly(f) %Se obtiene el vector con los coeficientes y se almacena en
%en la variable “A”.
A =

-1 3 0 0 5 0 0 -3 7

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


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

>> a0 = A( length(A) ) %La constante es el último elemento del vector.

a0 =

3.5 Método de Birge Vieta.

Se aplica para encontrar todas las raíces de polinomios de la forma:


$ $ $
# +# +# + ⋯ + #$ + #$

Se utiliza una combinación del método de Newton-Raphson 1er orden para encontrar cada raíz y
después se simplifica el polinomio por medio de división sintética, de tal manera que se elimine
la raíz ya encontrada.

Parámetros:

n : grado del polinomio.


xr(n) : n-ésima raíz de la función.
x0 : valor inicial para la raíz.
ER: mínimo error relativo requerido.
k: contador de iteraciones.

Algoritmo del Birge Vieta:

<1> Se determina el grado n del polinomio y se establece el contador para las iteraciones
requeridas desde k = 1, 2, ... , (n - 1). El total de raíces buscadas es n.
<2> Se calcula el valor de x0 inicial para la aplicación del método de Newton-Raphson 1er
orden:
#$
#$
<3> Se aplica el método de Newton-Raphson 1er orden para el x0 calculado en el paso <2>
y el valor del error relativo deseado ER, obteniéndose xr(k).
<4> Se obtiene una nueva función f(x) dividiendo a la función original entre el factor que
involucra a la raíz encontrada en el paso <3>:

&
<5> Se revisa el valor del contador de las iteraciones k:
a. Si k ≤ n – 1 se incrementa el contador de las iteraciones y se regresa al paso <2>.
b. Si k > n – 1, la última raíz xr(n) se obtiene del término constante de la última
simplificación de la función f(x).

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


Taller: Métodos numéricos con MATLAB. SESIÓN # 3.
Ejemplo 3.5.1: Escribe una función de MATLAB que aplique el algoritmo de Birge Vieta para
encontrar todas las raíces de la función f(x) = 0.

La función debe entregar los resultados en un vector con 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 error que contiene el valor del error relativo requerido para el
cálculo.
Nombra “birgeVieta.m” al archivo del programa.
function xr = birgeVieta(f, error)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Programa que calcula las raíces de una función polinomial de la forma:
% f(x) = a_0 x^n + a_1 x^(n-1) + ... + a_(n-1) x + a_n
% USO:
% xr = birgeVieta(f, error)
% donde:
% xr : Vector con los resultados de las raíces calculadas de la función.
% f : Función (debe ser simbólica)
% 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.

A = sym2poly(f) %Se obtienen los coeficientes de los polinomios.


Paso <1> n = length(A) - 1 %Se determina el grado del polinomio.

for k = 1 : (n-1) %Este ciclo se repite una iteración menos que el grado del
%polinomio.
A = sym2poly(f); %Se obtienen los coeficientes del polinomio.
Paso <2>
xk = - A(length(A))/A(length(A) - 1); %Se calcula el valor de x0 para
Paso <3>
%utilizar Newton-Raphson.
xr(k) = newtonRaphson1er(f, xk, error); %Se calcula la raíz.
Paso <4>
[f, rem] = quorem(f, x - xr(k)); %Se simplifica la función dividiendo el
%polinomio entre la raíz encontrada.
end

A = sym2poly(f); %Se obtienen los coeficientes de la última simplificación.


Paso <5>b xr(n) = -A(2); %Se obtiene el valor de la última raíz.

end

Enrique René Bastidas Puga. Página 11 de 12


Taller: Métodos numéricos con MATLAB. SESIÓN # 3.
Ejercicio 3.5.1: Ejecuta la función birgeVieta( ) de MATLAB que se escribió en el
Ejemplo 3.5.1 para encontrar todas las la raíces de las funciones que se muestran a continuación:
" '
a) + 19 + 11 + 30. Para un ER ≤ 0.001%.
* "
b) + 66 ' + 224 160 . Para un ER ≤ 0.001%.
* " '
c) 9 20 + 204 + 208 384. Para un ER ≤ 0.001%.

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 12 de 12

Vous aimerez peut-être aussi