Sei sulla pagina 1di 13

Mtodo de la Secante en

Matlab (cdigo).
6 ENERO, 2014 / JULIO CSAR
[Recuerda que en este Blog los enlaces para la descarga del cdigo se encuentran
al final del artculo.]
Continuamos con los mtodos utilizados para hallar races de ecuaciones y hoy es
el turno del conocido mtodo de la secante, cmo vimos anteriormente
el Mtodo de Newton-Raphson es uno (sino el) mtodo mas usado para hallar
las races de una funcin real bien definida, pero uno de los potenciales
inconvenientes de implementar este algoritmo es el echo de tener que evaluar la
derivada de la funcin, esto naturalmente no representa un problema si hablamos
de polinomios y otras funciones simples, pero en algunos casos nos encontramos
con ciertas funciones que no son tan elementales y la funcin es complicada y
difcil de evaluar y claramente de derivar, para evitar un poco el costo
computacional de hallar dichas derivadas, estas pueden ser aproximadas
mediante diferencias finitas.
(recuerden que el cdigo se encuentra al final para su descarga)
Como en publicaciones anteriores, intentar explicar e ilustrar el mtodo
fcilmente, entonces la pregunta es en que consiste el mtodo de la
secante? muy bien, este mtodo por lo regular es enseado despus del mtodo
de Newton-Raphson por lo que podemos partir del echo de que tambin se
intenta llegar a la raz mediante una recta que en el caso de Newton es tangente a
la curva en el punto [Xn,F(Xn)] pero cmo el nombre lo dice este mtodo se basa
en una aproximacin a esa tangente que se obtena con la derivada y que ahora
ser una secante a la curva definida por la funcin, no se preocupen, lo veremos
en la siguiente figura.

Primera iteracin del mtodo de la secante.
El mtodo necesita de dos valores iniciales, Xo y X1 para el ejemplo de la
imagen, entonces se traza una recta para [X0,F(Xo)] y [X1, F(X1)] , cuando se
tiene esta recta entonces la abscisa Xn+1 viene dada por el lugar donde la recta
corta al eje X, en el ejemplo de la figura, como vemos, la abscisa Xn+1 ser X2 y
es claro que X2 es el lugar donde la recta cort el eje X, luego el proceso se
repite y la siguiente recta que se traza ser entre el punto [X1,F(X1)] y [X2,
F(X2)] y Xn+1 ser el lugar donde esta nueva recta corte al eje.
Hablando matemticamente tenemos la aproximacin de la derivada F'(X) para la
figura mediante diferencias finitas como:

Con la frmula de Newton-Raphson:

entonces reemplazando en ella la aproximacin de diferencias finitas llegamos a:

si se siente perdido con la formula anterior entonces la puede relacionar con el
ejemplo que hemos tratado donde las variables son entonces X0 X1 y X2, as:

el resto del mtodo depende ya de elegir una nivel de precisin aceptable y de
realizar algn tipo de visualizacin para que el usuario pueda determinar los
valores iniciales X0 y X1.
CDIGO EN MATLAB.
Luego de haber visto algo de teora y comprender cmo funciona el mtodo no
queda mas que implementarlo en Matlab (a eso vinimos no?) entonces
inicialmente declaramos a X como variable simblica (syms) y en segundo
lugar cmo siempre me gusta (al igual que en los dems mtodos donde se
necesita de un valor inicial), realizar una visualizacin del comportamiento de la
funcin para que de esta forma se pueda hacer una eleccin adecuada de los
valores, recordemos que la convergencia de estos mtodos se ve bastante
afectada por la eleccin de esos valores, entonces:

A continuacin, luego de que el usuario ha ingresado la funcin y despus de ver
el comportamiento de la curva que esta define, procedemos a pedir los valores
para Xo y X1:

Sabiendo que el usuario ya ha establecido los valores iniciales necesarios,
entonces definimos los valores iniciales de la constante de tolerancia y el error,
estos son valores arbitrarios, es decir para que al menos se cumpla el primer ciclo
while, el valor de la tolerancia o precisin puede ser definido por nosotros o el
usuario, y debe ser un valor bastante bueno, aunque depende de nuestra
aplicacin.

Finalmente dentro del bucle while aplicamos la formula de la secante para
calcular el Xn+1, posteriormente, con este nuevo valor calculamos el error de la
aproximacin y para terminar reasignamos los valores de las variables y listo, el
valor retornado debera ser el valor aproximado de la raz si la hay.
EJEMPLO.
Ahora estara bien, al igual que en los artculos anteriores, comprobar el
comportamiento del cdigo que desarrollamos, y para eso proponemos hallar la
raz de la funcin:

Esta funcin ya la hemos tratado en mtodos anteriores y sabemos que su raz se
encuentra en X=0.56714329, entonces sin mas prembulo, lo que hacemos a
continuacin es llamar la funcin Secante en la command window,
asegurndonos de tener el directorio con la direccin correcta donde se encuentra
el archivo, as:

Inmediatamente despus de ingresar la funcin, el programa nos pedir un par de
limites, superior e inferior respectivamente, aunque este paso no pertenece al
mtodo me parece una buena prctica cuando de estimaciones se trata, pero de
igual forma ustedes pueden modificar esa parte el cdigo.

Para este ejemplo escogimos los limites convenientemente como 0 y 2, as
podemos apreciar bien el lugar de corte de la funcin con el eje X (raz),
resultado la siguiente grfica:

A continuacin el programa nos pedir ahora que ingresemos las dos
estimaciones, para Xo y X1, en nuestro caso, luego de observar la grfica
anterior, los valores sern 0 y 1 respectivamente, luego de ingresar este par de
valores y dar ENTER el programa nos arrojar el valor de la raz que muestra la
imagen.

cmo les haba comentado anteriormente el nmero de decimales que muestra
Matlab puede ser modificado, en mi caso he puesto que muestre bastantes para
hacer mayor claridad sobre la precisin, cmo era de esperar el valor que nos
entreg el programa es el valor de la raz con una buena precisin, para confirmar
si evaluamos este valor en la funcin obtenemos:

Un 1 con 13 ceros a la izquierda, para mi un muy buen aproximado, de esta
forma terminamos lo referente a la implementacin y explicacin de este
importante mtodo, como siempre el cdigo de esta prctica lo pueden encontrar
en este enlace para su descarga y espero que este articulo les sea de ayuda.
Recuerden que tomarse el tiempo para comentar, es una forma de agradecer el
tiempo del autor para realizar este documento.
Prctica 9. Resolucin de ecuaciones
Muchos problemas de las ciencias requieren hallar una solucin de una ecuacin, o
equivalentemente, una raz de una funcin. Por ejemplo, para hallar el volumen en la
ecuacin de Van der Waals, hay que hallar una raz de un polinomio de tercer grado.
As pues, dada una funcin f, nos plantearemos encontrar valores x que hagan f(x)=0. En
esta prctica veremos mtodos para hallar con Matlab las races de una funcin. En
concreto trataremos los mtodos de biseccin, regula-falsi, secante, Newton-Raphson y los
mtodos de iteracin funcional.
Contents
Biseccin
Regula-Falsi
Mtodo de la secante
El comando fprintf
Mtodo de Newton-Raphson
Derivacin simblica
En la prctica 7 vimos dos maneras de definir una funcin, como una funcin
annima o mediante un archivo .m y tambin vimos maneras de representar el eje
OX.
Ej 1. Defina en un archivo g.m la funcin g(x)=exp(x)-5x. a) Dibuje la grfica de
g en el intervalo [0,2] junto con el eje OX. b) Represente de nuevo la funcin en
un intervalo ms pequeo, de longitud 0.5 que contenga una raiz de g.
Ej 2. Defina de forma annima las funciones h1(x)=e^(2x) y h2(x)=2-x^2. a)
Represente conjuntamente ambas grficas en el intervalo [-2,1]. b) Represente la
funcin h1(x)-h2(x) en el intervalo [-2,1]. Observe que las races de h1(x)-h2(x)
son los puntos en los que h1(x)=h2(x), esto es, donde se cortan las grficas de h1
y h2.
Biseccin
Recordamos el pseudocdigo que permite implementar el mtodo de biseccin
1. Entrar f , a, b, tol
2. Mientras b-a>=tol
3. Hacer c = a + (1/2)(b-a)
4. Si f (c) = 0 entonces c es raz. Fin
5. Si sgn f (a) ~= sgn f (c) entonces b = c.
6. Si sgn f (a) = sgn f (c) entonces a = c.
7. Ir a 2
Siguiendo estos pasos se ha implementado el mtodo en el archivo biseccion.m
type biseccion.m
% Mtodo de biseccin para una funcin f definida.
a=0.6;
b=0.7;
tol=0.0001;
while b-a>=tol
% disp([a b]);
c=a+(b-a)/2;
if f(c)==0
break
end
if sign(f(a))~=sign(f(c))
b=c;
else
a=c;
end
end
% disp(c)
En la implementacin se ha empleado la instruccin break que interrupe el bucle
en que se encuentre, poniendo fin al mismo.
El cdigo escrito tiene algunas limitaciones. Observe que para cambiar los
valores iniciales de a y b debe editar el cdigo, y que la funcin debe llamarse f.
Ej 3. Halle aproximaciones a las dos races de la ecuacin sin(x)-
exp(x^2)+9/10=0. (Sol. aprox. x=0.1132, x=0.6317)
Ej 4. El cdigo del programa contiene dos comentarios que evitan que se muestre
el progreso del mtodo y el resultado final. Quite los smbolos de comentario.
Regula-Falsi
El mtodo de regula-falsi es similar al mtodo de biseccin, pero los intervalos
no se dividen por la mitad. En este mtodo para cada intervalo, se halla la recta
que pasa por los puntos de la grfica en los extremos del intervalo. El punto que
divide los intervalos es el corte de la recta hallada con el eje OX.
Recordamos el pseudocdigo del mtodo de regula-falsi
1. Entrar f , a, b, tol
2. Mientras b-a>=tol
3. Hacer c = (a*f(b)-b*f(a)) / (f(b)-f(a))
4. Si f (c) = 0 entonces c es raz. Fin
5. Si sgn f (a) ~= sgn f (c) entonces b = c.
6. Si sgn f (a) = sgn f (c) entonces a = c.
7. Ir a 2
Ej 5. Modifique el archivo biseccion.m para implementar el mtodo de regula-
falsi en un programa llamado regula.m.
Ej 6. En el cdigo del mtodo de regula - falsi, incluya comentarios que
expliquen cada uno de los pasos del mtodo.
Ej 7. Emplee el mtodo de regula - falsi en el intervalo [3,4] para encontrar una
aproximacin a una raz de f(x)=cos(x/2). (Sol. aprox. x=3.1416)
Ej 8. Puede emplearse alguno de los mtodos vistos hasta ahora para encontrar
una raz de f(x)=exp(x)-5*x en el intervalo [1,2]?
Ej 9. Modifique alguno de los mtodos para que el criterio de salida del bucle sea
abs(f(c))<tol. (Indicacin: defina una variable fin con el valor cero. El bucle
debe ejecutarse mientrasfin sea cero. Dentro del bucle la variable fin tomar el
valor 1 cuando abs(f(c))<tol.)
(Siguiendo esta tcnica, pueden implementarse distintos criterios para salir del
bucle, e incluso varios criterios en un mismo programa.)
Mtodo de la secante
El mtodo de la secante busca aproximaciones a una raz de una funcin de
forma iterativa. Dadas dos iteraciones, se halla la recta que pasa por esos dos
valores de la funcin. La siguiente iteracin es el corte con el eje OX de la recta.
Recordamos el pseudocdigo que permite implementar el mtodo de la secante:
1. Entrar f , a, b, tol
2. Mientras |b - a| >= tol
3. Hacer c =(a f(b) - b f(a))/(f(b) - f(a))
4. Si f (c) = 0 entonces c es raz. Fin
5. Hacer a = b y b = c.
6. Ir a 2
% Implementacin del mtodo de la secante para una funcin f definida.
a=1;
b=2.618;
tol=0.0001;
while abs(b-a)>=tol
c=(a*f(b) - b*f(a))/(f(b) - f(a));
% fprintf('a= %d, b=%d, c=%d, f(c)=%d\n',a,b,c,f(c))
if f(c)==0
disp('Encontrada raz.')
break
end
a=b;
b=c;
end
Podemos observar la salida del algoritmo mostrando c y f(c).
c
f(c)
c =

2.5426


ans =

-2.1907e-006

Ej 10. Dibuje la funcin f(x)=x-5*log(x) en el intervalo [0,2]. Encuentre una raz
de f mediante el mtodo de la secante, determinando antes unos valores
apropiados para a y b que definan un intervalo de longitud 0.2. (Sol. Por ejemplo
con a=1.2, b=1.4 se llega a la aproximacin 1.295856)
Ej 11. Aplique el mtodo de la secante para a=1, b=4 y f(x)=(x-2).*(x-7).*(x-2)
(Sol. aprox. 1.999989, solucin exacta x=2).
Ej 12. Puede aplicarse el mtodo de la secante para a=1, b=3 y f=(x-2).^2 ?
Ej 13. Aplique el mtodo de la secante para a=1, b=(3+sqrt(5))/2 y f(x)=-4*x^3+
3*(3+sqrt(5))*x^2-3*(1+sqrt(5))*x-3-sqrt(5). (Sol. aprox x=1.309017)
El comando fprintf
Para mostrar en pantalla resultados con texto y valores numricos podemos usar
el comando fprintf.
fprintf('La raz cuadrada de dos vale %d aproximadamente.\n',sqrt(2))
La raz cuadrada de dos vale 1.414214e+000 aproximadamente.
Vemos que en el ejemplo hemos puesto una cadena de caracteres que indica el
formato en el que vamos a presentar el resultado, y despus de la coma el valor
que vamos a mostrar.
Al mostrar el resultado, donde pone %d se sustituye el valor de sqrt(2) en
formato decimal.
En el siguiente ejemplo se observa como al no poner \n el siguiente fprintf
muestra la salida a continuacin de la anterior. Para pasar a la siguiente lnea
empleamos \n. Tambin vemos que al poner %f se sustituye el correspondiente
valor en formato de punto fijo.
fprintf('Mostramos tres nmeros.')
fprintf('Uno es %d mientras que otro es %f y el tercero es
%f',sqrt(2),sqrt(3),sqrt(4))
fprintf('Sin hacer cambio de linea')
Mostramos tres nmeros.Uno es 1.414214e+000 mientras que otro es 1.732051
y el tercero es 2.000000Sin hacer cambio de linea
Ej 14. En el cdigo de la secante, elimine el smbolo de comentario antes de
fprintf para poder ver el proceso del mtodo. Modifique el mtodo de la secante
para que se vayan contando las iteraciones efectuadas y se muestren en la
instruccin fprintf.
Mtodo de Newton-Raphson
Recordamos el pseudocdigo del mtodo
1. Entrar f , x0, tol
2. Hacer x1 = x0 - f(x0)/f'(x0)
3. Si |x0 - x1| < tol entonces escribir x1. Fin
4. En caso contrario hacer x0 = x1 e ir a 2.
Observamos que para aplicar este mtodo necesitamos evaluar la derivada de la
funcin f. En la implementacin newton.m utilizaremos una funcin fprima.m
que permite evaluar la derivada de la funcin f.m. (Modifique el archivo f.m para
que contenga la funcin e^x+x, y compruebe que el archivo fprima contiene la
derivada de f)
Aunque en el pseudocdigo se incluye un salto a la linea 2, en la implementacin
hay un bucle que se repetir mientras la variable seguir valga true. Dicha
variable valdr falsecuando dos iteraciones sucesivas estn lo suficientemente
prximas, lo que har que el bucle termine. Esta implementacin slo incluye
este criterio de parada.
% Mtodo de Newton-Raphson para una funcin f definida.
% Deben estar definidas la funcin f.m y su derivada fprima.m
x0=2;
tol=0.00001;
seguir=true;
while seguir
x1=x0-f(x0)/fprima(x0);
% fprintf('x1 = %d \n',x1);
if abs(x0-x1)<tol
seguir=false;
end
x0=x1;
end
Ej 15. Represente la funcin f(x)=cosh(x).*cos(x)-1 en el intervalo [4,5]. Se
pretende encontrar la raz de f que est en ese intervalo mediante el mtodo de
Newton-Raphson. (La derivada de la funcin cosh(x), coseno hiperblico, es la
funcin senh(x), seno hiperblico) Se consigue aproximar dicha raz tomando
como aproximacin inicial x0=4? y x0=4.1? (Sol. Si x0=4, se aproxima otra
raz. Si x0=4.1 se obtiene la aproximacin x1=4.730041)
Ej 16. Aplique el mtodo de Newton-Raphson a la ecuacin f(x)=x^3+94*x^2-
389*x+294=0 tomando como aproximacin inicial a) x0=1.9, b) x0=2.1, c) x0=2.
(Sol. Para x0=1.9 se aproxima a la raz x=1, para x0=2.1 se aproxima a la raz
x=3, para x0=2 se aproxima a la raz x=-98).
Ej 17. Modifique el mtodo de Newton-Raphson de forma que se detenga el
programa (y muestre el mensaje 'Derivada pequea') antes de calcular x1 si el
valor de f'(x0) en valor absoluto es menor que delta=0.00001. (Puede probar el
programa con f(x)=(x-2).*(x-7).*(x-2) y x0=5.33333333333)
Derivacin simblica
En el mtodo de Newton-Raphson, para aproximar la solucin de f(x)=0, es
necesario tener definida la derivada de la funcin f. En Matlab (no as en Octave)
se pueden hallar derivadas simblicas mediante el comando diff. Observe en los
ejemplos cmo se incluye la funcin a derivar entre comillas simples.
diff('sin(x^2)')
diff('(sin(x)^2)')

ans =

2*cos(x^2)*x



ans =

2*sin(x)*cos(x)


El resultado del comando diff lo podemos copiar y pegar en la definicin de la
funcin fprima.
Al usar el comando diff emplearemos los operadores de multiplicacin, divisin
y potenciacin sin el punto que indica operaciones con vectores. Si los usamos,
por ejemplo si ejecutamos la instruccin diff('x.^2'), obtendremos un error.
Ej 18. Halle de forma simblica la derivada de la funcin f(x)=cos(x)/sen(x).
(Sol. f '(x)= -1 -cos(x)^2/sin(x)^2).

Potrebbero piacerti anche