Taylor For Java
Taylor For Java
Taylor For Java
Si la funcin f y sus primeras n+1 derivadas son continuas, en un intervalo que contiene a y x, entonces el valor de la funcin esta dado por:
f ( x ) = f ( a ) + f ' (a )( x a ) +
Con frecuencia es conveniente simplificar la serie de Taylor definiendo un paso h = xi+1 - xi expresando la serie de Taylor como: f ( xi +1 ) = f ( xi ) + f ' ( xi )h + f ' ' ( xi ) 2 f ' ' ' ( xi ) 3 f n ( xi ) n h + h + ... + h 2! 3! n!
Uso de la expansin en serie de Taylor para aproximar una funcin con un nmero infinito de derivadas. Utilizar los trminos de la serie de Taylor con n= 0 hasta 6 para aproximar la funcin f(x) = cos(x) en xi+1 = /3 y sus derivadas en xi = /4. Esto significa que h = /3- /4 = /12, los valores de las derivadas y el error de aproximacin se presenta en la siguiente tabla. Orden n 0 1 2 3 4 5 6 fn(x) cos(x) -sen(x) -cos(x) sen(x) cos(x) -sen(x) -cos(x) fn(/4) 0.707106781 0.521986659 0.497754491 0.499869147 0.500007551 0.500000304 0.499999988 error (%) -41.4 -4.4 0.449 2.62x10-2 -1.51x10-3 -6.08x10-5 2.40x10-6
Note, que a medida que se introducen ms trminos, la aproximacin se vuelve ms exacta y el porcentaje de error disminuye. En general podemos tener una aproximacin polinomial de la funcin coseno, con sus derivadas en cero dada por Orden n 0 1 2 3 4 5 6 7 fn(x) cos(x) -sen(x) -cos(x) sen(x) cos(x) -sen(x) -cos(x) sen(x) 127 fn(0) 1 0 -1 0 1 0 -1 0
1 0 -1
1 2 1 4 1 6 1 8 1 10 x + x x + x x + ... 2 4! 6! 8! 10!
public static double coseno(double x) { int i; double s = 0; int signo = 1; for(i=0; i<10; i+=2) { s += signo*pow(x, i) / factorial(i); signo *= -1; } return s; } public static double seno(double x) { int i; double s = 0; int signo = 1; for(i=1; i<10; i+=2) { s += signo*pow(x, i) / factorial(i); signo *= -1; } return s; } public static double factorial(int x) { int i; double fact = 1; for(i=1; i<=x; i++) fact *= i; return fact; }
128
public static double pow(double x, int n) { int i; double pow =1; if(x==0) return 0; for(i=1; i<=n; i++) pow = pow*x; return pow; } }
Note en este ltimo cdigo, el uso de la funcin grfica que permite desplegar una funcin dada como dos arreglos de datos.
129
Ahora, truncando la serie despus del trmino con la primera derivada, se obtiene:
El primer trmino de la ecuacin represente la aproximacin de la derivada y el segundo el error de truncamiento. Note que el error de truncamiento se hace ms pequeo a medida que ti+1 ti (incremento) se hace pequeo. As que podemos hacer una buena aproximacin de derivadas utilizando el primer trmino, siempre y cuando se utilicen incrementos pequeos. Regresar.
130
Note que la funcin cruza el eje x en varios puntos, los cuales son solucin a f(x)=0. La implementacin en Java para esta es:
public class ej056 { public static void main(String[] args) { int i, N; double inicio = 0, fin = 5, incremento = 0.01; N = (int) ( (fin - inicio) / incremento) + 1; double x[] = new double[N]; double y[] = new double[N]; for (i = 0; i < N; i++) { x[i] = inicio + incremento * i; y[i] = Math.sin(10.0*x[i]) + Math.cos(3.0*x[i]); } grafica g = new grafica("Funcion seno"); g.Datos(x, y); g.show(); } }
Regresar.
1.- Si f(a) y f(c) tienen signos opuestos, entonces hay un cero entre [a,c]. 2.- Si f(c) y f(b) tienen signos opuestos, entonces, hay un cero en [a,b]. 3.- Si f(c) es igual a cero, entonces c es un cero. La implementacin en Java es:
double biseccion() { int i; double inicio =0, fin = 1, mitad; mitad = (fin+inicio)/2.0; while(fin - inicio > 0.0001) { System.out.println(mitad); pausa(300); mitad = (fin+inicio)/2.0; if(f(mitad) == 0) return mitad; if(f(inicio)*f(mitad) < 0 ) fin = mitad; else inicio = mitad; } return mitad; }
Ejemplo Calcular los ceros de la funcin x-cos(x) utilizando el algoritmo de biseccin en el intervalo [0,1].
iter 0 1 2 3 4 5 6 7 8 9 10 11 12 13 a 0.0000 0.5000 0.5000 0.6250 0.6875 0.7188 0.7344 0.7344 0.7383 0.7383 0.7383 0.7388 0.7390 0.7390 c 0.5000 0.7500 0.6250 0.6875 0.7188 0.7344 0.7422 0.7383 0.7402 0.7393 0.7388 0.7390 0.7391 0.7391 b 1.0000 1.0000 0.7500 0.7500 0.7500 0.7500 0.7500 0.7422 0.7422 0.7402 0.7393 0.7393 0.7393 0.7391 f(a) -1.0000 -0.3776 -0.3776 -0.1860 -0.0853 -0.0339 -0.0079 -0.0079 -0.0013 -0.0013 -0.0013 -0.0005 -0.0001 -0.0001 f( c) -0.3776 0.0183 -0.1860 -0.0853 -0.0339 -0.0079 0.0052 -0.0013 0.0019 0.0003 -0.0005 -0.0001 0.0001 0.0000 f(b) -1.0000 -0.3776 -0.3776 -0.1860 -0.0853 -0.0339 -0.0079 -0.0079 -0.0013 -0.0013 -0.0013 -0.0005 -0.0001 -0.0001
Para calcula la ecuacin de la lnea secante hacemos p1 = [a, f(a)] p2 = [b,f(b)] y sustituimos en la ecuacin de la lnea recta. y f(a) = (f(b) f(a))*(x a)/(b a) El cruce por cero de esta ecuacin esta en c = a f(a)*(b-a)/(f(b) f(a)) Entonces el mtodo de bisecciones puede ser modificado, en lugar de calcular c = (a+b)/2 hacemos c = a f(a)*(b-a)/(f(b) f(a)) y aplicamos las mismas tres reglas de la biseccin. Ejemplo 133
Calcular los ceros de la funcin x-cos(x) utilizando el algoritmo de regula falsi en el intervalo [0,1].
iter. 0 1 2 3 4 5 6 a 0.0000 0.6851 0.7363 0.7389 0.7391 0.7391 0.7391 c 0.6851 0.7363 0.7389 0.7391 0.7391 0.7391 0.7391 b 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 f(a) -1.0000 -0.0893 -0.0047 -0.0002 0.0000 0.0000 0.0000 f(c ) -0.0893 -0.0047 -0.0002 0.0000 0.0000 0.0000 0.0000 f(b) -1.0000 -0.0893 -0.0047 -0.0002 0.0000 0.0000 0.0000
As por ejemplo si tomamos dos puntos x1=0 y x2 = 2, las funciones valuadas en estos valores son f(0) =0.841470985 y f(2)= 0.85780222, podramos suponer que la funcin
134
crece en la direccin positiva de x, cuando en realidad en este intervalo existen 6 races. Ahora si tomamos el intervalo x1=0 y x2 = 1 las funciones valuadas en estos valores son f(0) =0.841470985 y f(2)= 0.402979862, podramos pensar que ms adelante existe una raz, cuando en realidad en este intervalo existen ms de una. Una manera de solucionar este problema es poner un punto inicial x0 y un incremento h lo suficientemente pequeo para evitar las situaciones antes descritas. El algoritmo consiste en: 1.- Dado x0 y h, hacemos k = 1 2.- Calculamos xk = xk-1 + h 3.- Duplicamos el incremento h = 2*h 4.- Si f(x0) * f(xk) < 0 paramos, sino regresamos a 2. Para nuestra funcin tenemos:
h 0.001 0.002 0.004 0.008 0.016 0.032 0.064 0.128 0.256 0.512 1.024 xk 0.000 0.001 0.003 0.007 0.015 0.031 0.063 0.127 0.255 0.511 1.023 2.047 f(xk) 0.841 0.847 0.857 0.877 0.912 0.965 0.999 0.809 -0.129 -0.907 0.191 0.507
Podemos ver que con un incremento de 0.001, hemos localizado una raz en el intervalo x = [0.000, 0.255]. Esta es la informacin que utilizamos para inicializar, ya sea, el mtodo de Regula Falsi o Bisecciones. Regresar.
El Mtodo de Newton-Raphson.
Si tenemos una funcin f(x) continua y cerca de una raz p. Si la derivada f(x) existe, entonces puede utilizarse para desarrollar algoritmos que produzcan sucesiones {pk} que converjan a p ms rpidamente que los algoritmos de biseccin. Consideremos el caso de una funcin como la que se muestra en la figura.
135
En estas figuras se muestra dos iteraciones del mtodo. En la figura de la izquierda mostramos la lnea recta que es tangente a la funcin f(x) (en negro), note que la lnea recta cruza el eje x en x = 1. A la derecha tenemos la segunda iteracin tomando como valor inicial x=1. Note como poco a poco se acerca a la solucin. La sucesin que nos lleva a la solucin esta dada por los puntos {p0, p1, p2, , pk}. La pendiente de la lnea recta es m = (0 f(p0))/(p1 p0) Por otro lado sabemos, del clculo diferencial, que la pendiente de la lnea tangente a una funcin es la primer derivada valuada en ese punto. As: m = f(p0) Uniendo las ecuaciones tenemos
136
f(p0) = (0 f(p0))/(p1 p0) p1= p0 - f(p0)/ f(p0) De manera iterativa podemos hacer p2= p1 - f(p1)/ f(p1) p3= p2 - f(p2)/ f(p2) pk+1= pk - f(pk)/ f(pk) Ejemplo. Hacer un algoritmo iterativo que permita hacer el clculo de la raz cuadrada de A. Para este caso nuestra funcin a resolver es f(x) = x2-A. La solucin cuando f(x)=0 es x = A0.5 . f(x) = x2-A f(x) =2 x pk+1= pk - f(pk)/ f(pk) pk+1= pk - (pk-2-A))/(2 pk) pk+1=( pk + A/ pk)/2 Los clculos numricos suponiendo A=5 son:
k 0 1 2 3 4 5 6 7 8 9 10 pk 2.0000 2.2500 2.2361 2.2361 2.2361 2.2361 2.2361 2.2361 2.2361 2.2361 2.2361
Ejemplo Calcular los ceros de la funcin x-cos(x) utilizando el algoritmo de regula falsi en el intervalo [0,1].
k pk 0 0.0000 1 1.0000
137
2 3 4 5 6 7
Si escribimos el sistema original como una funcin vectorial V=F(X), entonces la matriz jacobiana J(x,y) es el anlogo bidimensional de la derivada. La aproximacin lineal queda como:
donde
138
Ejemplo. Resolver el siguiente sistema de ecuaciones dado por f1(x,y) = x2 2x y +0.5 f2(x,y) = x2 + 4y2 4 El jacobiano es
Segunda iteracin
139
k 0 1 2 3 4 5 6 7
140
1000
800
-0.5
0.5 x
1.5
141
Mtodo de la Secante.
Un problema en la implementacin del mtodo de Newton-Raphson es el de la evaluacin de la derivada. Aunque esto no es un inconveniente para los polinomios y para muchas otras funciones, existen algunas funciones cuyas derivadas pueden ser en extremo difciles de evaluar. En estos casos, la derivada se puede aproximar mediante una diferencia finita.
Sustituyendo esta aproximacin en la formula de Newton, tenemos la frmula del mtodo de la secante.
Ejemplo. Encontrar la solucin utilizando el mtodo de la secante para la funcin f(x) = x10 1.
Funcion f(x) = x 10-1 1200
1000
800
-0.5
0.5 x
1.5
x0
x1
f(x0)
f(x1)
142
Note, que para este problema, el mtodo de la secante si lleva a una solucin. Este hecho se debe a que calcula su aproximacin apoyada de dos puntos, no de uno solo. La implementacin de este mtodo en Java es :
double Secante() { int i; double m, x, x0 = 0, h = 0.5; x = inicio + h;
Races Mltiples.
Una raz mltiple corresponde a un punto donde una funcin es tangente al eje x. Por ejemplo, una raz doble resulta de f(x) = (x-3)(x-1)(x-1) multiplicando trminos este polinomio luce como f(x) = x3 - 5x2 + 7x 3
143
En la siguiente figura podemos ver como la funcin toca tangencialmente el eje de la x, en el punto donde existe la raz doble.
f(x) = x 3 - 5x2 + 7x -3 10
4 f(x) 2 0 -2 -4 0
0.5
1.5
2 x
2.5
3.5
De la figura podemos ver algunos de los problemas asociados con races mltiples, dichos problemas son: Dado que la funcin no cambia de signo, utilizar mtodos basados en intervalos, como son el mtodo de bisecciones, regula Falsi, etc. Otro problema es que cerca de la solucin, la derivada tiende a cero, lo cual provoca que en el algoritmo de Newton-Raphson tenga problemas de convergencia al tener una divisin por cero. Ralston y Rabinowitz (1978) proponen que se haga un pequeo cambio en la formulacin para que retorne la convergencia, as la formulacin para el mtodo de Newton-Raphson es
en donde m, es la multiplicidad de la raz. Para este caso ser necesario conocer a priori el nmero de races multiples. Otra alternativa propuesta por Ralston y Rabinowitz (1978) es la de definir una nueva funcin u(x), que es el cociente de la funcin y su derivada
144
Se puede mostrar esta funcin tiene las mismas races que f(x) y que la multiplicidad de races no afectar. La formulacin del mtodo de Newton-Raphson es:
Ejemplo. Hacer una comparacin entre el mtodo de Newton-Raphson y el mtodo de NewtonRaphson modificado, para encontrar las races del polinomio f(x) = x3 - 5x2 + 7x 3. Para nuestro calculo requerimos de: f(x) = x3 - 5x2 + 7x 3 f(x) =3 x2 - 10x + 7 f(x) = 6x 10 Primeramente resolvemos con x0 = 0.
Newton-Raphson k xk 0 0 1 0.42857143 2 0.68571429 3 0.8328654 4 0.91332989 5 0.95578329 6 0.9776551 7 0.98876617 8 0.99436744 9 0.99717977 10 0.99858889 Newton-Raphson modificado k xk f(xk) 0 0 -3 1 1.10526316 -0.02099431 2 1.00308166 -1.8964E-05 3 1.00000238 -1.1343E-11
f(xk) -3 -0.83965015 -0.22859475 -0.06053668 -0.01567446 -0.00399668 -0.00100975 -2.54E-04 -6.36E-05 -1.59E-05 -3.99E-06
145
11 12 13 14 15 16 17 18
La solucin con x0 = 4
Newton-Raphson k xk 0 4 1 3.4 2 3.1 3 3.00869565 4 3.00007464 5 3.00000001 6 3 Newton-Raphson modificado k xk f(xk) 0 4 9 1 2.63636364 -0.97370398 2 2.82022472 -0.5956347 3 2.96172821 -0.1472843 4 2.99847872 -6.08E-03 5 2.99999768 -9.27E-06 6 3 -2.15E-11
Note que cuando existe una raz mltiple (en el caso de x=1), el algoritmo de Newton Raphson modificado, tiene mejor comportamiento, que cuando no es el caso de raz mltiple (x=3). Implementacin en Java.
/** * <p>Title: Metodo de Newton Raphson Modificado</p> * <p>Description: Compara los mtodos de Newton</p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: UMSH</p> * @author Dr. Felix Calderon Solorio. * @version 1.0 */ public class ej059 { public static void main(String[] args) { Newton_Raphson(0, 1e-10); Newton_Raphson_Modificado(0, 1e-10); } public static double Newton_Raphson(double x0, double T) { int i =0; double x = x0;
while(Math.abs(f(x)) > T) {
146
System.out.println("Iteracion " + i++ + " " + x + " " + f(x)); x = x - f(x)/df(x); } System.out.println("Iteracion " + i++ + " " + x + " " + f(x)); return x; } public static double Newton_Raphson_Modificado(double x0, double T) { int i =0; double x = x0;
while(Math.abs(f(x)) > T) { System.out.println("Iteracion " + i++ + " " + x + " " + f(x)); x = x - (f(x)*df(x))/(df(x)*df(x) - f(x)*ddf(x)); } System.out.println("Iteracion " + i++ + " " + x + " " + f(x)); return x; } public static double f(double x) { return (x*x*x - 5.0*x*x + 7.0*x - 3.0); } public static double df(double x) { return (3.0*x*x - 10.0*x + 7.0); } public static double ddf(double x) { return (6.0*x - 10.0); } }
Regresar.
Raz de polinomios
Es esta seccin se analizar los mtodos para encontrar las races de ecuaciones polinomiales de la forma general fn(x) = a0 + a1x+ a2x2 + ... + anxn.
Evaluacin de polinomios
Consideremos como ejemplo el siguiente polinomio.
147
f3(x) = a0 + a1x+ a2x2 + a3x3. En este caso los coeficientes del polinomio los podemos poner en un vector de datos dado como a = [a0, a1, a2, a3], y realizar la evaluacin polinomial utilizando ciclos. Adicionalmente necesitamos de una funcin que nos permita calcular la potencias de x. Manipulando el polinomio, podemos dar una forma eficiente de realizar la evaluacin. As el mismo polinomio, lo podemos representar como: f3(x) = a0 + x(a1+ x(a2 + xa3)) Note que ahora ya no tenemos potencia de x y su implementacin resulta mas eficiente. Ejemplo. Consideremos el siguiente polinomio f3(x) = 1+2x+3x2, el cual deseamos evaluar en x = 20. Para implementarlo hacemos n 2 1 0 Clculo de derivadas. Cuando se buscan los ceros de una funcin, como es el caso del mtodo de Newton, es necesario no solo hacer la evaluacin del polinomio sino calcular tambin su derivada. En este caso la derivada de cualquier polinomio la podemos calcular como: fn(x) = anxn + an-1xn-1 + an-2xn-2 + + a2x2+ a1x + a0 fn(x) = nanxn-1 + (n-1)an-1xn-2 + (n-2)an-2xn-3 + + 2a2x+ a1 Note que el polinomio fn(x) es un polinomio de menor grado. As por ejemplo considerando el polinomio f3(x) = 1+2x+3x2, tenemos que su derivada es: n 1 0 df = df*x + a[i+1]*(i+1) df df = 0*20+3*2 6 pf = 6*20+2*1 122 p = p*x + a[i]; p = 0*20+3 p = 3*20+2 p = 62*20+1 p=3 p = 62 p = 1241
Deflacin polinomial.
Suponga que conoce, una de las races de un polinomio, podemos realizar la divisin de este polinomio para obtener un polinomio de grado menor. As por ejemplo si tenemos
148
fn(x) = a0 + a1x+ a2x2 + ... + anxn. Y una de sus races es s, entonces podemos escribir fn(x) =(x-s)*(a0 + a1x+ a2x2 + ... + an-1xn-1). En este caso el residuo de la divisin es cero y podemos calcular un polinomio de grado n1. Para un polinomio de orden 3 tenemos que a3x2 x+s a3x3 -a3x2 0 (a2-a3s) x +a2x2 - a3 s x2 (a2-a3s) x2 -(a2-a3s) x2 0 a1-(a2-a3s)s + a1x + a1x -(a2-a3s)sx (a1-(a2-a3s)s)x -(a1-(a2-a3s)s)x +a0 +a0 +a0 -(a1-(a2-a3s)s)s a0-(a1-(a2-a3s)s)s
La divisin sinttica, es una manera de hacer lo mismo, pero de forma compacta. As tenemos: x+s a3 a3 Ejemplo. Dado el polinomio f5(x) = x5 - 7x4 3x3 + 79x2 46x 120 encontrar la divisin sinttica con el monomio (x-4). x-4 1 1 -7 4 -3 -3 -12 -15 79 -60 19 -46 76 30 -120 120 0 a2 - a3 s a2- a3 s a1 a0 -(a2- a3 s)s -(a1-(a2-s a3)s)s a1-(a2- a3 s)s a0-(a1-(a2- a3 s)s)s
El polinomio resultante, en este caso, es f4(x) = x4 - 3x3 15x2 + 19x +30. Note que el residuo es cero. Implementacin en Java.
/** * <p>Title: Evaluacion polinomial</p> * <p>Description: Realiza la evaluacion calculo de * derivadas y division sintetica</p> * <p>Copyright: Copyright (c) 2004</p> * <p>Company: UMSNH</p> * @author Dr. Felix Calderon Solorio * @version 1.0
de
polinomios
asi
como
el
149
*/ public class ej057 { public static void main(String[] args) { double a[] = {-120, -46, 79, -3, -7, 1}; double b[] = new double [a.length]; System.out.println(EvaluaPolinomio(a, 1)); System.out.println(EvaluaDerivada(a, 1)); DivisionSintetica(a, b, -4); } public static double EvaluaPolinomio(double a[], double x) { int n = a.length, i; double p = 0; for(i=n-1; i>=0; i--) p = p*x + a[i]; return p; } public static double EvaluaDerivada(double a[], double x) { int n = a.length, i; double df = 0; for(i=n-2; i>=0; i--) df = df*x + a[i+1]*(i+1); return df; } public static void DivisionSintetica(double a[], double b[], double s) { int n = a.length, i; b[n-1] = a[n-1]; for(i=n-2; i>=0; i--) b[i] = a[i] - b[i+1] * s; for(i=n-1; i>0; i--) System.out.print(b[i] + " "); System.out.println( "residuo = " + } } Regresar. b[0]);
Mtodo de Mller.
150
El mtodo de la secante obtiene races de una funcin estimando una proyeccin de una lnea recta en el eje de las x, a travs de los valores de la funcin. El mtodo de Mller, trabaja de manera similar, pero en lugar de hacer la proyeccin de una recta utilizando dos puntos, requiere de tres puntos para calcular una parbola. Para esto necesitaremos de tres puntos [x0, f(x0)], [x1, f(x1)] y [x2, f(x2)]. La aproximacin la podemos escribir como: f2(x) = A(x x2)2 + B(x x2) + C Los coeficientes de la parbola los calculamos resolviendo el siguiente sistema de ecuaciones. f2(x0) = A(x0 x2)2 + B(x0 x2) + C f2(x1) = A(x1 x2)2 + B(x1 x2) + C f2(x2) = A(x2 x2)2 + B(x2 x2) + C De la ltima ecuacin podemos ver que el calor de C = f2(x2). Sustituyendo los valores de C en las otras dos ecuaciones tenemos f2(x0)- f2(x2) = A(x0 x2)2 + B(x0 x2) f2(x1) - f2(x2) = A(x1 x2)2 + B(x1 x2) Si definimos h0 = x1 - x0 h1 = x2 x1 d0 = [f(x1) f(x0)]/[x1 x0] d1 = [f(x2) f(x1)]/[x2 x1] Sustituyendo en las ecuaciones tenemos -(d0* h0 + d1* h1)= A(h1 + h0 )2 - B(h1 + h0 ) -d1* h1 = A(h1)2 - Bh1 La solucin de este sistema de ecuaciones es: A = (d1 d0)/(h1 + h0) B = Ah1 + d1 C = f(x2) Ahora para calcular la raz del polinomio de segundo grado, podemos aplicar la formula general. Sin embargo, debido al error potencial de redondeo, usaremos una formulacin alternativa.
151
Ejemplo. Use el mtodo de Mller con los valores iniciales de 4.5, 5.5 y 5 para determinar la raz de la ecuacin f(x) = x3 13x 12. x0 4.50000 5.50000 5.00000 3.97649 x1 5.50000 5.00000 3.97649 4.00105 x2 5.00000 3.97649 4.00105 4.00000 f(x0) 20.62500 82.87500 48.00000 -0.81633 f(x1) 82.87500 48.00000 -0.81633 0.03678 f(x2) 48.00000 -0.81633 0.03678 0.00002 x3 3.97649 4.00105 4.00000 4.00000
Implementacin en Java.
/** * <p>Title: Metodo de Muller</p> * <p>Description: Resuelve un ecuacin cuadratica</p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: UMSNH</p> * @author Dr. Felix Calderon Solorio * @version 1.0 */ public class ej058 { public static void main(String[] args) { Muller(); } static public void Muller() { double x0 = 4.5, x1 = 5.5, x2 = 5.0, x3; double h0, h1, d0, d1, A, B, C; double den, raiz; do { h0 h1 d0 d1 = = = = x1 - x0; x2 - x1; (f(x1) - f(x0)) / h0; (f(x2) - f(x1)) / h1;
haciendo
una
aproximacion
152
raiz = Math.sqrt(B * B - 4.0 * A * C); if (Math.abs(B + raiz) > Math.abs(B - raiz)) den = B + raiz; else den = B - raiz; x3 = x2 - 2 * C / den; System.out.println(" x = " + x3 + " " + f(x3)); x0 = x1 = x2 = }while x1; x2; x3; (Math.abs(f(x3)) > 0.000001);
Regresar.
Mtodo de Bairstow.
El mtodo de Bairstow es un mtodo iterativo, basado en el mtodo de Mller y de Newton Raphson. Dado un polinonio fn(x) se encuentran dos factores, un polinomio cuadrtico f2(x) = x2 rx s y fn-2(x). El procedimiento general para el mtodo de Bairstow es: 1. Dado fn(x) y r0 y s0 2. Utilizando el mtodo de NR calculamos f2(x) = x2 r0x s0 y fn-2(x), tal que, el residuo de fn(x)/ f2(x) sea igual a cero. 3. Se determinan la races f2(x), utilizando la formula general. 4. Se calcula fn-2(x)= fn(x)/ f2(x). 5. Hacemos fn(x)= fn-2(x) 6. Si el grado del polinomio es mayor que tres regresamos al paso 2 7. Si no terminamos La principal diferencia de este mtodo, respecto a otros, es que permite calcular todas las races de un polinomio (reales e imaginarias). Para calcular la divisin de polinomios, hacemos uso de la divisin sinttica. As dado fn(x) = anxn + an-1xn-1 + + a2x2 + a1x + a0 Al dividir entre f2(x) = x2 rx s, tenemos como resultado el siguiente polinomio fn-2(x) = bnxn-2 + bn-1xn-3 + + b3x + b2 con un residuo R = b1(x-r) + b0, el residuo ser cero solo si b1 y b0 lo son. 153
Los trminos b, los calculamos utilizamos divisin sinttica, la cual puede resolverse utilizando la siguiente relacin de recurrencia bn = an bn-1 = an-1 + rbn bi = ai + rbi+1 + sbi+2 Una manera de determinar los valores de r y s que hacen cero el residuo es utilizar el Mtodo de Newton-Raphson. Para ello necesitamos una aproximacin lineal de b1 y b0 respecto a r y s la cual calculamos utilizando la serie de Taylor
donde los valores de r y s estn dados y calculamos los incrementos dr y ds que hacen a b1(r+dr, s+ds) y b0(r+dr, s+dr) igual a cero. El sistema de ecuaciones que tenemos que resolver es:
Bairtow muestra que las derivadas parciales pueden obtener haciendo un procedimiento similar a la divisin sinttica, as cn = bn cn-1 = bn-1 + rcn ci = bi + rci+1 + sci+2 donde
154
Sustituyendo trmino Ejemplo 1 Dado el polinomio f5(x) = x5 - 3.5x4 + 2.75x3 + 2.125x2 - 3.875x + 1.25, determinar los valores de r y s que hacen el resido igual a cero. Considere r0 = -1 y s0 = 2. Solucin. Iteracin 1. La divisin sinttica con el polinomio f2(x) = x2 -x + 2.0 da como resultado f3(x) = x3 - 4.5x2 + 9.25x - 16.125 Residuo = {30.75, -61.75}
Aplicando el mtodo de Newton tenemos -43.875 16.75 108.125 -43.875 de donde r1 = -1.0 + 2.7636812508572213 =1.7636812508572213 s1 = 2.0 + 5.403374022767796 =7.403374022767796 Iteracin 2. La divisin sinttica con el polinomio f2(x) = x2 -1.7636812508572213x 7.403374022767796 da como resultado f3(x) = x3 - 1.7363187491427787x2 + 7.091061199392814x - 1.776754563401905 Residuo = {51.75640698828836, 105.68578319650365} Aplicando el mtodo de Newton tenemos 27.628006 14.542693 dr -51.75640 dr ds -30.75 61.75
155
208.148405 de donde
27.62800
ds
-105.68578
r2 = 1.7636812508572213 - 0.04728019113442016 = 1.7164010597228012 s2 = 7.403374022767796 - 3.469106187802152 = 3.934267834965644 Iteracin 3. La divisin sinttica con el polinomio f2(x)= 3.934267834965644 da como resultado f3(x) = x3 1.3261878347051992 1.7835989402771988x2 x2 - 1.7164010597228012x + 3.622896723753395x +
Residuo = {12.654716254544885, 28.1881465309956} Aplicando el mtodo de Newton tenemos 13.83497 65.679212 de donde r3 = 1.7164010597228012 - 0.11666951305731528 = 1.599731546665486 s3 = 3.934267834965644 - 1.4835870659929915 = 2.4506807689726524 En resumen k 0 1 2 3 4 5 6 7 8 La solucin es: f3(x) = x3 - 2.53x2 + 2.25x - 0.625 y f2(x) = x2 - x - 2 Las races de f2(x) = x2 - x - 2, son r -1 1.76368 1.71640 1.599731 1.33354 1.11826 1.02705 1.00165 1.00000 s 2 7.403374 3.93426 2.450680 2.18666 2.11302 2.02317 2.00153 2.00000 Residuo 30.75 -61.75 51.756406 105.68578 12.65471 28.18814 2.89958 8.15467 0.760122 2.522228 0.271940 0.607688 0.04313 0.11185 0.00277 0.00634 1.13930E-5 2.67534E-5 7.44182 13.83497 dr ds -12.65471 -28.18814
156
x1 = 2 x2 = -1 Si repetimos el ejemplo pero ahora considerando el polinomio f3(x) = x3 - 2.53x2 + 2.25x 0.625 , podemos calcular el total de las races del polinomio original. Ejemplo 2 Dado el polinomio f5(x) = x5 - 3.5x4 + 2.75x3 + 2.125x2 - 3.875x + 1.25, determinar las races de este polinomio. Considere r0 = -1 y s0 = -1. Paso 1. f5(x) = x5 - 3.5x4 + 2.75x3 + 2.125x2 - 3.875x + 1.25 f5(x) =( x3 - 4x2 + 5.25x - 2.5)*( x2 +0.5x - 0.5) Las races de x2 +0.5x - 0.5=0 son x1 = 0.5 x2 =-1.0 Paso 2. f3(x) = x3 - 4x2 + 5.25x - 2.5 f3(x) =(x - 2)*(x2 - 2x +1.25) Las races de x2 - 2x +1.25=0 son x3 = 1.0 + j0.5 x4 =-1.0 - j0.5 Paso 3 f1(x) =(x - 2) La raz de este polinomio es x5 = 2; Todas la races de f5(x) son x = [0.5, 1.0, (1.0 + j0.5), (1 - j0.5), 2] Implementacin en Java.
package ejemplos;
157
/** * <p>Title: Metodo de Baritow </p> * <p>Description: Calcula todas las raices de un polinomio de grado n</p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: UMSNH</p> * @author Dr. Felix Calderon Solorio * @version 1.0 */ public class ej065 { public static void main(String[] args) { //double a[] = {-2.5, 5.25, -4, 1}; double a[] ={1.25, -3.875, 2.125, 2.75, -3.5, 1}; int n = a.length; double re[] = new double[n]; double im[] = new double[n]; Bairstow(a, -1, -1, re, im); //Bairstow(a, -1, 2, re, im); } static public void Bairstow(double a[], double r0, double s0, double re[], double im[]) { int n = a.length, iter =0; double b[] = new double[n], c[] = new double[n]; double ea1 = 1, ea2 = 1, T = 0.00001; double r=r0, s=s0,det, ds, dr; int MaxIter = 100, i; for(iter=0; iter< MaxIter && n>3; iter++) { do { Division_Derivada(a, b, c, r, s, n); /* System.out.println("Solucionando "); System.out.print("fn(x) = "); imprime(a, n); System.out.print("fn-2(x) = "); imprime2(b, n); System.out.println("f2(x) = x2 + " + r + "x + " + s); System.out.println(c[2] + " " + c[3] + " = " + -b[1]); System.out.println(c[1] + " " + c[2] + " = " + -b[0]); */ det = c[2]*c[2] - c[3]*c[1]; if(det!=0) { dr = (-b[1]*c[2] + b[0]*c[3])/det; ds = (-b[0]*c[2] + b[1]*c[1])/det; /* System.out.println("*********************************"); System.out.println(r+dr +" = " + r + " + " + dr); System.out.println(s+ds +" = " + s + " + " + ds); System.out.println("-----------------------------------");*/ r = r+dr; s = s+ds;
158
if(r!=0) ea1 = Math.abs(dr/r)*100.0; if(s!=0) ea2 = Math.abs(ds/s)*100.0; } else { r = 5*r+1; s = s+1; iter = 0; } } while ((ea1 > T) && (ea2 > T)); raices(r, s, re, im, n); System.out.println("iter " +iter); System.out.print("fn(x) = "); imprime(a, n); System.out.print("fn-2(x) = "); imprime2(b, n); System.out.println("f2(x) = x2 -(" +r + ")x -(" +s +")"); n = n-2; for(i=0; i<n; i++) a[i] = b[i+2]; if (n < 4) break; } if(n==3) { System.out.println("n = " + n); r = -a[1]/a[2]; s = -a[0]/a[2]; imprime(a, n); raices(r, s, re, im, n); } else { re[n-1] = -a[0]/a[1]; im[n-1] = 0; } for(i=1; i<re.length; i++) System.out.println( "X["+i+"]= " + re[i] + " j " + im[i]); } public static void Division_Derivada(double a[], double b[], double c[], double r, double s, int n) { int i; b[n-1] = a[n-1]; b[n-2] = a[n-2] + r*b[n-1]; c[n-1] = b[n-1]; c[n-2] = b[n-2] + r*c[n-1]; for(i=n-3; i>=0; i--) { b[i] = a[i] + r*b[i+1] + s*b[i+2]; c[i] = b[i] + r*c[i+1] + s*c[i+2]; } }
159
public static void imprime(double x[], int n) { int i; for (i = n - 1; i >= 0; i--) if(x[i] > 0) System.out.print("+ " +x[i] + "x"+i+" "); else System.out.print("- " + -x[i] + "x"+i+" "); System.out.println(""); } public static void imprime2(double x[], int n) { int i; for (i = n - 1; i >= 2; i--) if(x[i] > 0) System.out.print("+ " +x[i] + "x"+(i-2)+" "); else System.out.print("- " + -x[i] + "x"+(i-2)+" "); System.out.println("Residuo = {"+ x[1]+ ", " + x[0] + "}"); } public static void raices(double r, double s, double re[], double im[], int n) { double d = r*r + 4*s; if(d > 0) { re[n-1] = (r + Math.sqrt(d))/2.0; re[n-2] = (r - Math.sqrt(d))/2.0; im[n-1] = 0; im[n-2] = 0; } else { re[n-1] = r/2.0; re[n-2] = re[n-1]; im[n-1] = Math.sqrt(-d)/2.0; im[n-2] = -im[n-1]; } } }
Regresar.
Eliminacin Gaussiana
Consideremos que tenemos un sistema lineal Ax=b, donde la matriz A no tiene las condiciones de ser triangular superior. a11 a21 a31 a12 a22 a32 a13 a23 a33 x1 x2 x3 = b1 b2 b3
160
b1 - a12x2 - a13x3 x1 = -----------------a11 y sustituimos en las ecuaciones II b1 - a12x2 - a13x3 ------------------ + a22x2 + a23x3 = b2 a11
a21
agrupando trminos semejantes tenemos: (a22 a21 a12/a11)x2 + (a23 a21 a13/a11) x3 = (b2 - a21 b1/a11) Ahora sustituimos en la ecuacin III b1 - a12x2 - a13x3 a31 ------------------ + a32x2 + a33x3 = b3 a11 (a32 a31 a12/a11)x2 + (a33 a31 a13/a11) x3 = (b3 a31 b1/a11) Lo cual nos da un nuevo sistema simplificado dada por a11x1 + a12x2 + a13x3 = b1 (I) a22x2 + a23x3 = b2 (II) a32x2 + a33x3 = b3 (III) donde los valores de aij los calculamos como: aij = aij aik akj/ akk bi = bi aik bk/ akk Si repetimos el procedimiento tendremos un sistema dado como: a11x1 + a12x2 + a13x3 = b1 (I) a22x2 + a23x3 = b2 (II) a33x3 = b3 (III) que corresponde a un sistema triangular superior que podemos solucionar utilizando sustitucin hacia atrs. Ejemplo. Calcular el sistema triangular superior utilizando eliminacin gaussiana. 5x1 + 2x2 + 1x3 = 3
161
2x1 + 3x2 - 3x3 = -10 1x1 - 3x2 + 2x3 = 4 Primer paso 5x + 2y + 1z = 3 0 + (11/5)y (17/5)z = -(56/5) 0 - (17/5)y + (9/5)z = (17/5) Segundo paso 5x + 2y + 1z = 3 0x + (11/5)y ( 17/5)z = -(56/5) 0x 0y (38/11)z = -(153/11) Ejemplo. Resolver el sistema de ecuaciones 3 -1 -1 -1 1 0 -1 0 1 x y z = 0 1 1
Aplicando eliminacin gaussiana nos queda. 3 0 0 Ejemplo. Un ejemplo de sistema donde es necesario hacer un cambio de rengln por rengln para que tenga solucin es el siguiente sistema. 1 4 -2 2 8 3 6 -1 5 -1 2/3 0 -1 -1/3 1/2 x y z = 0 1 3/2
note, que aparece un cero en el elemento 22, lo cual nos da un sistema sin solucin. Permutando los renglones 2 y 3 el sistema tiene solucin.
162
1 -2 4 Regresar.
2 3 8
6 5 -1
Factorizacin triangular.
Supongamos que la matriz de coeficientes A de un sistema lineal Ax=b admite una factorizacin triangular como la siguiente. a00 a10 a20 a01 a11 a21 a02 a12 a22 = 1 l10 l20 0 1 l21 0 0 1 * u00 0 0 u01 u11 0 u02 u12 u22
Entonces la solucin la podemos plantear como [LU]x = b El cual se puede solucionar resolviendo primero Ly=b y luego el sistema Ux=y. Estos sistemas pueden resolverse utilizando sustitucin hacia atrs y sustitucin hacia delante. Sustitucin hacia delante. La formula para calcular la sustitucin hacia delante es:
Sustitucin hacia atrs. La formula para calcular la sustitucin hacia atrs es:
163
Ejemplo. Resolver el sistema de ecuaciones x0 + 2x1 + 4x2 + x3 = 21 2x0 + 8x1 + 6x2 + 4x3 = 52 3x0 + 10x1 + 8x2 + 8x3 = 79 4x0 + 12x1 + 10x2 + 6x3 = 82
| A = | | | 1 2 4 2 8 6 3 10 8 4 12 10 1 4 8 6 | | | | = | | | | 1 2 3 4 0 1 1 1 0 0 1 2 0 0 0 1 | | 1 | * | 0 | | 0 | | 0 2 4 1 4 2 2 0 2 3 0 0 6 | | | |
y2 + 2y2 +
El cual corresponde a un sistema triangular inferior y0 = 21 y1 = 10 y2 = 6 y3 = -24 En general xk = (bk Sj=1,k-1 akj xj)/akk y posteriormente solucionamos
164
x0 + 2x1 4x1
= 21 = 10 = 6 =-24
Utilizando sustitucin hacia atrs tenemos X = [1,2,3,4]T Implementacin utilizando eliminacin Gaussiana.. Como vimos una matriz factorizada, fcilmente puede ser resuelta utilizando los mtodos de sustitucin hacia adelante y sustitucin hacia atrs. Pero como hacemos la factorizacin? Comenzaremos por escribir el sistema a00 a10 a20 a01 a11 a21 a02 a12 a22 = 1 l10 l20 0 1 l21 A = LU Si multiplicamos el primer rengln de L por la primera columna de U tenemos u00 = a00 u01 = a01 u02 = a02 Ahora hacemos lo mismo para el segundo rengln de L l10 u00 = a10 l10 u01 + u11 = a11 l10 u02 + u12 = a12 Multiplicando el tercer rengln de L l20 u00 = a20 l20 u01 + l21 u11 = a21 l20 u02 + l21 u12 + u22 = a22 l20 = a20/u00 l21 = (a21 l20 u01)/a11 u22 = a22 l20 u02 l21 u12 l10 = a10/u00 u11 = a11 l10 u01 u12 = a12 l10 u02 0 0 1 * u00 0 0 u01 u11 0 u02 u12 u22
Podemos notar lo siguiente, en este caso la triangulacin la podemos hacer en dos pasos. Paso I. Dado la matriz A hacemos a00 a10/a00 a20/a00 a01 a11 a10 a10/a00 a21 a20 a01/a00 165 a02 a12 a10 a02/a00 a22 a20 a02/a00
a00 a10 a20 Paso II. Dado A modificada a00 a10 a20 a00 a10 a20
Note que para calcular la matriz triangular superior se podra aplicar, el mtodo de eliminacin Gaussiana y la matriz diagonal inferior es simplemente los cocientes ajk = ajk/akk La implementacin en Java es:
static public void LU_EG(double a[][]) { int n = a.length; double factor; for (int k = 0; k <= n - 2; k++) { for (int i = k+1; i < n; i++) { factor = a[i][k]/a[k][k]; a[i][k] = factor; for (int j = k+1; j < n; j++) a[i][j] -= factor * a[k][j]; } } }
Factorizacin de Crout. Consideremos un sistema ms grande, por ejemplo de 4 ecuaciones con cuatro incgnitas. a00 a10 a20 a30 a01 a11 a21 a31 a02 a12 a22 a32 a03 a13 a23 a33 = 1 l10 l20 l30 0 1 l21 l31 0 0 1 l32 0 0 1 1 * u00 0 0 0 u01 u11 0 0 u02 u12 u22 0 u03 u13 u23 u33
Si hacemos las multiplicaciones indicadas y dejamos los valores en la misma matriz tenemos: Para el primer rengln de la matriz (i=0) 166
j=0 j=1 j=2 j=3 Para el segundo rengln (i=1) j=0 j=1 j=2 j=3 Tercer rengln (i=2) j=0 j=1 j=2 j=3
arriba de la diagonal a(0,0) = a(0,0) a(0,1) = a(0,1) a(0,2) = a(0,2) a(0,3) = a(0,3)
bajo la diagonal a(1,0) = a(1,0) / a(0,0) arriba de la diagonal a(1,1) = a(1,1) - a(1,0)a(0,1) a(1,2) = a(1,2) - a(1,0)a(0,2) a(1,3) = a(1,3) - a(1,0)a(0,3)
bajo la diagonal a(2,0) = a(2,0) /a(0,0) a(2,1) = (a(2,1) - a(2,0)a(0,1) )/a(1,1) arriba de la diagonal a(2,2) = a(2,2) a(2,0) a(0,2) - a(2,1)a(1,2) a(2,3)= a(2,3) - a(2,0)a(0,3) - a(2,1)a(1,3)
Y finalmente para el cuarto rengln (i=3) j=0 j=1 j=2 j=3 bajo la diagonal a(3,0) = a(3,0) / a(0,0) a(3,1) = ( a(3,1) - a(3,0) a(0,1) )/a(1,1) a(3,2) = (a(3,2)-a(3,0) a(0,2)-a(3,1) a(1,2) ) / a(2,2) arriba de la diagonal a(3,3) = a(3,3) - a(3,0) a(0,3) - a(3,1) a(1,3) - a(3,2)a(2,3)
167
Ejemplo: Hacer la factorizacin LU de la siguiente matriz, utilizando eliminacin Gaussiana. Corroborar utilizando Factorizacin de Crout. 1 2 3 4 Paso 1. 1 2 3 4 Paso 2. 1 2 3 4 2 4 1 1 4 -2 -2 -4 1 2 3 0 2 4 4 4 4 -2 -4 -6 1 2 5 2 2 8 10 12 4 6 8 10 1 4 8 6
168
Paso 3. 1 2 3 4 Regresar. 2 4 1 1 4 -2 -2 -2 1 2 3 6
de la ecuacin I despejamos el valor de la variable x1 x1 = (b1 - a12x2 - a13x3)/a11 Reorganizando la ecuacin tenemos (b1/a11) - (a12/a11)x2 - (a13/a11)x3 = x1 Sustituimos el valor de x1 en la ecuacin II: (b1 - a12x2 - a13x3)*a21 /a11+ a22x2 + a23x3 = b2 (a21/a11)b1 + (a22 - a21 a12/a11)x2 + (a23 - a21 a13/a11)x3 = b2 y finalmente en III tenemos : (a31/a11)b1 + (a32 a31 a12/a11)x2 + (a33 a31 a13/a11)x3 = b3 En forma matricial estas ecuaciones lucen como: 1/a11 a21/a11 a31/a11 -a12/a11 a22-a21 a12/a11 a32a31 a12/a11 -a13/a11 a23-a21 a13/a11 a33-a31 a13/a11 b1 x2 x3 = x1 b2 b3
169
b1 x2 x3
x1 b2 b3
y los valores lo calculamos haciendo Dado un valor de k al que llamamos pivote: aij = aij aik akj/akk para todos los valores de i y j diferentes de k aik = aik/akk para todos los i diferentes de k akj = akj/akk para todos los j diferentes de k akk = 1/akk Si repetimos el procedimiento suponiendo un valor de k = 2 tendremos un sistema. a11-a12a21/a22 -a21/a22 a31-a32a'21/a22 a12/a22 1/a22 a32/a22 a13-a12a'23/a22 -a23/a22 a33-a32a'23/a22 b1 b2 x3 = x1 x2 b3
Lo que nos da un sistema equivalente como el siguiente. a11 a21 a31 a12 a22 a32 a13 a23 a33 b1 b2 x3 = x1 x2 b3
Finalmente si volvemos a repetir el mtodo tendremos a11 a21 a31 Ejemplo: Determinar la matriz inversa de 3 -1 -1 Primer paso: 1/3 1/3 170 1/3 -1 1 0 -1 0 1 a12 a22 a32 a13 a23 a33 b1 b2 b3 = x1 x2 x3
2/3 -1/3
-1/3 2/3
1 2 1
1 1 2
Matrices Especiales.
Una matriz bandada es una matriz cuadrada en la que todos sus elementos son cero, con excepcin de una banda sobre la diagonal principal. Un sistema tridiagonal (es decir con un ancho de banda de 3) se puede expresar en forma general como: f0 e1 g0 f1 e2 g1 f2 e3 x0 x1 x2 x3 = b0 b1 b2 b3
g2 f3
171
Ejemplo: Resuelva el siguiente sistema tridiagonal por medio del algoritmo de Thomas. 2.04 -1 -1 2.04 -1 -1 2.04 -1 x0 x1 x2 x3 = 40.8 0.8 0.8 200.8
-1 2.04
La solucin de la descomposicin triangular es: 2.04 -0.49 -1 1.55 -0.645 -1 1.395 -0.717
-1 1.323
ai , j =
para todo i=0,...,n-1 y j = 0,...,i-1.
ai , j ai , k ak , j
k =0
a j, j
172
Regresar.
Vamos a representar cada una de las variables en trminos de ellas mismas. b1 - a12x2 - a13x3 x1 = -----------------a11 b2 a21x1 a23x3 x2 = -----------------a22 173
b3 a31x1 a32x2 x3 = -----------------a22 Lo cual nos sugiere el siguiente esquema iterativo de solucin. b1 - a12x2(t) - a13x3(t) x1(t+1) = ---------------------a11 b2 a21x1(t) a23x3(t) x2(t+1) = ---------------------a22 b1 a31x1(t) a32x2(t) x3(t+1) = ---------------------a33 En general podemos escribir como b1 i=1, i !=k, n akixi(t) xk(t+1) = ---------------------akk Algoritmo iterativo de Gauss-Seidel. El cambio que debemos hacer respecto al de Jacobi, es que las variables nuevas son utilizadas una vez que se realiza el clculo de ellas as, para un sistema de tres ecuaciones tendremos: b1 - a12x2(t) - a13x3(t) x1(t+1) = ---------------------a11 b2 a21x1(t+1) a23x3(t) x2(t+1) = -----------------------a22 b1 a31x1(t+1) a32x2(t+1) x3(t+1) = -------------------------a33 Ejemplo.
174
Resolver el siguiente sistema de ecuaciones utilizando el mtodo de Jacobi y comparar con el mtodo de Gauss-Seidel. 4 4 -2 -1 -8 1 1 1 5 x1 x2 x3 = 7 -21 15
175
14 15 16 17 18 19 20
Note que Gauss-Seidel requiere de 7 iteraciones mientras Jacobi de 11, para convergir. Regresar. Bsqueda de la seccin dorada Al resolver para la raz de slo una ecuacin no lineal, la meta fue la de encontrar la variable x que diera cero en la funcin f(x). La optimizacin de una sola variable tiene como meta encontrar el valor de x que generar un extremo, ya sea un mximo o un mnimo de f(x). La bsqueda de la seccin dorada es una tcnica simple de bsqueda de una sola variable de propsito general. Es similar en esencia al enfoque de la biseccin para localizar races La clave para hacer eficiente este procedimiento es la mejor eleccin de los puntos intermedios. Esta meta se puede alcanzar al especificar que las siguientes dos condiciones se cumplan.
la cual se puede resolver para la raz positiva Algoritmo 1.- Dados dos puntos iniciales xl y xu, tales que xu > xl y exista un mximo. 176
2.- Se escogen dos puntos interiores x1 y x2 de acuerdo con la razn dorada, d = R(xu xl) x1 = xl + d x2 = xu - d 3.- La funcin se evala en los puntos interiores es decir x1, x2, xu, y xl Si f(x1) es mayor que f(x2) entonces hacemos xl = x2; Si no xu = x1;
4.- Repetir los pasos 2 y 3 hasta convergencia. Ejemplo Use la bsqueda de la seccin dorada para encontrar el mximo de la funcin f(x) = 2seno(x) x2/10 en el intervalo [0,4].
i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 xL 0.0000 0.0000 0.9443 0.9443 1.3050 1.3050 1.3050 1.3901 1.3901 1.3901 1.4102 1.4226 1.4226 1.4226 1.4256 1.4256 1.4267 1.4267 fL 0.0000 0.0000 1.5310 1.5310 1.7595 1.7595 1.7595 1.7742 1.7742 1.7742 1.7754 1.7757 1.7757 1.7757 1.7757 1.7757 1.7757 1.7757 x2 1.5279 0.9443 1.5279 1.3050 1.5279 1.4427 1.3901 1.4427 1.4226 1.4102 1.4226 1.4303 1.4274 1.4256 1.4274 1.4267 1.4274 1.4271 f2 1.7647 1.5310 1.7647 1.7595 1.7647 1.7755 1.7742 1.7755 1.7757 1.7754 1.7757 1.7757 1.7757 1.7757 1.7757 1.7757 1.7757 1.7757 x1 2.4721 1.5279 1.8885 1.5279 1.6656 1.5279 1.4427 1.4752 1.4427 1.4226 1.4303 1.4350 1.4303 1.4274 1.4285 1.4274 1.4278 1.4274 f1 0.6300 1.7647 1.5432 1.7647 1.7136 1.7647 1.7755 1.7732 1.7755 1.7757 1.7757 1.7757 1.7757 1.7757 1.7757 1.7757 1.7757 1.7757 xU 4.0000 2.4721 2.4721 1.8885 1.8885 1.6656 1.5279 1.5279 1.4752 1.4427 1.4427 1.4427 1.4350 1.4303 1.4303 1.4285 1.4285 1.4278 fU -3.1136 0.6300 0.6300 1.5432 1.5432 1.7136 1.7647 1.7647 1.7732 1.7755 1.7755 1.7755 1.7757 1.7757 1.7757 1.7757 1.7757 1.7757 d 2.4721 1.5279 0.9443 0.5836 0.3607 0.2229 0.1378 0.0851 0.0526 0.0325 0.0201 0.0124 0.0077 0.0047 0.0029 0.0018 0.0011 0.0007
177
xU = 4.0; System.out.println("i" + "\t" + "xL" + "\t" + "fL" + "\t" + "x2" + "\t" + "f2" + "\t" + "x1" + "\t" + "f1" + "\t" + "xU" + "\t" + "fU" + "\t" + "d"); do { d = R*(xU - xL); x1 = xL + d; x2 = xU - d; fU fL f1 f2 = = = = funcion(xU); funcion(xL); funcion(x1); funcion(x2);
System.out.println(i++ + "\t" + xL + "\t" + fL + "\t" + x2 + "\t" + f2 + "\t" + x1 + "\t" + f1 + "\t" + xU + "\t" + fU + "\t" + d); if(f1 > f2) xL = x2; else xU = x1;
Regresar. Interpolacin cuadrtica La interpolacin cuadrtica tiene la ventaja del hecho que un polinomio de segundo orden con frecuencia proporciona una buena aproximacin a la forma de f(x) cercana un ptimo. Este mtodo al igual que el de Muller hacen una aproximacin cuadrtica de un polinomio, as f(x) = Ax2 + Bx + C. Para esta funcin el mnimo o mximo se localiza en
Se puede mostrar que despus de un manejo algebraico el valor de x3 que maximiza la ecuacin es:
178
Algoritmo 1.- Dados tres puntos x0, x1 y x2 dentro de los cuales existe un mximo y x0 < x1 < x2 2.- Calculamos la aproximacin cuadrtica y su mximo x3 utilizando la ecuacin anterior. 3.- Si x0 < x3 < x1, los nuevos puntos de bsqueda son x0, x3 y x1, si no el intervalo de bsqueda es x1, x3 y x2 4.- Se repiten los pasos hasta que la diferencia entre x0 y x2 sea pequea. Ejemplo Use la bsqueda de la seccin dorada para encontrar el mximo de la funcin f(x) = 2seno(x) x2/10 con los valores iniciales x0 = 0, x1 = 1 y x2 = 4.
i 0 1 2 3 4 5 x0 0.0000 1.0000 1.0000 1.0000 1.4256 1.4266 f0 0.0000 1.5829 1.5829 1.5829 1.7757 1.7757 x1 1.0000 1.5055 1.4903 1.4256 1.4266 1.4275 f1 1.5829 1.7691 1.7714 1.7757 1.7757 1.7757 x2 4.0000 4.0000 1.5055 1.4903 1.4903 1.4903 f2 -3.1136 -3.1136 1.7691 1.7714 1.7714 1.7714 x3 1.5055 1.4903 1.4256 1.4266 1.4275 1.4276 f3 1.7691 1.7714 1.7757 1.7757 1.7757 1.7757
Implementacin en Java
void Interpolacion_Cuadratica() { double x0, x1, x2, x3; double f0, f1, f2, num, den; int i = 0; x0 = 0; x1 = 1; x2 = 4; System.out.println("i" + "\t" + "x0" + "\t" + "f0" + "\t" + "x1" + "\t" + "f1" + "\t" + "x2" + "\t" + "f2" + "\t" + "x3" + "\t" + "f3"); do { f0 = funcion(x0); f1 = funcion(x1); f2 = funcion(x2); den = f0*(x1*x1 - x2*x2) + f1*(x2*x2 - x0*x0) + f2*(x0*x0 - x1*x1); num = f0*(x1 - x2) + f1*(x2 - x0) + f2*(x0 - x1); x3 = den/(2.0*num);
179
"\t" + x2 + "\t" + f2 + "\t" + x3 + "\t" + funcion(x3) ); if(x0 <= x3 && x3 <= x1) { x2 = x1; x1 = x3; } else { x0 = x1; x1 = x3; } }while(x3-x0 >= 0.0001); }
Regresar. Mtodo de Newton El objetivo de este mtodo es calcular el mximo o mnimo de una funcin, haciendo uso de una aproximacin cuadrtica dada por la serie de Taylor. Dicha aproximacin cuadrtica es:
El mximo o mnimo de la funcin q(x) lo calculamos haciendo q(x) = 0. Haciendo esto obtenemos
Note que la ecuacin resultante es muy similar a la utilizada en el mtodo de Newton Raphson si la funcin f(x) es sustituida por f(x). Algoritmo 1.- Dado un valor inicial x0 y una funcin cuyas primera y segunda derivada existan 2.- Calculamos la i-sima aproximacin utilizando la formula
3.- Repetimos el paso dos hasta convergencia. Ejemplo Use el mtodo de Newton para encontrar el mximo de la funcin f(x) = 2seno(x) x2/10 con el valor inicial x0 =2.5.
i x0 x1
180
1 2 3 4
Implementacin en Java
void Newton() { double x0 = 2.5, x; int i; System.out.println("i" + "\t" + "x0" + "\t" + "x1"); for(i=1; i<1000; i++) { x = x0 - Df(x0)/DDf(x0); System.out.println(i + "\t" + x0 + "\t" + x); if(Math.abs(x-x0) <= 0.0001) break; else x0 = x; } } double Df(double x) { return 2.0*Math.cos(x) - 2.0*x/10.0; } double DDf(double x) { return -2.0*Math.sin(x) - 2.0/10.0; }
Regresar.
181
Ejemplo
Encontrar el mximo de la funcin f(x,y) = y x 2x2 - 2xy - y2 en el dominio acotado x [2, 2] y y [1, 3].
k 0 1 2 3 4 5 6 7 8 9 167 183 465 524 626 999 x 0.00000 -0.84276 -0.84276 -0.84276 -0.84276 -0.84276 -0.84276 -0.84276 -0.84276 -0.84276 -0.92622 -1.11212 -1.04210 -0.96660 -0.97539 -0.97539 y 0.00000 1.19252 1.19252 1.19252 1.19252 1.19252 1.19252 1.19252 1.19252 1.19252 1.28268 1.49897 1.66243 1.36514 1.48462 1.48462 f(x,y) 0.00000 1.20270 1.20270 1.20270 1.20270 1.20270 1.20270 1.20270 1.20270 1.20270 1.22395 1.22463 1.23375 1.23859 1.24931 1.24931
Implementacin en Java
void Busqueda_Aleatoria() { int i; double r, x, y, max = 0, maxx = 0, maxy = 0, fx; double xl = -2, xu = 2, yl = 1, yu = 3; Random azar = new Random();
fx = f(x,y); if(fx > max) { max = fx; maxx = x; maxy = y; } System.out.println(i + "\t " +maxx + "\t " + maxy + "\t " + max ); } }
182
Mtodos basados en gradiente Como su nombre lo indica, son mtodos para calcular el ptimo de una funcin, basados en la informacin del gradiente. El gradiente. Dada una funcin en dos dimensiones f(x,y), las derivada direccional, se define como
donde es la direccin sobre la cual se quiere calcular la derivada y u es un vector unitario con la informacin de la direccin de . Podemos escribir la derivada direccional como
El gradiente se define como el vector de derivadas en la direcciones de x y y donde el cambio es mximo. La expresin de este esta dado por
donde i y j representan los vectores unitarios en la direcciones de x y y. Utilizando la notacin vectorial podemos representar al gradiente como
Ejemplo 1
183
Dada la funcin f(x,y) = x2 +2x + 3y2, determinar el mnimo de la funcin y la direccin hacia donde se encuentra el mnimo en el punto de coordenadas [2,2].
Si calculamos la derivada tenemos e igualamos a cero fx = 2x+2 = 0 fy = 6y = 0 Note que el mnimo se localiza en el punto [0,0]. Ahora, si valuamos el gradiente en el punto [2,2] tenemos que es igual a [6, 12], de manera grfica tenemos.
curvas de nivel 5 4 3 2 1 y e j e 0 -1 -2 -3 -4 -5 -5
0 eje x
184
Note como del punto [2,2] puedo acercarme al mnimo, siguiendo la direccin opuesta al gradiente. Demostracin. Dada la definicin de la derivada direccional, podemos ver que esta, se puede escribir como el producto escalar de vectores
Si queremos determinar la direccin en la cual la funcin decrece, calculamos la derivada de F, con respecto a phi.
Note que el mnimo se encuentra cuando el ngulo es de 180 grado, lo cual significa que la funcin decrece en la direccin opuesta al gradiente y el mximo se encuentra en la direccin del gradiente. Mtodo de descenso de gradiente Como hemos visto, el mximo de una funcin se encuentra en la direccin del gradiente, mientras que un mnimo en la direccin opuesta. As podemos plantear una estrategia para alcanzar el mnimo de una funcin utilizando un punto inicial, el valor del gradiente y un tamao de paso con el cual avanzaremos. Algoritmo 1.- Dado una posicin inicial r(0) en un espacio n dimensional y una funcin f(r) 2.- Calculamos el valor del gradiente en 3.- Hacemos la actualizacin utilizando la sucesin 4.- Si la magnitud del gradiente es cercana a cero, terminamos, sino hacemos k = k+1 y regresamos a 2. Implementacin en Java
static public void Descenso_Gradiente() { double r[] = {2,2}; double u[] = new double[2]; double alfa = 0.01;
185
int k = 0; while(gradiente(u, r) > 0.01) { System.out.println(k + " " + r[0] + " " + r[1] + " " + f(r)); gradiente(u, r); r[0] -= alfa*u[0]; r[1] -= alfa*u[1]; k ++; } } public static double f(double r[]) { return r[0]*r[0] +2.0*r[0] + 3.0*r[1]*r[1]; } public static double gradiente(double u[], double r[]) { double mag; u[0] = 2.0*r[0] + 2.0; u[1] = 6.0*r[1]; mag = Math.sqrt(u[0]*u[0] + u[1]*u[1]); u[0] /= mag; u[1] /= mag; return mag; }
Problema para seleccionar el tamao de paso La solucin del ejemplo 1 utilizando un tamao de paso de 0.01 es:
k 0 1 2 3 4 5 6 7 8 9 387 x 2.0000 1.9955 1.9910 1.9866 1.9820 1.9775 1.9730 1.9685 1.9639 1.9594 -0.9879 y 2.0000 1.9911 1.9821 1.9732 1.9643 1.9553 1.9464 1.9375 1.9286 1.9197 0.0000 f(x,y) 20.0000 19.8661 19.7327 19.5998 19.4675 19.3357 19.2044 19.0736 18.9433 18.8135 -0.9999
Podramos suponer que un tamao de paso mas grande har que el algoritmo converja mas rpido, as que para un tamao de paso de 0.5 tenemos
186
k 0 1 2 3 4 5 6 7 8 9 4680
x 2.0000 1.7764 1.5204 1.2209 0.8632 0.4347 -0.0512 -0.5512 -1.0512 -0.5566 -1.0000
y 2.0000 1.5528 1.1233 0.7229 0.3736 0.1159 -0.0019 0.0011 -0.0025 0.0710 -0.1456
f(x,y) 20.0000 13.9418 9.1378 5.5003 2.8902 1.0987 -0.0998 -0.7986 -0.9974 -0.7883 -0.9364
Note que despus de 4680 iteraciones no hemos convergido y que pasa si utilizamos un tamao de paso de 0.005
k 0 1 2 3 4 5 6 7 8 9 775 x 2.0000 1.9978 1.9955 1.9933 1.9910 1.9888 1.9865 1.9843 1.9820 1.9798 -0.9936 y 2.0000 1.9955 1.9911 1.9866 1.9821 1.9777 1.9732 1.9687 1.9643 1.9598 0.0000 f(x,y) 20.0000 19.9330 19.8661 19.7993 19.7327 19.6662 19.5998 19.5336 19.4675 19.4015 -1.0000
Note que la convergencia es ms lenta, pero la precisin obtenida es mejor. La seleccin del tamao del paso es un proceso complicado donde este valor quedar sujeto a las caractersticas del problema y no existe regla general para seleccionarlo. Hessiano Cuando calculamos el gradiente de una funcin e igualamos este a cero, estamos calculando un punto que puede ser mximo o mnimo. Una manera de saber si estamos en un mximo o un mnimo es hacer una evaluacin sobre la segunda derivada. As estaremos en un mnimo si la segunda derivada es positiva y en un mximo si la segunda derivada es negativa. En el caso de funciones de varias variables, dado que se tiene una funcin que depende de varias variables, es comn representarla en una matriz de segundas derivadas a las que se les denomina Hessiano. El Hessiano de una matriz de dos variables se define como: 187
En este caso tendremos un mnimo local si el determinante de H es positivo o un mximo local si el determinante es negativo. Ejemplo 2 Determinar para el ejemplo 1, si se trata de un mnimo o un mximo. Calculamos la matriz de segundas derivadas y las evaluamos en cero
Note que el determinante es positivo, lo cual indica que en la posicin [0,0] se tiene un mnimo. El mtodo de Newton El mtodo de Newton esta basado en la minimizacin de una funcin cuadrtica. Esta funcin cuadrtica es calculada a partir de la serie de Taylor
donde
Despejando tenemos, que el mnimo de la aproximacin cuadrtica lo obtenemos resolviendo el siguiente sistema lineal de ecuaciones.
Algoritmo 1. Dado una funcin y un punto inicial X(0) 2. Determinamos el Gradiente de la funcin g(X(k)) 188
3. Calculamos el valor del Hessiano de la funcin H(X(k)) 4. Resolvemos el sistema de ecuaciones H(X(k))dx= g(X(k)) 5. Actualizamos el valor de X(k+1) = X(k) dx 6. Si la magnitud del gradiente es pequea terminamos, si no hacemos k = k+1 y regresamos a 2. Ejemplo Dada la funcin f(x,y) = x2 +2x + 3y2, determinar el mnimo de la funcin dado el punto inicial X(0) = [2,2]. El gradiente de la funcin es
El Hessiano es
La solucin del sistema es dx = 3 y dy = 2, con lo cual, los nuevos valores son x=1 y y = 0. Note que solo fue necesaria una iteracin, esto se debe a que la aproximacin cuadrtica es exacta. Ejemplo Dada la funcin f(x,y) = 100(x2-y)2 +(1-x)2 determinar el mnimo dado como valor inicial X(0) = [10, 10] El gradiente de la funcin es
189
El sistema de ecuaciones que debemos resolver es 1200x2 400y + 2.0 -400x Primera iteracin En nuestra primera iteracin resolvemos el sistema de ecuaciones 116002.0 -4000.0 -4000.0 200 dx dy = 360018.0 -18000.0 -400x 200
Las actualizaciones son x = 9.999500027776234 y y = 99.99000055552469 Segunda iteracin Resolvemos el sistema de ecuaciones 79994.0007 -3999.8000 -3999.8000 200 dx dy = 17.9999 -4.9994E-5
Las actualizaciones son x = 1.0004 y y = -79.9820 Tercera iteracin Resolvemos el sistema de ecuaciones 33195.8812 -400.1799 -400.1799 200 dx dy = 32407.7359 -16196.5806
190
191
El ejemplo ms simple de una aproximacin por mnimos cuadrados es mediante el ajuste de un conjunto de pares de observaciones: (x1, y1), (x2, y2), (x3, y3),..., (xn, yn ) a una lnea recta. La expresin matemtica de la lnea recta es: y = a0 + a1x + e donde a0 y a1, son los coeficientes que representan el cruce con el eje y y la pendiente de la lnea y e representa el error de nuestra aproximacin.
6
eje y
4 eje x
Una estrategia, para ajustar a la mejor lnea, es minimizar la suma al cuadrado de los errores para todos los datos disponibles
192
y en general
En forma compacta tenemos que e = y Ma, donde M es la matriz de coordenadas en x y a el vector de parmetros. Ajuste por mnimos cuadrados Si queremos encontrar el vector de parmetros a que minimiza nuestra suma de cuadrados, tenemos que calcular la derivada de la funcin de error respecto al vector de parmetros e igualar a cero.
El valor del vector de parmetros a los calculamos resolviendo el siguiente sistema de ecuaciones
[MTM]a = MTy
Es comn encontrar la solucin de este sistema como:
Ejemplo
Hacer el ajuste a una lnea recta de los siguientes valores
193
eje y
4 eje x
Regresin polinomial
Podemos generalizar el caso de la regresin lineal y extenderla a cualquier polinomio de orden m. [MTM]a = MTy
194
Note que cada uno de los elementos de la matriz MTM son una sumatoria de todos los valores de x elevado a un exponente que resulta ser la suma del rengln y la columna donde se localiza. Adicionalmente la matriz es simtrica.
Ejemplo
Ajustar a un polinomio de segundo orden los datos en la siguiente tabla.
x 0.00 1.00 2.00 3.00 y 2.10 7.70 13.60 27.20
195
4.00 5.00
40.90 61.10
El ajuste da como resultado el polinomio p(x) = 2.4785 + 2.3592x + 1.8607x2. En la siguiente figura se muestra la aproximacin a un polinomio de segundo orden.
Aproximacin de segundo orden 70
60
50
40 eje y 30 20 10 0 0
0.5
1.5
2.5 eje x
3.5
4.5
Implementacin en Java
public class ej034 { public static void main(String[] args) { double x[] = {0, 1, 2, 3, 4, 5}; double y[] = {2.1, 7.7, 13.6, 27.2, 40.9, 61.1}; double a[] = Regresion(x, y, 2); for(int i=0; i<a.length; i++) System.out.println("a["+i+"] = "+ a[i]); grafica(x, y, a); } public static double [] Regresion(double x[], double y[], int orden) { int i, j, n = orden +1; double a[] = new double[n]; double MM[][] = new double [n][n]; double My[] = new double[n];
196
for(i=0; i<n; i++) { for (j = 0; j <= i; j++) { MM[i][j] = sumas(x, i + j); MM[j][i] = MM[i][j]; } My[i] = sumas(x, y, i); } imprime(MM, My); slineal.Solucion(MM, a, My); return a; } static public void grafica(double x[], double y[], double a[]) { int i, j, n = x.length, m = a.length; double yc[] = new double[n]; for(i=0; i<n; i++) { yc[i] =0; for(j=0; j<m; j++) yc[i] += a[j] * eleva(x[i], j); } grafica g = new grafica("salida"); g.Datos(x, y); g.Datos(x, yc); g.show(); } static public void imprime(double A[][], double b[]) { int n = b.length; int i, j; for(i=0; i<n; i++) { for (j = 0; j < n; j++) System.out.print(A[i][j] + "\t"); System.out.println("\t" + "a["+i+"] \t" + b[i]); } } public static double sumas(double x[], int exp) { double suma = 0; int n = x.length; for(int k=0; k<n; k++) suma += eleva(x[k], exp); return suma; } public static double sumas(double x[], double y[], int exp)
197
{ double suma = 0; int n = x.length; for(int k=0; k<n; k++) suma += eleva(x[k], exp)*y[k]; return suma; } public static double eleva(double x, int exp) { double resul = 1; for(int i=1; i<=exp; i++) resul *= x; return resul; } }
Regresar.
198