Sei sulla pagina 1di 90

APUNTES DE MTODOS NUMRICOS I

Ing. Arturo J. Lpez Garca

2009

Contenido
pgina 1. Errores 1.1 Sistemas numricos de punto flotante 1.2 Sistemas de punto flotante de computadoras reales 1.3 Algoritmos estables e inestables 5 5 7 14

2. Solucin de ecuaciones no lineales 2.1 Mtodo iterativo de punto fijo 2.2 Aceleracin de la convergencia 2.3 Mtodo de Newton-Raphson 2.4 Mtodo de la secante 2.5 Mtodo de la biseccin 2.6 Orden de convergencia

15 15 20 22 24 27 31

3. Solucin de sistemas de ecuaciones lineales 3.1 Eliminacin de Gauss 3.2 Pivoteo mximo de columna 3.3 Descomposicin LU 3.4 Solucin de sistemas tridiagonales 3.5 Mtodos iterativos: Jacobi y Gauss Seidel

33 34 38 41 50 54

4. Solucin de sistemas de ecuaciones no lineales 4.1 Mtodo de punto fijo multivariable 4.2 Mtodo de Newton Raphson multivariable 4.3 Mtodo de Broyden 4.4 Mtodo del descenso ms brusco

63 63 67 72 80

1. Errores
El resolver problemas numricos mediante una computadora implica la presencia de dos tipos de errores: truncamiento y redondeo. Los errores de truncamiento tienen que ver con el mtodo matemtico empleado en la solucin del problema. Un ejemplo clsico es la aproximacin de la funcin exponencial mediante un polinomio de Taylor. Esta funcin se define con la serie McLaurin:

Dado que no es factible calcular un nmero infinito de sumandos, es necesario entonces aproximar ex a travs de un polinomio de un grado conocido. En una decisin de este tipo se introduce un error de truncamiento, el cual siempre es una funcin exclusiva del mtodo empleado. Por ejemplo, si el polinomio de Taylor es de tercer grado

entonces el error de truncamiento estar dado por la suma de todos los trminos no incluidos en la aproximacin. Los errores de redondeo aparecen al ejecutar operaciones aritmticas con una computadora. Dado que los valores numricos no pueden ser representados en la memoria de una computadora con un nmero infinito de cifras, los errores de redondeo son inevitables. Para poder entender como se generan y se propagan este tipo de errores es necesario conocer la manera en que los valores numricos son representados dentro de una computadora, es decir, su sistema numrico de punto flotante.

1.1 Sistemas numricos de punto flotante Dentro de la memoria de una computadora los valores numricos son representados mediante aproximaciones conocidas como de punto flotante (floating point). La forma general de este tipo de representaciones es: . d1d2d3 ....... dp * Be en la cual los p dgitos d1d2d3 ....... dp son la mantisa del nmero, B la base y e el exponente. Si d10 entonces se trata de una representacin normalizada. Cuando la base es binaria (B = 2) y la representacin normalizada, entonces d1 siempre ser un 1 y frecuentemente no se ocupa un bit 5

para almacenarlo (bit escondido). El nmero de dgitos p de la mantisa es conocido como precisin. Suponiendo una base B = 10 y una precisin de cinco dgitos (p = 5), los siguientes son ejemplos de notacin normalizada:

Nmero

Representacin normalizada de punto flotante .27390X102 -.12400X10-3 .37029X106 .31416X101 .66667X100

27.39 -.000124 370285 3.141592 .66666667

Supngase un sistema normalizado muy simplificado con base binaria, bit escondido, una precisin p de dos dgitos y un exponente e tal que -2 # e # 3. En este sistema los nmeros posibles son: .102 * 2-2 = 1/8 .102 * 2-1 = 1/4 .102 * 20 = 1/2 .102 * 21 = 1 .102 * 22 = 2 .102 * 23 = 4 .112 * 2-2 = 3/16 .112 * 2-1 = 3/8 .112 * 20 = 3/4 .112 * 20 = 3/2 .112 * 22 = 3 .112 * 23 = 6

El cero (0) tambin se incluye en el sistema no obstante que por definicin es una cantidad no normalizada. Considere la siguiente grfica que muestra los valores positivos arriba mostrados

Este sistema simplificado se puede utilizar para obtener algunas conclusiones vlidas para cualquier sistema de punto flotante: 1.- El nmero de valores que pueden ser representados es finito. 2.- La existencia de huecos y discontinuidades. Por ejemplo, en nuestro sistema simplificado, el valor 0.90 no tiene una representacin exacta por lo que ser aproximado por el nmero ms cercano; 1.0. 3.- Los nmeros de punto flotante no estn uniformemente espaciados. La distancia entre nmeros es ms pequea cerca del cero y ms grande cerca del mayor valor posible. La distancia entre 1.0 y el siguiente valor mayor que 1.0 se conoce como el psilon del sistema de punto flotante y es una medida de la exactitud del mismo. Para el sistema simplificado del ejemplo de arriba, psilon es igual a . En un sistema de punto flotante es posible que se generen algunos errores al tratar de representar ciertas cantidades. Sean N es el valor por representar, Nmax el nmero positivo ms grande y Nmin el nmero positivo ms pequeo entonces la tabla mostrada a continuacin muestra esos errores.

Condicin N > Nmax N < -Nmax 0 < N < Nmin -Nmin < N < 0

Error Desbordamiento positivo (positive overflow) Desbordamiento negativo (negative underflow) Subdesbordamiento positivo (positive underflow) Subdesbordamiento negativo (negative underflow)

Para el sistema simplificado del ejemplo; Nmax = 6 y Nmin = 1/8.

1.2 Sistemas de punto flotante de computadoras reales

Antes de 1985 cada fabricante de computadoras diseaba sus propios sistemas de punto flotante. Esta situacin tena el inconveniente de que potencialmente un mismo programa pidiera generar resultados diferentes en distintas arquitecturas. Para evitar esta situacin, el Instituto de Ingenieros Electricistas y Electrnicos, cuyas siglas en ingls son IEEE, defini un estndar para representaciones de punto flotante y resultados computacionales conocido como IEEE Std 7541985. A partir de 1985 los fabricantes de computadoras estn obligados a cumplir por lo menos con las disposiciones de este estndar asegurando entonces la consistencia de los programas. Las representaciones de punto flotante de simple y doble precisin segn IEEE Std 754-1985 son: precisin simple longitud de palabra de 32 bits mantisa de 24 dgitos (23 ms un dgito escondido) exponente de 8 bits signo de 1 bit nmero positivo ms grande: 1.701X1038 nmero positivo ms pequeo: 1.1755X10-38 precisin en dgitos decimales: 7 exponente 3130 precisin doble longitud de palabra de 64 bits mantisa de 53 bits (52 ms un dgito escondido) exponente de 11 bits signo de 1 bit nmero positivo ms grande: 8.988X10307 nmero positivo ms pequeo: 2.225X10-308 precisin en dgitos decimales:16 exponente 63 mantisa 5251 mantisa 2322

En ambos casos la base es binaria (B = 2). No es necesario usar en bit adicional para el signo del exponente ya que a este se le agrega una constante conocida como valor de sesgo. Por lo tanto el valor real del exponente ser el representado menos el valor de sesgo. En precisin simple el valor de sesgo es 127 y en precisin doble es 1023 . La representacin de resultados computacionales es:

0.0 000.... Inf ( 4) 111.... 111 000.... 000 000 000.... 000

NaN (Not a Number: resultado de una operacin numrica invlida) 111.... 111 diferente de 0

Como referencia, una tabla con el resumen de distintos sistemas numricos de punto flotante.
Sistema Longitud total, en bits Bits en la mantisa Bits en el exponente Base Exponente mximo Exponente mnimo Nmero positivo ms grande Nmero positivo ms pequeo Precisin, en dgitos decimales

IEEE SP IEEE DP Cray SP Cray DP VAX SP VAX DP-1 VAX DP-2 IBM SP IBM DP HP 49G Voyage 200

32 64 64 128 32 64 64 32 64 16 18

23* 52* 48 96 23 55 52 24 56 12 14

8 11 14 14 8 8 11 7 7 3 3

2 2 2 2 2 2 2 16 16 10 10

127 1023 8190 8189 127 127 1023 63 63 499 999

-126 -1022 -8189 -8188 -127 -127 -1023 -64 -64 -499 -999

1.701E38 8.988E307 .273E2466 .273E2466 1.701E38 1.701E38 8.988E307 7.237E75 7.237E75 9.999E499 9.999E999

1.1755E-38 2.225E-308 .367E-2465 .367E-2465 5.877E-39 5.877E-39 1.123E-308 8.636E-78 8.636E-78 9.999E-499 9.999E-999

7 16 15 30 7 16 15 7 16 12 14

* ms el dgito escondido Dado que la longitud de palabra de una computadora no es infinita, la representacin de punto flotante implica una aproximacin y por lo tanto un error. Este tipo de error se conoce como de redondeo y est presente siempre que se usa una calculadora o una computadora para realizar clculos aritmticos. Las excepciones a esta regla ocurren cuando el nmero es una potencia entera de la base empleada. Al sumar, restar, multiplicar o dividir aproximaciones de punto flotante se generan errores 9

adicionales. Para mostrar esto, considere los tres siguientes ejercicios en los cuales se supone un sistema de punto flotante de base decimal (B = 10), cuatro dgitos en la mantisa (p = 4) y un exponente e que puede tomar valores en el intervalo -3 # e # 3. Ejercicio Suponga que a = 1/3 y b = 7/5. Calcule los errores absoluto y relativo para las siguientes operaciones: 1.- a + b 2.- b - a 3.- a b 4.- a b Las aproximaciones de punto flotante para a y b son, respectivamente, a* = .3333X100 y b* = .1400X101. 1.- Para sumar o restar dos aproximaciones de punto flotante es necesario que ambas tengan el miso exponente. Para determinar a* + b* , al segundo operando se le aplica un corrimiento de un dgito en la mantisa asegurando as que las dos representaciones tengan momentneamente el mismo exponente: .3333X100 + 1.4000 X100 ---------------1.7333X100 El resultado se expresa tambin como una representacin de punto flotante .1733X101 error absoluto = | valor exacto - valor aproximado | = | 26/15 - .1733X101| = | 26/15 - 1733/1000| error absoluto = |1/3000| = 1/3000 | .00033 error relativo = error absoluto/| valor exacto| = (1/3000)/|(26/15)| = 1/5200 .00019 2.- En el clculo de b* - a* ahora el corrimiento es aplicado al sustraendo a*: .1400 X101 .0333 X101 -------------.1067 X101

error absoluto = | 16/15 - 1067/1000 | = 1/3000 .00033 error relativo = (1/3000)/| (16/15)| = 1/3200 .00031 10

3.- En el producto de aproximaciones de punto flotante las mantisas se multiplican y los exponentes se suman .3333X100 .1400X101 ---------------------0000 0000 13332 3333 ----------------------04666200X101 En este caso el resultado es expresado com .4666X100. error absoluto = | 7/15 - 4666/10000 | = 1/15000 .00007 error relativo = (1/150000)/|(7/15)| = 1/7000 .00014 4.- En b* a* las mantisas se dividen y los exponentes se restan: .42004 X101 ---------------------.3333X100 | .140000000X101 13332 --------6680 6666 -----14000 13332 -------668

El resultado es la aproximacin .4200X101. error absoluto = | 21/5 - 4200/1000 | = 0 error relativo = 0/|(21/5)| = 0 Ejercicio 11

Considere u = 3785.7 y v=3785.3. Determine los errores absoluto y relativo correspondientes a la operacin u - v. Las aproximaciones de punto flotante son: u* = .3786X104 v* = .3785X104 .3786X104 .3785X104 ------------.0001X104

La sustraccin de dos nmeros casi iguales implica una prdida de dgitos significativos. error absoluto = | .4 - .0001X104 | = | .4 - 1 | = | 4/10 - 10/10 | = 6/10 = .6000 error relativo = (6/10) / |(4/10)| = 3/2 = 1.5 Al restar dos cantidades casi iguales se obtienen errores absolutos y relativos grandes. Ejercicio Considere u = 27.14 y v = .000006 . Determine los errores absoluto y relativo que resultan de la operacin uv. Las aproximaciones de punto flotante son: u* = .2714X102 v* = .6000X10-5 .45233X107 ----------------------------.6000X10-5 | .27140000X102 24000 ---------31400 30000 ----------14000 12000 ----------20000 18000 ----------20000 12

18000 --------2000 El resultado es la aproximacin .4523X107. El valor exacto de u v es u v = (2714/100) / (6/1000000) = 13570000/3 Por lo tanto los errores absoluto y relativo quedan error absoluto = | 13570000/3 - 4523000 | = 1000/3 333.33333 error relativo = (1000/3) / | 13570000/3 | = 1/13570 .00007 El dividir entre nmeros muy pequeos implica errores absolutos grandes con errores relativos pequeos.

1.3 Algoritmos estables e inestables Suponga que un error e es introducido en algn paso de un algoritmo y que el error despus de n operaciones subsecuentes es En. Si | En | . C n e donde C es una constante independiente de n, se dice que el crecimiento de error es lineal y que al algoritmo es estable. Si | En | . kn e para alguna constante k > 1, se dice que el crecimiento de error es exponencial y que al algoritmo es inestable. La siguiente grfica muestra ambos crecimiento de errores

13

14

2. Solucin de ecuaciones no lineales


Se trata de encontrar un valor x que cumple la igualdad f(x) = 0. Este valor se conoce como un cero o una raz de f(x).

2.1 Mtodo iterativo de punto fijo Dada una funcin g(x) , un valor x tal que x = g(x) es llamado un punto fijo de g. Una ecuacin no lineal f(x) = 0 puede ser transformada mediante operaciones algebraicas en una funcin x = g(x) de tal manera que un punto fijo de g(x) sea tambin una raz de f(x). Por ejemplo, considere a f(x) = x2 - x -2 = 0; cualquiera de las posibilidades

es una funcin cuyo punto fijo es una solucin de f(x) = 0. El primer paso de un procedimiento que puede encontrar un punto fijo de g(x) consiste en proponer una estimacin inicial x(0) , evaluar g(x) en x(0) para obtener una nueva aproximacin x(1), es decir, x(1) = g(x(0)). La siguiente aproximacin se calcula mediante x(2) = g(x(1)) y de esta forma se van generando aproximaciones x(3), x(4), x(5), x(6), .... . El proceso definido por x(k+1) = g(x(k)) se da por terminado cuando se cumple alguno de los siguientes criterios de convergencia para las dos ltimas iteraciones: 1.- *x(k+1) - x(k) * < 2.- *x(k+1) - x(k) * / *x(k+1)* < 3.- f(*x(k+1)*) < y entonces se considera que x(k+1) es un punto fijo aproximado de g(x) y se dice que el proceso alcanz la convergencia. La tolerancia es fijada antes de iniciar el clculo de las iteraciones. Este procedimiento es conocido como el mtodo de punto fijo o de iteracin funcional. 15

Geomtricamente un punto fijo de g(x) es la interseccin de la recta y = x con la curva y = g(x). La siguiente figura muestra las grficas de las cuatro funciones g(x) indicadas arriba y el comportamiento del mtodo de punto fijo para cada una de ellas.

Ejemplo Encuentre una raz aproximada de f(x) = x2 - x - 2 = 0 con el mtodo de punto fijo. Use las funciones g(x) descritas anteriormente. En todos los casos, inicie con x(0) = 1.5 y considere un criterio de convergencia *x(k+1) - x(k) * < 1X10-4 con un mximo de 20 iteraciones. g(x) = x2 - 2 Iteracin k 0 1 2 x(k) 1.50000 0.25000 -1.93750 1.25000 2.18750 *x(k) - x(k-1) *

16

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 g(x) = %(x + 2) Iteracin k 0 1 2 3 4

1.75391 1.07619 -0.84182 -1.29134 -0.33245 -1.88948 1.57013 .46530 -1.78350 1.18087 -0.60555 -1.63331 .66770 -1.55417 0.41545 -1.82740 1.33939 -0.20603

3.69141 0.67772 1.91801 0.44952 0.95889 1.55703 3.45960 1.10483 2.24880 2.96437 1.78642 1.02776 2.30101 2.22188 1.96962 2.24585 3.16679 1.54542

x(k) 1.50000 1.87083 1.96744 1.99184 1.99796

*x(k) - x(k-1) *

0.37083 0.09661 0.02440 0.00612

17

5 6 7 g(x) = 1 + 2/x Iteracin k 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

1.99949 1.99987 1.99997

0.00153 0.00038 0.00010

x(k) 1.50000 2.33333 1.85714 2.07692 1.96296 2.01887 1.99065 2.00469 1.99766 2.00117 1.99941 2.00029 1.99985 2.00007 1.99996 2.00002

*x(k) - x(k-1) *

0.83333 0.47619 0.21978 0.11396 0.05590 0.02821 0.01404 0.00704 0.00351 0.00176 0.00088 0.00044 0.00022 0.00011 0.00005

g(x) = (x2 +2)/(2x -1) Iteracin k 0 1 x(k) 1.50000 2.12500 0.62500 18 *x(k) - x(k-1) *

2 3 4

2.00481 2.00001 2.00000

0.12019 0.00480 7.68X10-6

La condicin suficiente pero no necesaria que garantiza la convergencia del mtodo de punto fijo est dada por el teorema: Si g(x) y gN(x) son continuas en un intervalo alrededor de un punto fijo x de la ecuacin x = g(x), y si *gN(x)* < 1 para toda x en el intervalo, entonces x(k+1) = g(x(k)) , k = 0, 1, 2, ..., converge en el punto fijo x = x en el supuesto de que x(0) se escoja en el intervalo. A continuacin, un pseudocdigo de un procedimiento que encuentra un punto fijo de x = g(x)1 proc punto_fijo(real func g, real &xinicial, real eps, entero maxiter, real &x, lgico &convergencia) ! ! Este procedimiento encuentra una aproximacin a la solucin del problema x = g(x) ! con el mtodo iterativo de punto fijo. ! Descripcin de parmetros: ! g Funcin externa que evala a la funcin g(x) . ! xinicial Estimacin inicial. ! eps Mximo error permisible. Cuando el valor absoluto de la diferencia de las ! dos ltimas iteraciones es menor que eps, se considera haber llegado a la ! solucin. ! maxiter Nmero mximo de iteraciones. ! x ltima iteracin calculada. Si en convergencia se devuelve el valor ! VERDADERO, entonces x tambin es el punto fijo buscado. ! convergencia Bandera cuyo valor indica si hubo convergencia: ! convergencia=VERDADERO se alcanz la convergencia ! convergencia=FALSO no se alcanz la convergencia. ! entero iter convergencia=VERDADERO ejecuta iter = 1, maxiter {

El lenguaje de pseudocdigo empleado est basado en el propuesto por Guillermo Levine G., en su libro Computacin y Programacin Moderna, Pearson Educacin, Mxico2001. 19

x = g(xinicial) ! clculo de una nueva iteracin si ABS(x - xinicial) < eps entonces regresa ! se checa la convergencia xinicial = x ! preparacin de la siguiente iteracin } convergencia = FALSO regresa fin

2.2 Aceleracin de la convergencia El mtodo de punto fijo cuando converge, generalmente lo hace en forma muy lenta. Para acelerar su convergencia se pueden aplicar varias tcnicas, una de las ms usadas es la aceleracin de Aitken: las dos primeras iteraciones x(1) y x(2) se calculan con el mtodo de punto fijo mientras que la tercera se obtiene aplicando la frmula:

Las iteraciones x(4) y x(5) se calculan nuevamente con punto fijo y x(6) se determina con la frmula de Aitken pero aplicada a x(3) , x(4) y x(5) . Es de esperarse que al aplicar la aceleracin de Aitken cada tres iteraciones, el problema converja en un menor nmero de iteraciones. Este tcnica de Aitken puede aplicarse a cualquier proceso iterativo donde los errores decrezcan proporcionalmente, no slo a la iteracin de punto fijo. Ejemplo Obtenga un punto fijo aproximado de g(x) = 1 + 2/x. Inicie con x(0) = 1.5 y termine cuando el error absoluto de las ltimas dos iteraciones sea menor que 1X10-4 . Considere un nmero mximo de iteraciones igual a 20.

Iteracin k 0 1 2 3

x(k) 1.50000 2.33333 1.85714 2.03030

*x(k) - x(k-1) *

0.83333 0.47619 0.17316

20

4 5 6 7 8

1.98507 2.00752 2.00000 1.99996 2.00002

0.04523 0.02244 0.00744 0.00011 0.00006

Un pseudocdigo de un procedimiento que encuentra un punto fijo de g(x) con punto fijo y aceleracin de Aitken es: proc Aitken(real func g, real &xinicial, real eps, entero maxiter, real &x, lgico &convergencia) ! ! Este procedimiento encuentra una aproximacin a la solucin del problema x = g(x) ! empleando el mtodo iterativo de punto fijo con aceleracin de Aitken. ! Descripcin de parmetros: ! g Funcin externa que evala a la funcin g(x) . ! xinicial Estimacin inicial. ! eps Mximo error permisible. Cuando el valor absoluto de la diferencia de las ! dos ltimas iteraciones es menor que eps, se considera haber llegado a la ! solucin. ! maxiter Nmero mximo de iteraciones. ! x ltima iteracin calculada. Si en convergencia se devuelve el valor ! VERDADERO, entonces x tambin es el punto fijo buscado. ! convergencia Bandera cuyo valor indica si hubo convergencia: ! convergencia=VERDADERO se alcanz la convergencia ! convergencia=FALSO no se alcanz la convergencia. ! entero iter real x1, x2 convergencia=VERDADERO x1 = g(xinicial) ! clculo de las dos primeras iteraciones x1 y x2 con punto fijo si ABS(x1 - xinicial) < eps entonces regresa x2 = g(x1) si ABS(x2 - x1) < eps entonces regresa ejecuta iter = 3, maxiter { ! ! se aplica la aceleracin de Aitken cada tres iteraciones ! si MOD(iter, 3) = 0 entonces 21

x = xinicial- (xinicial - x1)82 / (x2 - 2*x1+ xinicial) otro

! Aitken

x= g(x2) ! punto fijo si ABS(x - x2) < eps entonces regresa ! se checa la convergencia xinicial = x1 ! preparacin de la siguiente iteracin x1 = x2 x2 = x } convergencia = FALSO regresa fin

2.3 Mtodo de Newton-Raphson Si f(x) es un funcin continua y diferenciable n veces en un intervalo y si f(n+1) existe en ese mismo intervalo , entonces el valor de la funcin f(x) alrededor de un punto x0 est dado por f(x) = f(x0) + fN( x0)(x - x0) + fNN(x0)(x - x0)2/2! + fNNN(x0)(x - x0)3/3! + ....... + f(n)(x0) (x - x0)n/n! + Rn donde Rn = f(n+1) ((x)) (x - x0)n+1/(n +1)! Aplicando este resultado, conocido como teorema de Taylor, a un punto base x0 = x(k) y a x = x(k+1) f(x(k+1)) = f(x(k)) + fN( x(k))(x(k+1) - x(k)) + fNN(x(k))(x(k+1) - x(k))2/2! + fNNN(x(k))(x(k+1) - x(k))3/3! + ....... + f(n) (x(k))(x(k+1) - x(k))n/n! + Rn A continuacin se harn dos suposiciones: 1.- x(k+1) . x , por lo que es razonable pensar que f(x(k+1)) .0 2.- x(k+1) y x(k) son valores cercanos, por lo tanto (x(k+1) - x(k))j .0 para j = 2, 3, 4,.... las cuales simplifican a la ltima ecuacin: 0. f(x(k)) + fN( x(k))(x(k+1) - x(k)) y entonces se despeja a x(k+1): x(k+1) = x(k) - f(x(k))/fN( x(k)) 22

Esta ltima ecuacin es el mtodo de Newton-Raphson. Desde el punto de vista geomtrico; x(k+1) es la interseccin del eje horizontal x con la recta tangente a f(x) en (x(k) , f( x(k))).

Ejemplo Encuentre una raz aproximada de f(x) = 3x + sin(x) - ex = 0. Tome como estimacin inicial x(0) = 0 y un criterio de convergencia *x(k+1) - x(k) * < 1X10-4 . f(x) = 3x + sen(x) - ex fN(x) = 3 + cos(x) - ex

Iteracin k 0 1 2 3 4

x(k) 0.00000 0.33333 0.36017 0.36042 0.36042

*x(k) - x(k-1) *

0.33333 0.02684 0.00025 2.24843X10-8

23

Newton Raphson casi siempre converge rpidamente, sin embargo para que funcione en forma adecuada se requiere de una estimacin inicial cercana a la raz. Una propuesta del pseudocdigo de un procedimiento que encuentra una raz aproximada de una funcin f(x) = 0 con Newton Raphson es: proc newton(real func f, real func f_prima, real &xinicial, real eps, entero maxiter, real &x, lgico &convergencia) ! ! Este procedimiento encuentra una aproximacin a una raz de f(x)=0 con el mtodo iterativo ! de Newton-Raphson. ! Descripcin de parmetros: ! f Funcin externa que evala a la funcin f(x) . ! f_prima Funcin externa que evala a la derivada de f(x). ! xinicial Estimacin inicial. ! eps Mximo error permisible. Cuando el valor absoluto de la diferencia de las ! dos ltimas iteraciones es menor que eps, se considera haber llegado a la ! solucin. ! maxiter Nmero mximo de iteraciones. ! x ltima iteracin calculada. Si en convergencia se devuelve el valor ! VERDADERO, entonces x tambin es una raz de f(x). ! convergencia Bandera cuyo valor indica si hubo convergencia: ! convergencia=VERDADERO se alcanz la convergencia ! convergencia=FALSO no se alcanz la convergencia. ! entero iter convergencia=VERDADERO ejecuta iter = 1, maxiter { x = xinicial - f(xinicial)/f_prima(xinicial) ! clculo de una nueva iteracin si ABS(x - xinicial) < eps entonces regresa ! se checa la convergencia xinicial = x ! preparacin de la siguiente iteracin } convergencia = FALSO regresa fin

2.4 Mtodo de la secante Newton Raphson es un mtodo muy empleado por su simplicidad y rapidez, pero tiene el inconveniente de requerir la derivada de f(x). Esta situacin puede ser muy problemtica si la funcin es difcil de derivar. Una forma de evitar la derivacin es sustituir en la ecuacin de Newton Raphson 24

x(k+1) = x(k) - f(x(k))/fN( x(k)) fN( x(k)) por la frmula de diferencias finitas

quedando entonces x(k+1) = x(k) - f(x(k)) [f(x(k)) - f(x(k-1)) ] / [x(k) - x(k-1)] que define el mtodo de la secante. El nombre de este algoritmo se debe a que la interseccin de la recta secante que pasa por los puntos (x(k-1) , f(x(k-1))) , (x(k) , f(x(k))) con el eje horizontal produce la nueva aproximacin x(k+1).

Ejemplo Repita el ejemplo anterior empleando el mtodo de la secante con x(0) = 1.5 y x(1) = 0.8. f(x) = 3x + sen(x) - ex

25

Iteracin k 0 1 2 3 4 5 6 7

x(k) 1.50000 0.80000 -4.23482 0.44708 0.36549 0.36025 0.36042 0.36042

*x(k) - x(k-1)*

0.70000 5.03482 4.68189 0.08159 0.00523 0.00017 3.06666X10-7

Este mtodo es un miembro importante de una familia conocida como mtodos de dos puntos, llamada as porque incluye algoritmos que requieren de dos estimaciones iniciales. El precio que se paga por evitar la derivacin de f(x) es una convergencia ms lenta. Esto es, secante consumir ms iteraciones que Newton Raphson para un mismo problema. A continuacin, el pseudocdigo de un procedimiento que encuentra un cero aproximado de f(x) = 0 con el mtodo de la secante: proc secante(real func f, real &x0, real &x1, real eps, entero maxiter, real &x, lgico &convergencia) ! ! Este procedimiento encuentra una aproximacin a una raz de f(x)=0 con el mtodo iterativo ! de la secante. ! Descripcin de parmetros: ! f Funcin externa que evala a la funcin f(x) . ! x0 Primera estimacin inicial. ! x1 Segunda estimacin inicial. ! eps Mximo error permisible. Cuando el valor absoluto de la diferencia de las ! dos ltimas iteraciones es menor que eps, se considera haber llegado a la ! solucin. ! maxiter Nmero mximo de iteraciones. ! x ltima iteracin calculada. Si en convergencia se devuelve el valor ! VERDADERO, entonces x tambin es una raz de f(x). ! convergencia Bandera cuyo valor indica si hubo convergencia: ! convergencia=VERDADERO se alcanz la convergencia ! convergencia=FALSO no se alcanz la convergencia. ! 26

entero iter real f0, f1 convergencia=VERDADERO f0 = f(x0) ejecuta iter = 2, maxiter { f1 = f(x1) x = x1 - f1*(x1 - x0)/(f1 - f0) ! clculo de una nueva iteracin si ABS(x - x1) < eps entonces regresa ! se checa la convergencia x0 = x1 ! preparacin de la siguiente iteracin x1 = x f0 = f1 } convergencia = FALSO regresa fin

2.5 Mtodo de la biseccin Mediante bisecciones sucesivas busca una raz contenida en un intervalo [a, b]. Desde luego, para que esta bsqueda funcione, el intervalo original deber contener un nmero impar de races. La condicin que garantiza tal situacin es: f(a) * f(b) # 0 Si lo anterior no se cumple, entonces o no existe raz alguna o existen un nmero par de races y en ambos caso no es factible emplear el mtodo de la biseccin. La grfica mostrada a continuacin puede ser de utilidad para apreciar mejor esta situacin.

27

Una vez aceptado un intervalo [a, b] tal que f(a) * f(b) # 0, entonces se calcula la primera iteracin x(1) con x(1) = (a + b) / 2 generndose dos nuevos intervalos: [a, x(1)] y [x(1), b]. Entonces se desecha el intervalo que no contiene la raz y el intervalo aceptado nuevamente es dividido en dos con la frmula x(2) = (a + b) / 2 suponiendo que los valores de a y b son actualizados en cada iteracin de tal forma que siempre sean los extremos del intervalo que contiene a la raz. El proceso se puede generalizar fcilmente para cualquier iteracin: x(k) = (a + b) / 2 y termina cuando se cumpla alguno de los criterios de convergencia usuales. La ltima frmula es mtodo de la biseccin. Ejemplo Calcule una raz aproximada de f(x) = x3 + 4x2 -10 = 0 con el mtodo de la biseccin en el 28

intervalo [1, 2]. Considere un criterio de convergencia *f(x(k))* < 1X10-5 y un nmero mximo de iteraciones igual a 20.

Primeramente, se checa que en [1, 2] exista un nmero impar de races: f(1) = f(a) = 13 + 4(1)2 - 10 = -5 f(2) = f(b) = 23 + 4(2)2 - 10 = 14 como f(a)*f(b) = -5(14) <0 , es aplicable el mtodo de la biseccin en este intervalo. La primera iteracin es: x(1) = (1 +2) / 2 = 1.50000 y para averiguar en cual de los intervalos [1, 1.5] y [1.5, 2] est la raz, se evala f(x) en x(1) f(x(1)) = 1.500003 + 4(1.50000)2 - 10 = 2.37500 Como f(a)*f(x(1)) = f(1)*f(1.50000) = -5(2.37500) < 0, la raz se encuentra en [1, 1.5] y por lo tanto a = 1 y b = 1.5.

Iteracin k 1 2 3 4 5 6 7 8 9

x(k) 1.50000 1.25000 1.37500 1.31250 1.34375 1.35938 1.36719 1.36328 1.36523

*f(x(k))* 2.37500 1.79688 0.16211 0.84839 0.35098 0.09641 0.03236 0.03215 0.00007

La convergencia del mtodo de biseccin es lenta pero casi nunca falla. Cuando todos los dems 29

mtodos fracasan, la opcin obligada es emplear biseccin. El siguiente es el pseudocdigo de un procedimiento que encuentra una raz aproximada de f(x) = 0 con el mtodo de biseccin. proc biseccion(real func f, real &a, real &b, real eps, entero maxiter, real &x, entero &error) ! ! Este procedimiento encuentra una aproximacin a una raz de f(x)=0 con el mtodo iterativo ! de la biseccin. ! Descripcin de parmetros: ! f Funcin externa que evala a la funcin f(x) . ! a Lmite inferior de un intervalo que contiene un nmero impar de races de ! f(x). ! b Lmite superior de un intervalo que contiene un nmero impar de races de ! f(x). ! eps Mxima magnitud posible de f(x). Cuando el valor absoluto de f evaluada ! en la ltima iteracin x es menor que eps, se considera haber llegado a la ! solucin. ! maxiter Nmero mximo de iteraciones. ! x ltima iteracin calculada. Si en error se devuelve el valor 0, entonces x ! tambin es una raz de f(x). ! error Bandera cuyo valor indica el tipo de situacin detectada: ! error = 0 sin error, se alcanz la convergencia ! error = 1 no se alcanz la convergencia ! error = 2 f(a)*f(b)>0 y entonces en el intervalo [a,b] no existe un ! nmero impar de races. ! entero iter real fa, fb, fx error = 2 fa = f(a) fb = f(b) si fa*fb > 0.0 entonces regresa error = 0 ejecuta iter = 1, maxiter { x = (a + b)/2 ! clculo de una nueva iteracin fx = f(x) si ABS(fx) < eps entonces regresa ! se checa la convergencia si fa*fx # 0.0 entonces ! preparacin de la siguiente iteracin b=x otro a=x fa = fx 30

} error = 1 regresa fin

2.6 Orden de convergencia El orden de convergencia de un mtodo iterativo se define como sigue: Si *en+1* tiende a K**en*p cuando n tiende a infinito , se dice que el mtodo es de orden p. Punto fijo exhibe convergencia lineal (orden de convergencia p = 1): *en+1* = *gN()** en* Newton Raphson exhibe convergencia cuadrtica (orden de convergencia p = 2) para races simples: *en+1* = gNN()* en*2 / 2 donde g(x) = x(n) - f(x(n)) / fN(x(n)) Secante, orden de convergencia p: p = (1 + %5) / 2 . 1.62 Biseccin, convergencia lineal (orden de convergencia p = 1) : *en+1* = 0.5* en*

31

32

3. Solucin de sistemas de ecuaciones lineales


El sistema de n ecuaciones con n incgnitas

a11x1 + a12x2 + a13x3 + .............. + a1nxn = b1 a21x1 + a22x2 + a23x3 + .............. + a2nxn = b2 a31x1 + a32x2 + a33x3 + .............. + a3nxn = b3 . . . . . . . . . an1x1 + an2x2 + an3x3 + .............. + annxn = bn

se puede escribir en forma matricial como Ax = b , donde A es la matriz de coeficientes,

x es el vector de incgnitas y b el vector de trminos del lado derecho

Existen dos tipos de mtodos para resolver el problema Ax = b; los exactos y los iterativos. Los mtodos exactos son llamados as porque, en ausencia de errores de redondeo, obtienen la solucin analtica o exacta y estn basados en la eliminacin de Gauss o en la factorizacin LU. Los mtodos del segundo tipo encuentran una solucin aproximada mediante procesos iterativos. 33

Para sistemas con matrices de coeficientes densas y relativamente pequeas, se prefieren los mtodos exactos. En el caso de sistemas con matrices de coeficientes de orden grande y poco densas, son recomendados los mtodos iterativos.

3.1 Eliminacin de Gauss Es un proceso que convierte a la matriz de coeficientes A de nxn en una matriz triangular superior mediante la aplicacin sistemtica de transformaciones elementales de rengln. Una vez obtenida la matriz triangular superior se aplica un procedimiento conocido como sustitucin hacia atrs para obtener el vector solucin x. Las transformaciones elementales de rengln son: 1.- La fila i de una matriz puede ser multiplicada por un constante 0 Ri 6Ri 2.- A la fila i de un matriz le puede ser sumada otra fila j de la misma matriz multiplicada por una constante Rj + Ri 6Ri 3.- Las filas i y j de una matriz pueden ser intercambiadas Ri : R j La eliminacin de Gauss consta en n-1 pasos de eliminacin y cada uno de ellos consiste en: 1.- Seleccionar un pivote: en el i-simo paso de eliminacin se escoge como pivote al i-simo elemento de la diagonal principal de A, estrategia conocida como pivoteo natural. 2.- Colocar ceros debajo del pivote en la misma columna. Ejemplo Resolver el sistema x1 - x2 + x3 = -4 5x1 - 4x2 + 3x3 = -12 2x1 + x2 + x3 = 11 con eliminacin de Gauss y sustitucin hacia atrs. Use una estrategia de pivoteo natural. En primer lugar, se forma una matriz agregando una columna a la matriz de coeficientes. La columna aadida es el vector de trminos del lado derecho y la matriz as formada se conoce 34

como matriz aumentada del sistema: 1.00000 5.00000 2.00000 -1.00000 -4.00000 1.00000 1.00000 3.00000 1.00000 - 4.00000 -12.00000 11.00000

Primer paso de eliminacin: El pivote es el primer elemento de la diagonal principal de la matriz de coeficientes, a11 = 1.00000. Ahora se trata de colocar ceros debajo del pivote en la primera columna; las transformaciones de rengln requeridas para tal efecto son: -5R1 + R2 6 R2 -2R1 + R3 6 R3 La fila del pivote es multiplicada por el negativo de una cantidad conocida como multiplicador y es el elemento que se quiere convertir en cero dividido entre el pivote. Aplicando esta transformaciones a la matriz aumentada, el resultado es: 1.00000 0.00000 0.00000 -1.00000 1.00000 3.00000 1.00000 -2.00000 -1.00000 -4.00000 8.00000 19.00000

Segundo paso de eliminacin: El pivote es ahora a22 = 1.00000 y el multiplicador es m =3.00000/1.00000 = 3.00000. Por lo tanto la transformacin elemental requerida es: -3R2 + R3 = R3 y la matriz aumentada se convierte en: 1.00000 0.00000 0.00000 -1.00000 1.00000 0.00000 1.00000 -2.00000 5.00000 -4.00000 8.00000 -5.00000

Con estos dos pasos termina la eliminacin de Gauss y la parte correspondiente a la matriz de coeficientes es una matriz triangular superior. La ltima matriz aumentada define un sistema cuya solucin es equivalente a la del sistema original:

1.00000x1 - 1.00000x2 + 1.00000x3 = -4.00000

35

1.00000x2 - 2.00000x3 = 8.00000 5.00000x3 = -5.00000 Esta solucin x se puede encontrar fcilmente: x3 = -5.00000 / 5.00000 = -1.00000 x2 = (8.00000 + 2.00000x3) / 1.00000 = (8.00000+2.00000(-1.00000)) / 1.00000 = 6.00000 x1 = (-4.00000 + 1.00000x2 -1.00000x3) / 1.00000 x1 = (-4.0000 + 1.00000(6.00000) - 1.00000(-1.0000)) / 1.00000 = 3.00000 Este proceso es la sustitucin hacia atrs, conocido as porque se obtienen los valores de las incgnitas comenzando con la ltima xn y terminando con la primera x1. La siguientes frmulas describen la sustitucin hacia atrs y en ellas la letra a denota a los elementos de la matriz aumentada:

El ltimo ejercicio muestra que para poder calcular los multiplicadores en cada paso de eliminacin, el pivote necesariamente debe ser distinto de cero. Por lo tanto, si en el i-simo paso de eliminacin aii es cero, se debe intercambiar la fila i con alguna otra colocada debajo de ella de tal forma que se lleve a la posicin del pivote un nmero distinto de cero. Si no es posible colocar un pivote diferente de cero, entonces el sistema lineal no tiene solucin nica. Otra posible situacin en la cual no existe solucin nica es aquella en la cual despus del ltimo paso de eliminacin el elemento ann es igual a cero. Con eliminacin de Gauss tambin es factible calcular el determinante de la matriz de coeficientes:

36

donde ncf es el nmero de cambios de filas efectuados en la eliminacin y sii representa los elementos de la diagonal principal de la matriz triangular superior resultado de la eliminacin. Por lo tanto, el determinante de la matriz de coeficientes del ltimo ejemplo es: det(A) = (-1)0 [(1.00000)(1.00000)(5.00000)] = 5.00000 Es posible contar el nmero de operaciones necesarias para resolver un sistema lineal con eliminacin de Gauss y sustitucin hacia atrs: Multiplicaciones o divisiones: n3/3 + n2 - n/3 Sumas o restas: n3/3 + n2/2 - 5n/6 En anlisis numrico se emplea la notacin O(n3) la cual indica que el nmero de operaciones es de orden n3 . La conclusin final es: la eliminacin gaussiana con sustitucin hacia atrs es un proceso muy costoso en trminos de operaciones aritmticas. A continuacin, un pseudocdigo de un procedimiento que resuelve el sistema Ax = b con eliminacin gaussiana y sustitucin hacia atrs. Pivoteo natural es empleado. proc eliminacion_gauss(entero n, real &A[n, n+1], real &x[n], lgico &solucion_unica) ! ! Este procedimiento resuelve un sistema lineal de ecuaciones con eliminacin gaussiana y ! sustitucin hacia atrs. Se emplea una estrategia de pivoteo natural. ! Descripcin de parmetros: ! n Nmero de ecuaciones y de incgnitas. ! A Matriz aumentada del sistema, de n filas y n+1 columnas. ! x Si en solucion_unica se devuelve el valor VERDADERO, entonces x ! es la solucin nica. De n elementos. ! solucion_unica Bandera que indica la existencia de un solucin nica: ! solucion_unica=VERDADERO el sistema tiene solucin nica. ! solucion_unica= FALSO la matriz de coeficientes es singular ! y no hay solucin nica. ! entero i, p, k, j real auxiliar, multiplicador, suma solucion_unica = FALSO ! Eliminacin de gauss con pivoteo natural ejecuta i = 1, n-1 { ejecuta p = i, n ! seleccin del pivote si ABS(A[p, i]) $ 1X10-10 entonces salida si p > n entonces regresa si p i entonces ! intercambio de las filas p e i, en caso necesario 37

ejecuta k = 1, n+1 auxiliar = A[p, k] A[p, k] = A[i, k] A[i, k] = auxiliar ejecuta j = i+1, n ! colocacin de ceros debajo del pivote multiplicador = A[j, i]/A[i, i] ejecuta k = i, n+1 A[j, k] = A[j, k] - multiplicador*A[i, k] } si ABS(A[n, n]) < 1X10-10 entonces regresa solucion_unica = VERDADERO ! sustitucin hacia atrs x[n] = A[n, n+1]/A[n, n] ejecuta i = n-1, 1, -1 { suma = 0.0 ejecuta j = i+1, n suma = suma + A[i, j]*x[j] x[i] = (A[i, n+1] - suma)/A[i, i] } regresa fin

3.2 Pivoteo mximo de columna Si los clculo involucrados en la eliminacin gaussiana se efectuaran en una computadora o en una calculadora con longitud de palabra infinita, los resultados obtenidos seran exactos. Pero como lo anterior no es posible y las computadoras solo pueden representar y operar un nmero finito de dgitos, necesariamente los resultados sern aproximados debido a los inevitables errores de redondeo. Una forma de minimizar los errores de redondeo en la eliminacin de Gauss es emplear precisiones ms altas, es decir, usar un mayor nmero de dgitos en los clculos. Otra manera es emplear alguna tcnica de pivoteo. De todas las estrategias de pivoteo la ms simple y frecuentemente muy efectiva, es el pivoteo parcial o pivoteo mximo de columna: en cada paso de eliminacin siempre se escoge como pivote al elemento de mayor valor absoluto entre los colocados en y abajo de la diagonal principal: Pivoteo mximo de columna En el i-simo paso de eliminacin, se determina un valor p$i tal que: *api* = mx *aki* i#k#n Ejemplo Resuelva el sistema 38 para i = 1,2,....,n-1 pasos de eliminacin

x1 + 3x2 -2x3 = 7 4x1 - x2 + 3x3 = 10 -5x1 + 2x2 + 3x3 = 7 empleando eliminacin de Gauss con pivoteo mximo de columna. La matriz aumentada del sistema es: 1.00000 4.00000 -5.00000 3.00000 -1.00000 2.00000 -2.00000 3.00000 3.00000 7.00000 10.00000 7.00000

Primer paso de eliminacin: El pivote se escoge como el elemento con el mayor valor absoluto entre los elementos de la primera columna desde la fila 1 hasta la 3, por lo tanto el pivote es a31 = -5.00000. Como el pivote est en la fila 3, es necesario intercambiar la fila 1 con la 3 para colocar en el primer rengln al -5.00000. R1 : R3 -5.00000 4.00000 1.00000 2.00000 -1.00000 3.00000 3.00000 3.00000 -2.00000 7.00000 10.00000 7.00000

Los multiplicadores son ahora 4.00000/-5.00000 y 1.00000/-5.00000 y las transformaciones elementales que colocan ceros debajo de a11 son: -(4.00000/-5.00000)R1 + R2 6R2 -(1.00000/-5.00000)R1 + R3 6R3 La matriz aumentada queda al final de este primer paso de eliminacin de esta manera: -5.00000 0.00000 0.00000 2.00000 0.60000 3.40000 3.00000 5.40000 -1.40000 7.00000 15.60000 8.40000

Segundo paso de eliminacin: Aqu los posibles pivotes son a22 = 0.60000 y a23 = 3.40000. Como *a23* > *a22*, entonces el pivote es a23 = 3.40000 y por lo tanto se requiere intercambiar las filas 2 y 3: R2 :R3 -5.00000 0.00000 0.00000 2.00000 3.40000 0.60000 3.00000 - 1.40000 5.40000 7.00000 8.40000 15.60000 39

El multiplicador es 0.60000/3.40000 y la transformacin que coloca un cero debajo del pivote es: -(0.60000/3.40000) R2 + R3 6 R3 Entonces la matriz aumentada al final queda as: -5.00000 0.00000 0.00000 2.00000 3.40000 0.00000 3.00000 - 1.40000 5.64706 7.00000 8.40000 14.11765

La sustitucin hacia atrs genera el vector solucin x = [1.50000, 3.50000, 2.50000]T . Pseudocdigo de un procedimiento que resuelve un sistema lineal, con eliminacin de Gauss y pivoteo mximo de columna: proc eliminacion_gauss_pm(entero n, real &A[n, n+1], real &x[n], lgico &solucion_unica) ! ! Este procedimiento resuelve un sistema lineal de ecuaciones con eliminacin gaussiana y ! sustitucin hacia atrs. Se emplea una estrategia de pivoteo mximo de columna. ! Descripcin de parmetros: ! n Nmero de ecuaciones y de incgnitas. ! A Matriz aumentada del sistema, de n filas y n+1 columnas. ! x Si en solucion_unica se devuelve el valor VERDADERO, entonces x ! es la solucin nica. De n elementos. ! solucion_unica Bandera que indica la existencia de un solucin nica: ! solucion_unica=VERDADERO el sistema tiene solucin nica. ! solucion_unica= FALSO la matriz de coeficientes es singular ! y no hay solucin nica. ! entero i, p, k, j real auxiliar, multiplicador, suma solucion_unica = FALSO ! Eliminacin de gauss con pivoteo mximo de columna ejecuta i = 1, n-1 { p=i ejecuta j = i+1, n ! seleccin del pivote si ABS(A[j, i]) > ABS(A[p, i]) entonces p = j si ABS(A[p, i]) < 1X10-10 entonces regresa si p i entonces ! intercambio de las filas p e i, en caso necesario ejecuta k = 1, n+1 auxiliar = A[p, k] A[p, k] = A[i, k] A[i, k] = auxiliar ejecuta j = i+1, n ! colocacin de ceros debajo del pivote multiplicador = A[j, i]/A[i, i] ejecuta k = i, n+1 40

A[j, k] = A[j, k] - multiplicador*A[i, k] } si ABS(A[n, n]) < 1X10-10 entonces regresa solucion_unica = VERDADERO ! sustitucin hacia atrs x[n] = A[n, n+1]/A[n, n] ejecuta i = n-1, 1, -1 { suma = 0.0 ejecuta j = i+1, n suma = suma + A[i, j]*x[j] x[i] = (A[i, n+1] - suma)/A[i, i] } regresa fin

3.3 Descomposicin LU Dada una matriz A de nxn , es posible encontrar las matrices L y U tales que: A = LU Las matrices L y U son tambin de nxn. L es triangular inferior y U es triangular superior. Para mostrar los detalles de la descomposicin LU, considere una matriz A de 4x4:

A=LU Para poder realizar la descomposicin es necesario asignar valores arbitrarios a una de los diagonales, ya sea la de L o la de U. Si los elementos de la diagonal principal de U se hacen iguales a uno, se trata de la descomposicin de Crout, como es el caso mostrado arriba. Si los elementos de la diagonal principal de L se toman iguales a uno, entonces es la descomposicin de Doolittle. Multiplicando los renglones de L por la primera columna de U: l11 (1) = a11 l21 (1) = a21 l31 (1) = a31 41

l41 (1) = a41 Multiplicando el primer rengln de L por las columnas de U: l11 (1) = a11 l11 u12 = a12 l11 u13 = a13 l11 u14 = a14 y por lo tanto u12 = a12 / l11 y por lo tanto u13 = a13 / l11 y por lo tanto u14 = a14 / l11

Multiplicando los renglones de L por la segunda columna de U: l11 u12 = a12 l21 u12 + l22 (1) = a22 l31 u12 + l32 (1) = a32 l41 u12 + l42 (1) = a42 y por lo tanto l22 = a22 - l21 u12 y por lo tanto l32 = a32 - l31 u12 y por lo tanto l42 = a42 - l41 u12

Multiplicando el segundo rengln de L por las columnas de U: l21 (1) = a21 l21 u12 + l22 (1) = a22 l21 u13 + l22 u23 = a23 l21 u14 + l22 u24 = a24 y por lo tanto u23 = ( a23 - l21 u13 ) / l22 y por lo tanto u24 = ( a24 - l21 u14) / l22

Multiplicando los renglones de L por la tercera columna de U: l11 u13 = a13 l21 u13 + l22 u23 = a23 l31 u13 + l32 u23 + l33 (1) = a33 l41 u13 + l42 u23 + l43 (1) = a43 y por lo tanto l33 = a33 - l31 u13 - l32 u23 y por lo tanto l43 = a43 - l41 u13 - l42 u23

Multiplicando el tercer rengln de L por las columnas de U: l31 (1) = a31

42

l31 u12 + l32 (1) = a32 l31 u13 + l32 u23 + l33 (1) = a33 l31 u14 + l32 u24 + l33 u34 = a34 y por lo tanto u34 = ( a34 - l31 u14 - l32 u24 ) / l33

Multiplicando los renglones de L por la cuarta columna de U: l11 u14 = a14 l21 u14 + l22 u24 = a24 l31 u14 + l32 u24 + l33 u34 = a34 l41 u14 + l42 u24 + l43 u34 + l44 (1) = a44 y por lo tanto l44 = a44 - l41 u14 - l42 u24 - l43 u34 Entonces, este procedimiento basado en las propiedades del producto de matrices, permite encontrar a los elementos desconocidos de L y U. Las siguientes ecuaciones representan a dicho procedimiento:

Una vez obtenida la descomposicin LU de la matriz de coeficientes A, es posible resolver el 43

sistema Ax = b: como A = LU, el sistema original se puede escribir como (LU)x = b y si se define un vector z como z = Ux, entonces ahora queda el sistema Lz = b el cual se puede resolver mediante sustitucin hacia adelante. Conocido z, entonces se resuelve Ux = z con sustitucin hacia atrs encontrndose as al vector x. Ejemplo Resolver el sistema 3x1 - x2 + 2x3 = 12 x1 + 2x2 + 3x3 = 11 2x1 - 2x2 - x3 = 2 con descomposicin LU. l11 = a11 = 3.00000 l21 = a21 = 1.00000 l31 = a31 = 2.00000 3 1 2 -1 2 -2 2 3.00000 3 = 1.00000 -1 2.00000 0 l22 l32 u12 = a12 / l11 = -1.00000/3.00000 = -0.33333 u13 = a13 / l11 = 2.00000/3.00000 = 0.66667 0 0 * l3 3 1 0 0 -0.33333 1 0 0.66667 u23 1

l22 = a22 - l21 u12 = 2.00000 - (1.00000)(-0.33333) = 2.33333 l32 = a32 - l31 u12 = -2.00000 - (2.00000)(-0.33333) = -1.33333 u23 = ( a23 - l21 u13 ) / l22 = ( 3.00000 -(1.00000)(0.66667)) / 2.33333 = 1.00000 3 1 2 -1 2 -2 2 3 = -1 0 2.33333 -1.33333 0 0 * l 3 3 1 0 0 -0.33333 1 0 0.66667 1.00000 1

3.00000 1.00000 2.00000

l33 = a33 - l31 u13 - l32 u23 = -1.00000 - (2.00000)(0.66667) - (-1.33333)(1.00000) = -1.00000 Entonces, la descomposicin LU es: 3 1 -1 2 2 3 = 44

-2

-1 0 2.33333 -1.33333 0 0 * -1.00000 1 0 0 -0.33333 1 0 0.66667 1.00000 1

3.00000 1.00000 2.00000

Lz = b es el sistema: 3.00000z1 1.00000z1 + 2.33333z2 2.00000z1 - 1.33333z1 -1.00000z3 = 12.00000 11.00000 2.00000

el cual se resuelve con sustitucin hacia adelante. Este algoritmo es llamado as porque la primera incgnita que se determina es z1 y la ltima zn. z1 = 12.00000 / 3.00000 = 4.00000 z2 = (11.00000 - z1) / 2.33333 = (11.00000 - 4.00000) / 2.33333 = 3.00000 z3 = (2.00000 - 2z1 + 1.33333z2) / (-1.00000) z3 = ( 2.00000 - 2.00000(4.00000) + 1.33333(3.00000)) / (-1.00000) = 2.000000 Por ltimo, es necesario resolver el sistema Ux = z mediante sustitucin hacia atrs: 1.00000x1 - 0.33333x2 + 0.66667x3 = 4.00000 1.00000x2 + 1.00000x3 = 3.00000 1.00000x3 = 2.00000 x3 = 2.00000 / 1.00000 = 2.00000 x2 = (3.00000 - x3) / 1.00000 = (3.00000 - 2.00000) / 1.00000 = 1.00000 x1 =( 4.00000 + 0.33333x2 - 0.66667x3) / 1.00000 x1 = (4.00000 + 0.33333(1.00000) - 0.66667(2.00000)) / 1.00000 = 3.00000 La sustitucin hacia adelante que permite resolver a Lz = b se puede resumir con las frmulas:

45

El proceso de sustitucin hacia atrs empleado en la solucin de Ux = z se describe mediante:

Si se conoce la descomposicin LU de A, la solucin de Ax = b implica solamente resolver Lz = b y Ux = z. El trabajo computacional asociado con cualquiera de estas soluciones es de O(n2/2) multiplicaciones o divisiones. Esta es la razn por la que se prefiere la descomposicin LU para resolver varios sistemas lineales con la misma matriz de coeficientes. La descomposicin LU junto con la solucin de Lz = b y de Ux = z requieren un total de O(n3/3) multiplicaciones o divisiones. En el algoritmo de la reduccin de Crout, los elementos de la diagonal principal de L deben ser distintos de cero. Si en algn momento, se detecta que lii = 0 entonces es obligado un intercambio de filas. Ms especficamente; si lii =0, se debe intercambiar la fila i con alguna de las filas colocadas debajo de ella, cuidando que el intercambio solo afecte a los elementos de la parte triangular inferior. El mismo intercambio de filas deber realizarse tambin en A y en b. Si no es posible encontrar un lii0 , entonces la matriz A es singular y el sistema Ax = b no tiene solucin nica. Despus de los cambios de renglones, al terminar la descomposicin LU la igualdad A = LU sigue siendo vlida, L sigue siendo triangular inferior y U triangular superior pero A ahora es la matriz original afectada por los cambios de filas. Es factible implementar un pivoteo mximo de columna en la descomposicin de Crout. En este caso, se busca colocar en la posicin lii al elemento de mayor valor absoluto entre los colocados en y debajo de la diagonal principal de L. El intercambio de filas deber afectar solamente a la 46

parte triangular inferior de L y tambin deber ser aplicado a la matriz A y al vector b. A continuacin, el pseudocdigo de procedimientos que resuelven sistemas lineales con descomposicin LU: proc LU(entero n, real &A[n, n], real &L[n, n], real &U[n, n],entero &info_cambiosf[n], lgico &exito) ! ! Factorizacin A = LU mediante reduccin de Crout. ! Descripcin de parmetros: ! n Orden de las matrices cuadradas A, L y U. ! A Matriz por factorizar. Como resultado de la factorizacin, en el regreso ! A puede tener algunas filas intercambiadas. ! L Matriz triangular inferior. ! U Matriz triangular superior. ! info_cambiosf Vector que contiene informacin sobre los cambios de filas efectuados ! durante la factorizacin. ! exito Bandera cuyo valor indica el tipo de situacin detectada durante el ! proceso: ! exito = VERDADERO factorizacin exitosa, A = LU ! exito = FALSO no fue posible la factorizacin o A es ! singular. ! entero i, j, k, p real auxiliar, suma ejecuta i = 1,n info_cambiosf[i] = i ! cuando info_cambiosf[i] = i, no se ha intercambiado la fila i ejecuta i = 1,n U[i, i] = 1.0 ! se asigna el valor 1.0 a los elementos de la diagonal principal de U exito = FALSO ejecuta i = 1,n ! bsqueda de un L[1, 1] diferente de cero si ABS(A[i,1]) $ 1X10-10 entonces salir si i > n entonces regresa si i 1 entonces { ejecuta j = 1,n ! intercambio de las filas 1 e i auxiliar = A[1,j] A[1, j] = A[i, j] A[i, j] = auxiliar ejecuta j = 1, n auxiliar = info_cambiosf[1] info_cambiosf[1] = info_cambiosf[i] info_cambiosf[i] = auxiliar } ejecuta i = 1,n ! clculo de la primera columna de L L[i,1] = A[i,1] ejecuta j = 2,n ! clculo de los elementos restantes de la primera fila de U 47

U[1, j] = A[1, j] / L[1,1] ejecuta k = 2,n-1 { ejecuta p = k,n ! bsqueda de un L[i, i] distinto de cero suma = 0.0 ejecuta j = 1,k-1 suma = suma + L[p, j]*U[j, k] auxiliar = A[p, k] - suma si ABS(auxiliar) $ 1X10-10 entonces salir si p > n entonces regresar si p k entonces { ejecuta j = 1,n auxiliar = A[k, j] ! intercambio de las filas k y p en A A[k, j] = A[p, j] A[p, j] = auxiliar ejecuta j = 1,k-1 ! intercambio de las filas k y p en L auxiliar = L[k, j] L[k, j] = L[p, j] L[p, j] =auxiliar ejecuta j = 1,n auxiliar = info_cambiosf[k] ! intercambio de los info_cambiosf[k] = info_cambiosf[p] ! elementos con ndices k y p info_cambiosf[p] = auxiliar ! en info_cambiosf } ejecuta i = k,n suma = 0.0 ejecuta j = 1,k-1 ! clculo de columna k de L suma = suma + L[i, j]*U[j, k] L[i, k ] = A[i,k] - suma ejecuta i = k+1,n ! clculo de los elementos restantes de la fila k de U suma = 0.0 ejecuta j = 1,k-1 suma = suma + L[k, j]*U[j, i] U[k, i] = (A[k, i] - suma)/L[k, k] } suma = 0.0 ejecuta j = 1,n-1 ! clculo del ltimo elemento de la diagonal principal de L suma = suma + L[n, j]*U[j, n] L[n, n] = A[n, n] - suma si ABS(L[n, n]) < 1X10-10 entonces regresa exito = VERDADERO regresa fin proc solve_lu(entero n, real L[n, n], real U[n, n], entero info_cambiosf[n], real b[n], real 48

&x[n], lgico &solucion_unica) ! ! Dada la factorizacin A = LU, este procedimiento determina el vector solucin x de Ax = b. ! Descripcin de parmetros: ! n Orden de las matrices cuadradas L y U. Tambin es el nmero de ! incgnitas. ! L Matriz triangular inferior. ! U Matriz triangular superior. ! info_cambiosf Vector que contiene informacin sobre los cambios de filas efectuados ! durante la factorizacin A = LU. ! b Vector de trminos del lado derecho del sistema lineal. ! x Vector solucin. ! solucion_unica Bandera cuyo valor indica la existencia de la solucin nica: ! solucion_unica = VERDADERO x es la solucin nica ! solucion_unica = FALSO el sistema no tiene solucin nica. ! entero i, j, auxiliar real z[n], suma ! ! Solucin de Lz = b ! solucion_unica = FALSO si ABS(L[1, 1]) < 1X10-10 entonces regresa z[1] = b[info_cambiosf[1]]/L[1, 1] ! sustitucin hacia adelante ejecuta i = 2, n si ABS(L[i, i]) < 1X10-10 entonces regresa suma = 0.0 ejecuta j = 1, i-1 suma = suma + L[i, j]*z[j] z[i] = (b[info_cambiosf[i]] - suma)/L[i, i] ! ! Solucin de Ux = z ! si ABS(U[n, n]) < 1X10-10 entonces regresa x[n] = z[n]/U[n, n] ! sustitucin hacia atrs ejecuta i = n-1, 1, -1 si ABS(U[i, i]) < 1X10-10 entonces regresa suma = 0.0 ejecuta j = i+1, n suma = suma + U[i, j]*x[j] x[i] = (z[i] - suma)/U[i, i] solucion_unica = VERDADERO regresa fin La matriz inversa, A-1, de una matriz A de n filas y n columnas se puede calcular mediante la 49

solucin de n sistemas lineales, ya que la i-sima columna de la matriz inversa es la solucin del sistema A x = ei , en el cual el vector columna ei es la i-sima columna de la matriz identidad I. Como los n sistemas lineales comparten la misma matriz de coeficientes A, es conveniente descomponer A como el producto LU y emplear a ste en la solucin de todos los sistemas.

3.4 Solucin de sistemas tridiagonales Un caso especial y muy importante ocurre cuando en el sistema lineal Ax = b, la matriz de coeficientes A es triadiagonal. Una matriz cuadrada es tridiagonal si sus elementos distintos de cero se concentran en tres diagonales: la principal y las colocadas arriba y abajo de ella:

Los algoritmos de factorizacin se simplifican considerablemente cuando son aplicados a una matriz tridiagonal. En la descomposicin LU de una matriz de este tipo, se tienen (3n-2) elementos diferentes de cero en A y si

entonces se tendrn 2n-1 valores desconocidos en L y n-1 en U, lo que da un total de 3n-2 incgnitas. Ntese que la diagonal principal de U se considera formada de n unos (reduccin de Crout). Aplicando las propiedades de la multiplicacin matricial, es posible plantear las siguientes ecuaciones: a11 = l11 50

u12 = a12 / l11 ai,i-1 = li,i-1 ai,i = li,i-1 ui-1,i + lii ai,i+1 = lii ui,i+1 para i = 2,3,...,n para i = 2,3,...,n para i = 2,3,...,n-1

De la tercera ecuacin se pueden encontrar los elementos de la subdiagonal de L, de la cuarta se calculan los elementos restantes de la diagonal de L y con la quinta se completa la superdiagonal de U. El procedimiento para resolver el sistema Ax = b con A triadiagonal consiste en encontrar la descomposicin LU de A con las frmulas arriba descritas , aplicar entonces sustitucin hacia adelante para resolver Lz = b y por ltimo emplear sustitucin hacia atrs para resolver Ux = z. El sistema tridiagonal Ax = b tiene solucin nica si se cumplen las condiciones indicadas en el terorema: Supngase que A = {aij} es tridiagonal con ai,i-1 ai,i+1 0 para cada i = 2,3,...,n-1. Si |a11| > |a12|, |aii| $ |ai,i-1| + |ai,i+1| para cada i = 2,3,...,n-1, y |ann| > |an,n-1|, entonces el sistema Ax = b tiene solucin nica, A es no singular y los elementos de la diagonal principal de L en A = LU, calculados mediante reduccin de Crout, son todos distintos de cero. Ejemplo Resuelva el sistema 3x1 + x2 = -1

2x1 + 4x2 + x3 = 7 2x2 + 5x3 = 9 mediante descomposicin LU especfica para un sistema tridiagonal. l11 = a11 = 3 u12 = a12 / l11 = 1/3 = .33333 l21 = a21 = 2 l32 = a32 = 2

l22 = a22 - l21 u12 = 4 - 2*.33333 = 3.33334 u23 = a23 / l22 = 1/3.33334 = 0.30000 l33 = a33 - l32 u23 = 5 - 2*.30000 = 4.40000 51

El sistema Lz = b queda entonces 3z1 = -1

2z1 + 3.33334z2

=7

2z2 + 4.40000z3 = 9 cuya solucin es z =[ -.33333, 2.30000, 1.00000]T. Para calcular la solucin x se resuelve ahora el sistema Ux = z: x1 + .33333x2 = -.33333

x2 + .30000x3 = 2.30000 x3 = 1.00000 Por lo tanto la solucin del sistema es x = [-0.99999, 2.00000, 1.00000]T. La descomposicin LU para matrices triadiagonales junto con las sustituciones hacia adelante y hacia atrs requieren solamente de (5n-4) multiplicaciones o divisiones y (3n-3) adiciones o sustracciones. Con el objeto de almacenar en memoria solamente las tres diagonales y el vector de trminos del lado derecho, se recomienda ahora escribir el sistema lineal en trminos de vectores: b1 x1 + c1 x2 a2 x1 + b2 x2 + c2 x3 a3 x2 + b3 x3 + c3 x4 . . . . . . = d1 = d2 = d3 = . = .

an-1 xn-2 + bn-1 xn-1 + cn-1 xn = dn-1 an xn-1 + bn xn = dn La factorizacin LU queda entonces de la siguiente forma:

52

El procedimiento mostrado a continuacin resuelve un sistema tridiagonal expresado en trminos de los vectores a, b, c y d. El algoritmo supone satisfechas las condiciones que garantizan la solucin nica del sistema. proc tridiagonal(entero n, real a[n], real b[n], real c[n], real d[n], real &x[n]) ! ! Este procedimiento resuelve un sistema de ecuaciones tridiagonales mediante factorizacin ! LU. ! Descripcin de parmetros: ! n Nmero de ecuaciones y de incgnitas. ! a Vector que almacena a la subdiagonal del sistema, de n elementos. El primer elemento de este vector, a[1], es igual a cero. ! b Vector que almacena a la diagonal del sistema, de n elementos. ! c Vector que almacena a la superdiagonal del sistema, de n elementos. ! El ltimo elemento de este vector, c[n], es igual a cero. ! x Vector solucin, de n elementos. ! entero i real v[n], r[n], w[n], z[n] r[1] = b[1] w[1] = c[1]/r[1] ejecuta i = 2, n-1 { v[i] = a[i] r[i] = b[i] - v[i]*w[i-1] ! i-sima fila de L w[i] = c[i]/r[i] ! (i+1)-sima columna de U } v[n]=a[n] ! n-sima fila de L r[n] = b[n] - v[n]*w[n-1] ! solucin de Lz = b z[1] = d[1]/r[1] ejecuta i = 2, n z[i] = (d[i] - v[i]*z[i-1])/r[i] ! solucin de Ux = z x[n] = z[n] ejecuta i = n-1, 1, -1 53

x[i] = z[i] - w[i]*x[i+1] regresa fin

3.5 Mtodos iterativos: Jacobi y Gauss Seidel Dado el sistema lineal a11x1 + a12x2 + a13x3 + .............. + a1nxn = b1 a21x1 + a22x2 + a23x3 + .............. + a2nxn = b2 a31x1 + a32x2 + a33x3 + .............. + a3nxn = b3 . . . . . . . . . an1x1 + an2x2 + an3x3 + .............. + annxn = bn es factible despejar a x1 de la primera ecuacin, a x2 de la segunda ecuacin, a x3 de la tercera y as sucesivamente: x1 = ( b1 - a12x2 - a13x3 - .............. - a1nxn ) / a11 x2 = ( b2 - a21x1 - a23x3 - .............. - a2nxn ) / a22 x3 = ( b3 - a31x1 - a32x2 - .............. - a3nxn ) / a33 . . . . . . . . . . . . . . . . xn = ( bn - an1x1 - an2x2 - .............. - an,n-1xn-1 ) / ann Entonces se parte de una estimacin inicial de la solucin, x(0), la cual se sustituye en las ltimas ecuaciones para producir un nueva estimacin, x(1) : x1(1) = ( b1 - a12x2(0) - a13x3(0) - .............. - a1nxn(0) ) / a11 x2(1) = ( b2 - a21x1(0) - a23x3(0) - .............. - a2nxn(0) ) / a22 x3(1) = ( b3 - a31x1(0) - a32x2(0) - .............. - a3nxn(0) ) / a33 . . . . . . . . . . . . . . . . (0) (0) (0) xn = ( bn - an1x1 - an2x2 - .............. - an,n-1xn-1(0) ) / ann

54

El vector x(1) se sustituye en esas mismas ecuaciones para obtener ahora a x(2). Este procedimiento se repite entonces para calcular las estimaciones x(3), x(4), x(5), .... . Lo anterior se puede generalizar mediante las ecuaciones: x1(k+1) = ( b1 - a12x2(k) - a13x3(k) - .............. - a1nxn(k) ) / a11 x2(k+1) = ( b2 - a21x1(k) - a23x3(k) - .............. - a2nxn(k) ) / a22 x3(k+1) = ( b3 - a31x1(k) - a32x2(k) - .............. - a3nxn(k) ) / a33 . . . . . . . . . . . . . . . . xn(k+1) = ( bn - an1x1(k) - an2x2(k) - .............. - an,n-1xn-1(k) ) / ann las cuales se pueden escribir en una forma ms compacta:

Estas ecuaciones definen al mtodo de Jacobi o de los desplazamientos simultneos. El proceso termina cuando se cumple alguno de estos criterios de convergencia: 1.- 2x(k+1) - x(k)2 < 2.- 2x(k+1) - x(k)2 / 2x(k+1)2 < La tolerancia es fijada antes de iniciar los clculos. En ambos criterios, 2v2, define la norma de un vector v. La norma de un vector se calcula mediante cualquiera de esta dos definiciones: Las normas 2v22 y 2v24 del vector v = [v1 , v2, v3, ..., vn]T estn definidas por 2v22 =( 3 vi2)
i=1 n

2v24 = mx *vi*
i#i#n

A 2v22 se le conoce como norma euclidiana del vector v. La distancia entre dos vectores u y v es la norma de la diferencia u - v. Ejemplo Encuentre una solucin aproximada del sistema 10x1 x2 =9 55

-x1 + 10x2 - 2x3 = 7 - 2x2 +10x3 = 6 con el mtodo de Jacobi. Inicie con x(0) = [0, 0, 0]T y considere a 2x(k+1) - x(k)22 < 1X10-4 como criterio de convergencia. Al aplicar el mtodo de Jacobi se generan las ecuaciones: x1(k+1) = (9.00000 + 1.00000x2(k) ) / 10.00000 x2(k+1) = (7.00000 + 1.00000x1(k) + 2.00000x3(k) ) / 10.00000 x3(k+1) = (6.00000 + 2.00000x2(k) ) / 10.00000 que aplicadas a la estimacin inicial x(0) permiten calcular la nueva iteracin x(1) x1(1) = (9.00000 + 1.00000x2(0) ) / 10.00000 x1(1) = (9.00000 + 1.00000(0.00000) ) / 10.00000 = 0.900000 x2(1) = (7.00000 + 1.00000x1(0) + 2.00000x3(0) ) / 10.00000 x2(1) = (7.00000 + 1.00000(0.00000) + 2.00000(0.00000 )) / 10.00000 = 0.70000 x3(1) = (6.00000 + 2.00000x2(0) ) / 10.00000 x3(1) = (6.00000 + 2.00000(0.00000 )) / 10.00000 = 0.60000 Con x(1) = [0.90000, 0.70000, 0.60000]T se checa la convergencia del mtodo: 2x(1) - x(0)22 = %((0.90000 - 0.00000)2 + (0.70000 - 0.00000)2 + (0.60000 - 0.00000)2 ) 2x(1) - x(0)22 = 1.28841 Como la distancia entre las dos ltimas iteraciones, 2x(1) - x(0)22, no es menor que 1X10-4 ser necesario calcular al menos una iteracin ms. x1(2) = (9.00000 + 1.00000x2(1) ) / 10.00000 x1(2) = (9.00000 + 1.00000(0.70000) ) / 10.00000 = 0.970000 x2(2) = (7.00000 + 1.00000x1(1) + 2.00000x3(1) ) / 10.00000 x2(2) = (7.00000 + 1.00000(0.90000) + 2.00000(0.60000 )) / 10.00000 = 0.91000 x3(2) = (6.00000 + 2.00000x2(1) ) / 10.00000 56

x3(2) = (6.00000 + 2.00000(0.70000 )) / 10.00000 = 0.74000 2x(2) - x(1)22 = %((0.97000 - 0.90000)2 + (0.91000 - 0.70000)2 + (0.74000 - 0.60000)2 ) 2x(2) - x(1)22 = 0.26192

Iteracin k 0 1 2 3 4 5 6 7 8

x1(k) 0.00000 0.90000 0.97000 0.99100 0.99450 0.99555 0.99573 0.99578 0.99579

x2(k) 0.00000 0.70000 0.91000 0.94500 0.95550 0.95725 0.95778 0.95786 0.95789

x3(k) 0.00000 0.60000 0.74000 0.78200 0.78900 0.79110 0.79145 0.79156 0.79157

2x(k) - x(k-1)22

1.28841 0.26192 0.05857 0.01310 0.00293 0.00065 0.00015 0.00003

El siguiente es el pseudocdigo de un procedimiento que resuelve al sistema Ax = b con el mtodo de Jacobi: proc jacobi(entero n, real A[n, n], real b[n], real &xinicial[n], real eps, entero maxiter, real &x[n], lgico &convergencia) ! ! Este procedimiento encuentra una solucin aproximada x del sistema lineal ! Ax = b con el mtodo iterativo de Jacobi. ! Descripcin de parmetros: ! n Nmero de ecuaciones y de incgnitas. ! A Matriz de coeficientes del sistema. ! b Vector de trminos del lado derecho del sistema. ! xinicial Vector de estimaciones iniciales. ! eps Mximo error permisible. Cuando la norma euclidiana de la diferencia ! entre las dos ltimas aproximaciones es menor que eps, se considera ! haber llegado a solucin. ! maxiter Nmero mximo de iteraciones. ! x ltima iteracin calculada. Si en convergencia se devuelve el valor ! VERDADERO, entonces x tambin es el vector solucin de Ax=b. ! convergencia Bandera cuyo valor indica si hubo convergencia: ! convergencia=VERDADERO se alcanz la convergencia 57

! convergencia=FALSO no se alcanz la convergencia. ! entero iter, i, j real suma, norma2 convergencia=VERDADERO ejecuta iter = 1, maxiter { ejecuta i = 1, n ! clculo de la nueva aproximacin x { suma = 0.0 ejecuta j = 1, n si ij entonces suma = suma + A[i, j]*xinicial[j] x[i] = (b[i] - suma) / A[i, i] } suma = 0.0 ejecuta i =1, n suma = suma + (x[i] - xinicial[i])82 norma2 = SQRT(suma) si norma2 < eps entonces regresa ! se checa la convergencia ejecuta i = 1, n ! preparacin de la siguiente iteracin xinicial[i] = x[i] } convergencia = FALSO regresa fin Una forma de acelerar la convergencia del mtodo de Jacobi pudiera ser utilizar una estrategia de desplazamientos sucesivos: una vez calculada xi(k+1) , se sustituye inmediatamente en la expresin para calcular xi+1(k+1). Las ecuaciones por emplear ahora son: x1(k+1) = ( b1 - a12x2(k) - a13x3(k) - .............. - a1nxn(k) ) / a11 x2(k+1) = ( b2 - a21x1(k+1) - a23x3(k) - .............. - a2nxn(k) ) / a22 x3(k+1) = ( b3 - a31x1(k+1) - a32x2(k+1) - .............. - a3nxn(k) ) / a33 . . . . . . . . . . . . . . . . (k+1) (k+1) (k+1) xn = ( bn - an1x1 - an2x2 - .............. - an,n-1xn-1(k+1) ) / ann las cuales se pueden representar en una forma ms condensada:

58

Esta estrategia define al mtodo de Gauss Seidel o de los desplazamientos sucesivos. Ejemplo Resolver el sistema lineal del ejemplo anterior empleando Gauss Seidel. Considere el mismo vector inicial y tambin idntico criterio de convergencia. Las ecuaciones del mtodo de Gauss Seidel son: x1(k+1) = (9.00000 + 1.00000x2(k) ) / 10.00000 x2(k+1) = (7.00000 + 1.00000x1(k+1) + 2.00000x3(k) ) / 10.00000 x3(k+1) = (6.00000 + 2.00000x2(k+1) ) / 10.00000 Comenzando con x(0) = [0, 0, 0]T, entonces x1(1) = (9.00000 + 1.00000x2(0) ) / 10.00000 x2(1) = (7.00000 + 1.00000x1(1) + 2.00000x3(0) ) / 10.00000 x3(1) = (6.00000 + 2.00000x2(1) ) / 10.00000 x1(1) = (9.00000 + 1.00000(0.00000)) / 10.00000 = 0.90000 x2(1) = (7.00000 + 1.00000(0.90000) + 2.00000(0.00000)) / 10.00000 = 0.79000 x3(1) = (6.00000 + 2.00000(0.79000)) / 10.00000 = 0.75800 Con x(1) = [0.90000, 0.79000, 0.75800]T se checa la convergencia del mtodo: 2x(1) - x(0)22 = %((0.90000 - 0.00000)2 + (0.79000 - 0.00000)2 + (0.75800 - 0.00000)2 ) 2x(1) - x(0)22 = 1.41727 Como = 1X10-4, se requiere de al menos de una iteracin adicional: x1(2) = (9.00000 + 1.00000x2(1) ) / 10.00000 x2(2) = (7.00000 + 1.00000x1(2) + 2.00000x3(1) ) / 10.00000 x3(2) = (6.00000 + 2.00000x2(2) ) / 10.00000 59

x1(2) = (9.00000 + 1.00000(0.79000)) / 10.00000 = 0.97900 x2(2) = (7.00000 + 1.00000(0.97900) + 2.00000(0.75800)) / 10.00000 = 0.94950 x3(2) = (6.00000 + 2.00000(0.94950)) / 10.00000 = 0.78990 2x(2) - x(1)22 = %((0.97900 - 0.90000)2 + (0.94950 - 0.79000)2 + (0.78990 - 0.75800)2 ) 2x(2) - x(1)22 = 0.18083 Iteracin k 0 1 2 3 4 5 x1(k) 0.00000 0.90000 0.97900 0.99495 0.99575 0.99579 x2(k) 0.00000 0.79000 0.94950 0.95748 0.95787 0.95789 x3(k) 0.00000 0.75800 0.78990 0.79150 0.79157 0.79158 1.41727 0.18083 0.01790 0.00090 0.00004 2x(k) - x(k-1)22

En general, Gauss Seidel es ms rpido que Jacobi. Ahora, un procedimiento para resolver un sistema Ax = b con el mtodo de Gauss Seidel: proc gauss_seidel(entero n, real A[n, n], real b[n], real &xinicial[n], real eps, entero maxiter, real &x[n], lgico &convergencia) ! ! Este procedimiento encuentra una solucin aproximada x del sistema lineal ! Ax = b con el mtodo iterativo de Gauss Seidel. ! Descripcin de parmetros: ! n Nmero de ecuaciones y de incgnitas. ! A Matriz de coeficientes del sistema. ! b Vector de trminos del lado derecho del sistema. ! xinicial Vector de estimaciones iniciales. ! eps Mximo error permisible. Cuando la norma euclidiana de la diferencia ! entre las dos ltimas aproximaciones es menor que eps, se considera ! haber llegado a solucin. ! maxiter Nmero mximo de iteraciones. ! x ltima iteracin calculada. Si en convergencia se devuelve el valor ! VERDADERO, entonces x tambin es el vector solucin de Ax=b. ! convergencia Bandera cuyo valor indica si hubo convergencia: ! convergencia=VERDADERO se alcanz la convergencia ! convergencia=FALSO no se alcanz la convergencia. ! 60

entero iter, i, j real suma, norma2 convergencia=VERDADERO ejecuta iter = 1, maxiter { ejecuta i = 1, n ! clculo de la nueva aproximacin x { suma = 0.0 ejecuta j = 1, i - 1 suma = suma + A[i, j]*x[j] ejecuta j = i + 1, n suma = suma + A[i, j]*xinicial[j] x[i] = (b[i] - suma) / A[i, i] } suma = 0.0 ejecuta i =1, n suma = suma + (x[i] - xinicial[i])82 norma2 = SQRT(suma) si norma2 < eps entonces regresa ! se checa la convergencia ejecuta i = 1, n ! preparacin de la siguiente iteracin xinicial[i] = x[i] } convergencia = FALSO regresa fin La condicin suficiente pero no necesaria que garantiza la convergencia tanto de Jacobi como de Gauss Seidel para cualquier vector inicial x(o) es que la matriz de coeficientes del sistema sea estrictamente diagonal dominante. A continuacin, la definicin de una matriz estrictamente diagonal dominante. Una matriz A de nxn es estrictamente diagonal dominante si y slo si
n

*aii* > 3 *aij*


j=1 ji

,i = 1, 2, ...., n

En base a esta definicin, la matriz de coeficientes de los dos ltimos ejemplos es estrictamente diagonal dominante ya que *10* > *-1* + *0* *10* > *-1* + *-2* *10* > *0* + *-2* 61

Esto asegura la convergencia de ambos mtodos para cualquier estimacin inicial x(0).

62

4. Solucin de sistemas de ecuaciones no lineales


Se trata de encontrar un vector x = [x1, x2, x3, ..., xn ]T = 0 que satisfaga las igualdades f1(x1, x2, x3, ..., xn ) = 0 f2(x1, x2, x3, ..., xn ) = 0 f3(x1, x2, x3, ..., xn ) = 0 . . . . . . . . . fn(x1, x2, x3, ..., xn ) = 0 Estas ecuaciones tambin se pueden representar en una forma ms compacta: fi (x) = 0 , para i = 1, 2, 3, ..., n

4.1 Mtodo de punto fijo multivariable El sistema fi (x) = 0, i = 1,2,3, ..., n es transformado en el conjunto de ecuaciones x1 = g1(x) x2 = g2(x) x3 = g3(x) . . . . . . xn = gn(x) mediante la aplicacin de operaciones algebraicamente vlidas. A cada una de esta ecuaciones se les aplica el mtodo iterativo de punto fijo: x1(k+1) = g1(x(k)) x2(k+1) = g2(x(k)) x3(k+1) = g3(x(k)) . . . . . . (k+1) xn = gn(x(k)) 63

Se comienza con una estimacin inicial x(0), la cual es sustituida en las ecuaciones g1, g2, g3, ..., gn resultando una nueva aproximacin x(1). Estas funciones son evaluadas en x(1) para generar x(2). Este procedimiento es repetido para calcular las aproximaciones x(3), x(4), x(5),.... . En el momento en que se cumpla alguno de los criterios de convergencia usuales, se termina el proceso iterativo. Ejemplo Encuentre una solucin aproximada del sistema f1(x1, x2) = x12 - 10x1 + x22 + 8 = 0 f2(x1, x2) = x1 x22 + x1 - 10x2 + 8 = 0 con el mtodo de punto fijo. Inicie con x(0) = [0, 0]T y considere el criterio de convergencia 2x(k+1) - x(k)22 < 1X10-3 . Una posible manera de aislar las variables x1 y x2 sera: x1 = ( 8 + x12 + x22 ) / 10 x2 = ( 8 + x1 x22 + x1 ) / 10 Aplicando la iteracin de punto fijo a estos despejes: x1(k+1) = ( 8 + [x1(k) ]2+ [x2(k) ](2)) / 10 x2(k+1) = ( 8 + x1(k) [x2(k) ]2+ x1(k) ) / 10 Con x(0) = [0, 0]T y las ecuaciones anteriores , entonces x(1) es: x1(1) = ( 8 + [x1(0) ]2+ [x2(0) ]2) / 10 = (8.00000 + 0.000002 + 0.000002 ) / 10.00000 = 0.80000 x2(1) = ( 8 + x1(0) [x2(k) ]2+ x1(0) ) / 10 = ( 8.00000 + (0.00000)(0.000002) + 0.00000 ) / 10.00000 x2(1) = 0.80000 2x(1) - x(0)22 = %((0.80000 - 0.00000)2 + (0.80000 - 0.00000)2) = 1.13137 Como la distancia entre x(1) y x(0) es mayor o igual que 1X10-3, se requiere por lo menos de una iteracin ms: x1(2) = ( 8 + [x1(1) ]2 + [x2(1) ]2) / 10 = (8.00000 + 0.800002 + 0.800002 ) / 10.00000 = 0.92800 x2(2) = ( 8 + x1(1) [x2(1) ]2+ x1(1) ) / 10 = ( 8.00000 + (0.80000)(0.800002) + 0.80000 ) / 10.00000 x2(2) = 0.93120

64

2x(2) - x(1)22 = %((0.92800 - 0.80000)2 + (0.93120 - 0.80000)2) = 0.18330

Iteracin k 0 1 2 3 4 5 6 7 8

x1(k) 0.00000 0.80000 0.92800 0.97283 0.98937 0.99578 0.99832 0.99933 0.99973

x2(k) 0.00000 0.80000 0.93120 0.97327 0.98944 0.99579 0.99832 0.99933 0.99973

2x(k) - x(k-1)22

1.13137 0.18330 0.06148 0.02312 0.00903 0.00358 0.00143 0.00057

El mtodo iterativo de punto fijo multivariable converge, cuando lo hace, casi siempre de una forma lenta. Para tratar de acelerar su convergencia, frecuentemente se intenta aplicar un estrategia de desplazamientos sucesivos, similar a la aplicada en el mtodo de Gauss Seidel. Ejemplo Aplicar desplazamientos sucesivos al ejemplo anterior. En este caso, las ecuaciones del mtodo iterativo de punto fijo quedaran: x1(k+1) = ( 8 + [x1(k) ]2+ [x2(k) ]2) / 10 x2(k+1) = ( 8 + x1(k+1) [x2(k) ]2 + x1(k+1) ) / 10 En el clculo de x2(k+1) se sustituye inmediatamente el valor recin calculado x1(k+1). Con x(0) = [0, 0]T , entonces x(1) es: x1(1) = ( 8 + [x1(0) ]2 + [x2(k) ]2) / 10 = (8.00000 + 0.000002 + 0.000002 ) / 10.00000 = 0.80000 x2(1) = ( 8 + x1(1) [x2(0) ]2 + x1(1) ) / 10 = ( 8.00000 + (0.80000)(0.000002) + 0.80000 ) / 10.00000 x2(1) = 0.88000 2x(1) - x(0)22 = %((0.80000 - 0.00000)2 + (0.88000 - 0.00000)2) = 1.18929 Ya que la distancia entre x(1) y x(0) es mayor o igual que 1X10-3, se requiere al menos de una 65

iteracin adicional x1(2) = ( 8 + [x1(1) ]2 + [x2(1) ]2) / 10 = (8.00000 + 0.800002 + 0.880002 ) / 10.00000 = 0.94144 x2(2) = ( 8 + x1(2) [x2(1) ]2 + x1(2) ) / 10 = ( 8.00000 + (0.94144)(0.880002) + 0.94144 ) / 10.00000 x2(2) = 0.96705 2x(2) - x(1)22 = %((0.94144 - 0.80000)2 + (0.96705 - 0.88000)2) = 0.16608

Iteracin k 0 1 2 3 4 5 6 7

x1(k) 0.00000 0.80000 0.94144 0.98215 0.99448 0.99829 0.99947 0.99983

x2(k) 0.00000 0.88000 0.96705 0.99006 0.99693 0.99905 0.99970 0.99991

2x(k) - x(k-1)22

1.18929 0.16608 0.04676 0.01412 0.00435 0.00135 0.00042

En general; el mtodo de punto fijo multivariable con desplazamientos sucesivos, conocido tambin como Gauss Seidel no lineal, converge ms rpido que el mismo mtodo pero con desplazamientos simultneos (Jacobi no lineal). Ahora, el pseudocdigo de un procedimiento que resuelve en forma aproximada un sistema de ecuaciones no lineales descrito como x = g(x): proc punto_fijo_n(entero n, proc g, real &xinicial[n], real eps, entero maxiter, real &x[n], lgico &convergencia) ! ! Este procedimiento encuentra una solucin aproximada x del sistema no lineal ! descrito como x = g(x), con el mtodo iterativo de punto fijo multivariable. ! Descripcin de parmetros: ! n Nmero de ecuaciones y de incgnitas. ! g Procedimiento que calcula una nueva aproximacin x = g(xinicial, x) ! proc g(entero n, real xinicial[n], real &x[n]) ! n Nmero de ecuaciones y de incgnitas. ! xinicial Vector de incgnitas en la iteracin inicial. ! x Vector de incgnitas en la nueva iteracin. ! xinicial Vector de estimaciones iniciales. 66

! eps Mximo error permisible. Cuando la norma euclidiana de la diferencia ! entre las dos ltimas aproximaciones es menor que eps, se considera ! haber llegado a solucin. ! maxiter Nmero mximo de iteraciones. ! x ltima iteracin calculada. Si en convergencia se devuelve el valor ! VERDADERO, entonces x tambin es un punto fijo de g(x). ! convergencia Bandera cuyo valor indica si hubo convergencia: ! convergencia=VERDADERO se alcanz la convergencia ! convergencia=FALSO no se alcanz la convergencia. ! entero iter, i real suma, norma2 convergencia=VERDADERO ejecuta iter = 1, maxiter { llama g(n, xinicial, x) ! clculo de la nueva aproximacin x suma = 0.0 ejecuta i =1, n suma = suma + (x[i] - xinicial[i])82 norma2 = SQRT(suma) si norma2 < eps entonces regresa ! se checa la convergencia ejecuta i = 1, n ! preparacin de la siguiente iteracin xinicial[i] = x[i] } convergencia = FALSO regresa fin

4.2 Mtodo de Newton Raphson multivariable Para deducir las ecuaciones de Newton Raphson multivariable, considere el caso particular de dos variables y dos ecuaciones (n=2): f1(x1, x2 ) = 0 f2(x1, x2 ) = 0 Si todas las n-simas derivadas parciales de f(x1, x2) son continuas en una regin cerrada y si las (n+1)-simas derivadas parciales existen en la regin abierta, se tiene:

67

donde Rn es:

aplicando este resultado tanto a f1 como a f2 en el punto base (x1(k), x2(k)) y con incrementos h1 = x1(k+1) - x1(k) en la direccin x1 y h2 = x2(k+1) - x2(k) en la direccin x2 :

donde las derivadas parciales son evaluadas es el punto base x(k). Si suponemos que x(k+1) . x es razonable tambin suponer que f1(x1(k+1), x2(k)) .0 y f2(x1(k+1), x2(k)) .0. Si adems x(k+1) .x(k) , entonces (x1(k+1) - x1(k))j .0 y (x2(k+1) - x2(k))j .0 para j = 2,3,4, ... . Despus de estas suposiciones las ecuaciones anteriores se simplifican considerablemente:

68

Como x1(k+1) - x1(k) = h1 y x2(k+1) - x2(k) = h2, entonces

Esta ltimas ecuaciones definen un sistema de dos ecuaciones lineales con dos incgnitas (h1 y h2). Resuelto este, la nueva aproximacin x(k+1) se calcula mediante: x1(k+1) = x1(k) + h1 x2(k+1) = x2(k) + h2 Las frmulas obtenidas arriba se pueden generalizar fcilmente para el caso de n variables: J(x(k)) h = - f(x(k)) Esta ltima ecuacin es la del mtodo de Newton Raphson multivariable. En ella, J es la matriz Jacobiana del sistema de ecuaciones y se define por:

mientras que h = [h1, h2, h3, ..., hn]T y f = [f1, f2, f3, ..., fn]T . Por lo tanto, en cada iteracin de Newton Raphson multivariable ser necesario resolver un sistema lineal de n ecuaciones y n incgnitas. Si la matriz jacobiana es singular, entonces el sistema J(x(k)) h = - f(x(k)) no tiene solucin nica y por lo tanto Newton Raphson falla en la bsqueda de una raz x. Ejemplo Encuentre una raz aproximada del sistema f1(x1, x2) = x12 + x22 - 4 = 0

69

f2(x1, x2) = x1 x2 - 1 = 0 mediante la aplicacin de Newton Raphson multivariable con x(0) = [2, 0]T. Considere el criterio de convergencia 2x(k+1) - x(k)22 < 1X10-4 . f(x(0)) = [f1(x(0)), f2(x(0))]T = [[x1(0)]2 + [x2(0)]2 - 4, x1(0) x2(0) - 1]T f(x(0)) = [2.000002 + 0.000002 - 4.00000, 2.00000(0.00000) - 1.00000]T = [0.00000, -1.00000]T

Por lo tanto, el sistema lineal J(x(0)) h = - f(x(0)) por resolver en esta iteracin es: 4.00000h1 + 0.00000h2 = 0.00000 0.00000h1 + 2.00000h2 = 1.00000 cuya solucin es h = [0.00000, 0.50000]T . La nueva aproximacin x(1) se obtiene con: x1(1) = x1(0) + h1 = 2.00000 + 0.00000 = 2.00000 x2(1) = x2(0) + h2 = 0.00000 + 0.50000 = 0.50000 2x(1) - x(0)22 = 2h22 = %(0.000002 + 0.500002) = 0.50000 Dado que todava no se cumple con el criterio de convergencia, ser necesario calcular al menos una iteracin adicional.

Iteracin k 0 1 2 3 4

x1(k) 2.00000 2.00000 1.93333 1.93185 1.93185

x2k) 0.00000 0.50000 0.51667 0.51764 0.51764

2x(k) - x(k-1)22

0.50000 0.06872 0.00177 1.50229X10-6

70

En el caso multivariable, Newton Raphson tambin presenta convergencia cuadrtica, es decir, su orden de convergencia es 2. Sin embargo, se requiere partir de una estimacin inicial cercana a la raz, para que el mtodo funcione adecuadamente. El siguiente es el pseudocdigo de un procedimiento que resuelve en forma aproximada un sistema de n ecuaciones no lineales con Newton Raphson multivariable: proc newton_n(entero n, proc funs, proc jacobiana, real &xinicial[n], real eps, entero maxiter, real &x[n],lgico &convergencia) ! ! Este procedimiento encuentra una solucin aproximada x del sistema no lineal ! f (x) = 0, con el mtodo de Newton Raphson multivariable. ! Descripcin de parmetros: ! n Nmero de ecuaciones y de incgnitas. ! funs Procedimiento que calcula las funciones f (x) = 0 ! proc funs(entero n, real x[n], real &f[n]) ! n Nmero de ecuaciones y de incgnitas. ! x Vector de variables x. ! f Vector de funciones f. ! jacobiana Procedimiento que calcula los elementos de la matriz jacobiana del ! sistema de ecuaciones ! proc jacobiana(entero n, real x[n], real &J[n, n]) ! n Nmero de ecuaciones y de incgnitas. ! x Vector de variables x. ! J Matriz jacobiana del sistema. J[i, j] = df[i] / dx[j] evaluada ! en x. ! xinicial Vector de estimaciones iniciales. ! eps Mximo error permisible. Cuando la norma euclidiana de la diferencia ! entre las dos ltimas aproximaciones es menor que eps, se considera ! haber llegado a solucin. ! maxiter Nmero mximo de iteraciones. ! x ltima iteracin calculada. Si en convergencia se devuelve el valor ! VERDADERO, entonces x tambin es el vector solucin de f (x) = 0. ! convergencia Bandera cuyo valor indica si hubo convergencia: ! convergencia=VERDADERO se alcanz la convergencia ! convergencia=FALSO no se alcanz la convergencia. ! entero iter, i, j real f[n], J[n, n], A[n, n+1], h[n], suma, norma2 lgico solucion_unica convergencia=VERDADERO ejecuta iter = 1, maxiter { llama funs(n, xinicial, f) ! clculo de las funciones f evaluadas en xinicial llama jacobiana(n, xinicial, J) ! clculo de la matriz jacobiana J evaluada en xinicial ejecuta i = 1, n ! formacin de la matriz aumentada A del sistema lineal { ejecuta j = 1, n 71

A[i, j] = jacobiana[i, j] A[i, n+1] = -f[i] } llama eliminacion_gauss(n, A, h, solucion_unica) ! solucin del sistema lineal si no solucion_unica entonces { escribe El sistema lineal en la iteracin, iter, no tiene solucin nica convergencia = FALSO regresa } ejecuta i = 1, n x[i] = xinicial[i] + h[i] ! clculo de la nueva aproximacin x suma = 0.0 ejecuta i =1, n suma = suma + h[i]82 norma2 = SQRT(suma) si norma2 < eps entonces regresa ! se checa la convergencia ejecuta i = 1, n ! preparacin de la siguiente iteracin xinicial[i] = x[i] } convergencia = FALSO regresa fin El esfuerzo requerido para determinar analticamente las n2 derivadas parciales de la matriz jacobiana puede llegar a ser considerable y frustrante, particularmente para n grande y/o ecuaciones complejas. En ese caso, se aconseja calcular las derivadas en forma aproximada empleando frmulas de diferencias finitas. Una de la ms usadas es:

donde x es una cantidad pequea en valor absoluto, usualmente x = % (psilon) |xj(k)| , y ej es un vector cuyo nico elemento distinto de cero es un 1 de la j-sima coordenada.

4.3 Mtodo de Broyden Un notorio inconveniente del mtodo de Newton Raphson multivariable es que en cada iteracin se requiere resolver un sistema lineal de nxn, lo cual implica un esfuerzo computacional de O(n3). Una generalizacin del mtodo de la secante aplicada a sistemas no lineales, conocida como el mtodo el Broyden, solo requiere de n evaluaciones funcionales por iteracin y reduce el nmero de clculos aritmticos a O(n2). Broyden pertenece a la familia de mtodos conocida como actualizacin de la secante del mnimo cambio. El aporte de este mtodo es que la inversa de la 72

matriz jacobiana ahora es actualizada en cada iteracin mediante la frmula de inversin de Sherman y Morrison:

donde A es la matriz jacobiana, y(k) = f(x(k)) - f(x(k-1)) y s(k) = x(k) - x(k-1). Esta frmula solo incluye multiplicaciones matriciales y ,por lo tanto, demanda no ms de O(n2) clculos aritmticos. La principal desventaja del mtodo de Broyden es que su convergencia es superlineal y ya no cuadrtica como en Newton Raphson. Una convergencia superlineal implica que:

donde p es la solucin de f(x) = 0. Sin embargo, una reduccin en el orden de convergencia de dos a superlineal es aceptable; ya que se compensa por la reduccin en el nmero de clculos requeridos por iteracin. Ejemplo Encuentre una raz aproximada de sistema f1(x1, x2) = x12 + x22 - 4 = 0 f1(x1, x2) = x1 x2 - 1 = 0 con el mtodo de Broyden. Tome como estimacin inicial a x(0) = [2, 0]T y considere un criterio de convergencia 2x(k+1) - x(k)22 < 1X10-4 v = f(x(0)) = [f1(x(0)), f2(x(0))]T = [[x1(0)]2 + [x2(0)]2 - 4, x1(0) x2(0) - 1]T v = [2.000002 + 0.000002 - 4.00000, 2.00000(0.00000) - 1.00000]T = [0.00000, -1.00000]T

73

Ahora se invierte la matriz J(x(0))

y se calcula la primera iteracin:

x(1) = x(0) + s = [2.00000, 0.00000]T + [0.00000, 0.500000]T = [2.00000, 0.50000]T 2s22 = p(0.000002 + 0.500002) = 0.50000 La inversin de la matriz jacobiana se lleva a cabo solamente en la primera iteracin. En las subsecuentes iteraciones, sta se aproximar mediante la frmula de Sherman y Morrison. Para determinar la segunda iteracin, se copia el vector v en w: w = [0.00000, -1.00000]T y se calculan los vectores v, y y z v = f(x(1)) = [f1(x(1)), f2(x(1))]T = [[x1(1)]2 + [x2(1)]2 - 4, x1(1) x2(1) - 1]T v = [2.000002 + 0.500002 - 4.00000, 2.00000(0.50000) - 1.00000]T = [0.25000, 0.00000]T y = v - w = [0.25000, 0.00000]T - [0.00000, -1.00000]T = [0.25000, 1.00000]T

74

Se procede a calcular la nueva matriz A, con la frmula de Sherman y Morrison:

En los clculos anteriores; la frmula de Sherman y Morrison se expres en trminos de los vectores y, z y w y de la matriz C. Con la nueva A, se procede a calcular x(2)

x(2) =x(1) = [2.00000, 0.50000]T + [-0.06250, 0.00000]T = [1.93750, 0.50000]T

2s22 = p((-0.06250)2 + 0.000002) = 0.06250 El procedimiento continua hasta que se satisfaga el criterio 2x(k+1) - x(k)22 < 1 X10-4 La siguientes es una tabla con todas las iteraciones requeridas en este ejercicio: Iteracin k x1(k) x2(k) 2x(k) - x(k-1)22 75

0 1 2 3 4 5

2.00000 2.00000 1.93750 1.93443 1.93184 1.93185

0.00000 0.50000 0.50000 0.51639 0.51763 0.51764 0.50000 0.06250 0.01668 0.00286 0.00001

A continuacin, un algoritmo en pseudocdigo, del mtodo de Broyden. proc broyden(entero n, proc funs, proc jacobiana, real &xinicial[n], real eps, entero maxiter, real &x[n],lgico &convergencia) ! ! Este procedimiento encuentra una solucin aproximada x del sistema no lineal ! f (x) = 0, con el mtodo de Broyden. ! Descripcin de parmetros: ! n Nmero de ecuaciones y de incgnitas. ! funs Procedimiento que calcula las funciones f (x) = 0 ! proc funs(entero n, real x[n], real &f[n]) ! n Nmero de ecuaciones y de incgnitas. ! x Vector de variables x. ! f Vector de funciones f. ! jacobiana Procedimiento que calcula los elementos de la matriz jacobiana del ! sistema de ecuaciones ! proc jacobiana(entero n, real x[n], real &J[n, n]) ! n Nmero de ecuaciones y de incgnitas. ! x Vector de variables x. ! J Matriz jacobiana del sistema. J[i, j] = df[i] / dx[j] evaluada ! en x. ! xinicial Vector de estimaciones iniciales. ! eps Mximo error permisible. Cuando la norma euclidiana de la diferencia ! entre las dos ltimas aproximaciones es menor que eps, se considera ! haber llegado a solucin. ! maxiter Nmero mximo de iteraciones. ! x ltima iteracin calculada. Si en convergencia se devuelve el valor ! VERDADERO, entonces x tambin es el vector solucin de f (x) = 0. ! convergencia Bandera cuyo valor indica si hubo convergencia: ! convergencia=VERDADERO se alcanz la convergencia ! convergencia=FALSO no se alcanz la convergencia. ! 76

entero iter, i, j, informacion_cambiosf[n] real f[n], J[n, n], L[n, n], U[n, n], b[n], columna_inversa[n] real A[n, n], s[n], w[n], y[n], z[n], suma, norma2, p, s_mas_z[n], matriz[n, n], c[n, n] real func multiplicacion_vector_transpuesto_vector lgico solucion_unica, exito_LU convergencia=VERDADERO llama funs(n, xinicial, f) ! clculo de las funciones f evaluadas en xinicial llama jacobiana(n, xinicial,J) ! clculo de la matriz jacobiana J evaluada en xinicial ! ! inversin de la matriz jacobiana ! llama LU(n, J, L, U, informacion_cambiosf, exito_LU) si no exito_LU entonces { escribe La matriz jacobiana evaluada en xinicial es singular o no es posible la factorizacin LU convergencia = FALSO regresa } ejecuta i = 1,n { ejecuta j = 1, n { si i = j entonces ! b es la i-sima columna de la matriz identidad b[j] = 1.0 otro b[j] = 0.0 } llama solve_lu(n, L, U, informacion_cambiosf, b, columna_inversa, solucion_unica) ejecuta j = 1, n A[j, i] = columna_inversa[j] ! i-sima columna de la inversa de la jacobiana } llama multiplicacion_matriz_vector(n, -A, f, s) ejecuta i = 1, n x[i] = xinicial[i] + s[i] ! clculo de una nueva iteracin suma = 0.0 ejecuta i = 1, n suma = suma +s[i]82 norma2 = SQRT(suma) si norma2 < eps entonces regresa ! se checa la convergencia en la primera iteracin ejecuta iter = 2, maxiter { ejecuta i = 1, n 77

w[i] = f[i] ! copia f en w llama funs(n, x, f) ejecuta i = 1, n y[i] = f[i] - w[i] llama multiplicacion_matriz_vector(n, -A, y, z) p = multiplicacion_vector_transpuesto_vector(n, -s, z) llama identidad(n, Ident) ! Ident es la matriz identidad de orden n ejecuta i = 1, n s_mas_z[i] = s[i] + z[i] llama multiplicacion_vector_vector_transpuesto(n, s_mas_z, s, matriz) llama suma_matrices(n, n, p*Ident, matriz, c) llama multiplicacion_matrices(n, n, n, c, A, matriz) ejecuta i = 1, n ejecuta j = 1, n A[i, j] = matriz[i, j] /p llama multiplicacion_matriz_vector(n, -A, f, s) ejecuta i = 1, n x[i] = x[i] + s[i] suma = 0.0 ejecuta i = 1, n suma = suma + s[i]82 norma2 = SQRT(suma) si norma2 < eps entonces regresa ! se checa la convergencia } convergencia = FALSO regresa fin proc multiplicacion_matriz_vector(integer n, real A[n, n], real b[n], real &r[n]) ! ! Este procedimiento calcula el producto de una matriz A por un vector b. ! Descripcin de parmetros: ! n Nmero de filas y de columnas de A; nmero de elementos de b; nmero ! de elementos de r. ! A Matriz ! b Vector ! r Vector, producto A*b ! entero i, j ejecuta i = 1, n { r[i] = 0.0 ejecuta j = 1, n 78

r[i] = r[i] + A[i, j]*b[j] } regresa fin func multiplicacion_vector_transpuesto_vector(integer n, real b[ n], real c[n]) ! ! Esta funcin calcula el producto traspuesto(b) por el vector c. ! Descripcin de parmetros: ! n Nmero de elementos de b y c. ! b Vector. ! c Vector. ! El resultado es el escalar r. ! entero i real r r = 0.0 ejecuta i = 1, n r = r + b[i]*c[i] regresa r fin proc multiplicacion_vector_vector_transpuesto(integer n, real b[ n], real c[n], real &r[n, n]) ! ! Este procedimiento calcula el producto del vector b por transpuesto(c). ! Descripcin de parmetros: ! n Nmero de elementos de b y c; nmero de filas y de columnas de r. ! b Vector. ! c Vector. ! r Matriz, producto b*transpuesto(c). ! entero i, j ejecuta i = 1, n { ejecuta j = 1, n r[i, j] = b[i]*c[j] } regresa fin proc identidad(entero n, real &I[n, n]) ! ! Este procedimiento genera la matriz identidad de orden n. 79

! Descripcin de parmetros: ! n Nmero de filas y de columnas de I. ! I Matriz identidad. ! entero k, j ejecuta k = 1, n { ejecuta j = 1, n I[k, j] = 0.0 } ejecuta k = 1, n I[k, k] = 1.0 regresa fin proc multiplicacion_matrices(integer m, integer n, integer p, real A[m, n], real B[n, p], real &C[m, p]) ! ! Este procedimiento calcula el producto matricial C=A por B. ! Descripcin de parmetros: ! m Nmero de filas de A. ! n Nmero de columnas de B. ! p Nmero de columnas de A y nmero de filas de B ! C Matriz C = A*B. ! entero i, j, k ejecuta i = 1, m { ejecuta j = 1, p { C[i, j] = 0.0 ejecuta k = 1, n C[i, j] = C[i, j] + A[i, k]*B[k,j] } } regresa fin

4.4 Mtodo del descenso ms brusco El problema de encontrar una solucin aproximada del sistema no lineal

80

f1(x1, x2, x3, ..., xn ) = 0 f2(x1, x2, x3, ..., xn ) = 0 f3(x1, x2, x3, ..., xn ) = 0 . . . . . . . . . fn(x1, x2, x3, ..., xn ) = 0 puede transformarse en otro equivalente: encontrar el mnimo de la funcin G(x1, x2, x3, ..., xn ) = G(x) definida por G(x) =f 1(x1, x2, x3, ..., xn )2 + f2(x1, x2, x3, ..., xn )2 + f3(x1, x2, x3, ..., xn )2 + ..... + fn(x1, x2, x3, ..., xn )2 El mnimo global de G(x) = 0 coincide con la solucin de f(x) = 0. Por lo tanto, cualquier mtodo de optimizacin multivariable sin restricciones al determinar el mnimo global de G(x) tambin encuentra la solucin de f(x). En este tipo de mtodos; una nueva estimacin x(k+1) se obtiene a partir de la estimacin anterior x(k) y una direccin de bsqueda representada por el vector s(k): x(k+1) = x(k) + (k) s(k) El escalar (k) determina la magnitud del desplazamiento en la direccin s(k) . En el mtodo del descenso ms brusco, la direccin de bsqueda es el negativo del vector gradiente de la funcin G. Frecuentemente el gradiente de una funcin G es denotado por LG y su i-sima componente es la derivada parcial de G con respecto a xi :

81

El gradiente LG(x(k)) representa la direccin del mximo cambio en el valor de la funcin G a partir del punto x(k). Por lo tanto, como en el mtodo del descenso ms brusco: s(k) = - LG(x(k)) entonces la ecuacin que lo define es: x(k+1) = x(k) - (k) LG(x(k))

El valor de (k) se escoge de tal forma que el valor de G(x(k+1) = x(k) - (k) LG(x(k)) ) sea un mnimo. Este proceso se conoce como bsqueda a travs de una lnea (line search). Ejemplo Encuentre una raz aproximada del sistema f1(x1, x2) = x12 + x22 - 4 = 0 f2(x1, x2) = x1 x2 - 1 = 0 con el mtodo del descenso ms brusco. Comience con x(0) = [2, 0]T y considere el criterio de convergencia 2x(k+1) - x(k)22 < 1X10-4 . G(x1, x2) = f1(x1, x2)2 + f2(x1, x2)2 = [x12 + x22 - 4]2 + [x1 x2 - 1]2 LG(x1, x2) = [MG /Mx1 , MG /Mx2]T LG(x1, x2) = [2 (x12 + x22 - 4) 2 x1 + 2 (x1 x2 - 1) x2 , 2 (x12 + x22 - 4) 2 x2 + 2 (x1 x2 - 1) x1 ]T LG(x1(0), x2(0)) = [2(2.000002 + 0.000002 - 4)(2)(2.00000) + 2((2.00000)(0.00000) -1)(0.00000), 2(2.000002 + 0.000002 - 4)(2)(0.00000) + 2((2.00000)(0.00000) -1)(2.00000)] LG(x1(0), x2(0)) = [0.00000, -4.00000] x(1) = x(0) - (0) LG(x(0)) = [2.00000, 0.00000]T - (0) [0.00000, -4.00000]T Para encontrar el valor de (0) que minimiza a G(x(1)) = G(x(0) - (0) LG(x(0))) se requiere realizar una bsqueda a travs de una lnea (line search). Este proceso consta de dos partes: 1.- Encontrar un intervalo [a, b] el cual contiene al mnimo de G(x(1)). Esta fase es conocida como encajonamiento (bracketing). 2.- Aplicar una tcnica numrica, tal como la bsqueda unidimensional con la seccin dorada, para aislar al mnimo de G(x(1)). Para comenzar el encajonamiento, tome los valores a0 = 0 y a1 = a0 + a = 0 + 0.10 = 0.10 y evale 82

G en x(0) - a0 LG(x(0)) y en x(0) - a1 LG(x(0)): G(x(0) - a0 LG(x(0))) = G(x(0) - (0) LG(x(0)) = G([2.00000, 0.00000]T) G([2.00000, 0.00000]T) = (2.000002 + 0.000002 - 4)2 + (2.00000(0.00000) - 1)2 = 1.00000 G(x(0) - a1 LG(x(0))) = G(x(0) - 0.10000 LG(x(0)) = G([2.00000, 0.40000]T) G([2.00000, 0.40000]T) = (2.000002 + 0.400002 - 4)2 + (2.00000(0.40000) - 1)2 = 0.06560 Como G(x(0) - a1 LG(x(0))) < G(x(0) - a0 LG(x(0))) entonces el proceso debe continuar hasta que se encuentre un escalar aj tal que G(x(0) - aj LG(x(0))) > G(x(0) - aj-1 LG(x(0))) . Si G(x(0) - a1 LG(x(0))) hubiera sido mayor o igual que G(x(0) - a0 LG(x(0))) , entonces el valor de a tendra que ser reducido hasta que G(x(0) - a1 LG(x(0))) < G(x(0) - a0 LG(x(0))). a2 = a1 + a = 0.10 + .10 = 0.20 , (en general, aj = aj-1 + a ) G(x(0) - a2 LG(x(0))) = G(x(0) - 0.20000 LG(x(0)) = G([2.00000, 0.80000]T) G([2.00000, 0.80000]T) = (2.000002 + 0.800002 - 4)2 + (2.00000(0.80000) - 1)2 = 0.76960 Como G(x(0) - a2 LG(x(0))) > G(x(0) - a1 LG(x(0))), entonces el encajonamiento tuvo xito y el mnimo de G(x(0) - (0) LG(x(0))) est contenido en el intervalo [a, b] = [0, .20]. La bsqueda unidimensional con seccin dorada es una tcnica de optimizacin basada en la eliminacin de regiones: dados los extremos del intervalo, [a,b], se evala la funcin objetivo G en dos puntos intermedios p y q que se calculan con las frmulas p = a + fs*l = a + fs*(b - a) q = b - fs*l = b - fs*(b - a) donde fs es un factor constante, fs = (3 - o5) / 2 = .3819660112501.... , y se desecha entre las regiones [a, p] y [q, b], la que reporta los valores ms altos de G. El procedimiento finaliza hasta que la longitud final del intervalo sea una fraccin del intervalo original o bien limitando los clculos a un nmero predeterminado de experimentos. Primer experimento: a = 0 , b = 0.20 p = a + fs*l = 0 + .38197*(.20 - 0) = 0.07639 q = b - fs*l = .20 - .38197*(.20 - 0) = 0.12361 G(x(0) - p LG(x(0))) = G([2.00000, 0.00000]T - 0.07639 [0.00000, -4.00000]T) G(x(0) - p LG(x(0))) = G([2.00000, 0.30556]T) = (2.000002 + 0.305562 - 4)2 + (2.00000(0.30556) - 1)2 = 0.15995 G(x(0) - q LG(x(0))) = G([2.00000, 0.00000]T - 0.12361 [0.00000, -4.00000]T) G(x(0) - q LG(x(0))) = G([2.00000, 0.49444]T) = (2.000002 + 0.494442 - 4)2 83

+ (2.00000(0.49444) - 1)2 = 0.05989 Como los valores ms altos de G estn en [0, .07639], esta regin se desecha y los nuevos lmites del intervalo sern entonces a = .07639 y b = .20. Segundo experimento: a = 0.07639 , b = 0.20 p = a + fs*l = 0.07639 + .38197*(.20 - 0.07639) = .12361 q = b - fs*l = .20 - .38197*(.20 - 0.07639) = 0.15279 A partir del segundo experimento, uno de los puntos intermedios coincide con alguno de los puntos intermedios del experimento anterior. G(x(0) - p LG(x(0))) = G([2.00000, 0.00000]T - 0.12361 [0.00000, -4.00000]T) =0 .05989 G(x(0) - q LG(x(0))) = G([2.00000, 0.00000]T - 0.15279 [0.00000, -4.00000]T) G(x(0) - q LG(x(0))) = G([2.00000, 0.61112]T) = (2.000002 + 0.611122 - 4)2 + (2.00000(0.61112) - 1)2 = 0.18887 Ahora los valores ms altos de G estn en [.15279, .2] por lo que este intervalo se desecha y los nuevos lmites son a = 0.07639 y b = 0.15279. Tercer experimento: a = 0.07639 , b = 0.15279 p = a + fs*l = 0.07639 + .38197*(0.15279 - 0.07639) = 0.10557 q = b - fs*l = 0.15278 - .38197*(0.15279 - 0.07639) = 0.12361 G(x(0) - p LG(x(0))) = G([2.00000, 0.00000]T - 0.10557 [0.00000, -4.00000]T) G(x(0) - p LG(x(0))) = G([2.00000, 0.42228]T) = (2.000002 + 0.422282 - 4)2 + (2.00000(0.42228) - 1)2 = 0.05596 G(x(0) - q LG(x(0))) = G([2.00000, 0.00000]T - 0.12361 [0.00000, -4.00000]T) = 0.05989 Como en [0.12361, 0.15279] se tienen los valores ms grandes de G, entonces los nuevos lmites son a = 0.07639 y b = 0.12361.

Experimento 1 2 3

a 0.00000 0.07639 0.07639

p 0.07639 0.12361 0.10557

q 0.12361 0.15279 0.12361

b 0.20000 0.20000 0.15279

84

4 5 6 7 8 9 10

0.07639 0.94443 0.10557 0.10557 0.10983 0.11246 0.11246

0.94443 0.10557 0.11246 0.10983 0.11246 0.11409 0.11347

0.10557 0.11246 0.11672 0.11246 0.11409 0.11509 0.11409

0.12361 0.12361 0.12361 0.11672 0.11672 0.11672 0.11509

Se toma como valor definitivo a (0) = (a + b) / 2 = (0.11246 + 0.11509) / 2 = 0.11378 , y la nueva estimacin x(1) es: x(1) = x(0) - (0) LG(x(0)) = [2.00000, 0.00000]T - 0.11378 [0.00000, -4.00000]T x(1) = x(0) - (0) LG(x(0)) = [2.00000, 0.45511]T 2x(1) - x(0) 22 = %(2.00000 - 2.00000)2 + (0.00000 - 0.45511)2 ) = 0.45511 Como 2x(1) - x(0) 22 $ 1X10-4, ser necesario calcular al menos una iteracin ms: Iteracin k 0 1 2 3 4 5 6 7 8 9 10 x1(k) 2.00000 2.00000 1.95196 1.94854 1.93714 1.93516 1.93275 1.93249 1.93204 1.93197 1.93188 x2k) 0.00000 0.45511 0.45456 0.50356 0.50270 0.51547 0.51510 0.51716 0.51711 0.51756 0.51755 0.11378 0.03050 0.11966 0.03050 0.14033 0.03050 0.13344 0.03050 0.14296 0.03050 0.45511 0.04858 0.04558 0.01227 0.01078 0.00278 0.00181 0.00050 0.00038 0.00010 (k) 2x(k) - x(k-1)22

85

11

1.93187

0.51762

0.13444

0.00006

La gran ventaja del mtodo del descenso ms brusco es que no se requiere de una estimacin inicial cercana a la solucin. Cuando se alcanza la convergencia lo hace casi siempre de una forma muy lenta, ya que exhibe convergencia lineal frecuentemente agravada por un comportamiento oscilatorio. Otra dificultad en este mtodo es que no se descarta la convergencia hacia un mnimo local, el cual no coincide con la solucin del sistema no lineal de ecuaciones. Si la complejidad del sistema de ecuaciones es considerable, no es sencillo encontrar el gradiente de la suma de los cuadrados de las funciones. En esta caso tambin se recomienda estimar los componentes del vector gradiente mediante frmulas de diferencias finitas. A continuacin, el pseudocdigo de un procedimiento que encuentra una solucin aproximada de un sistema de ecuaciones no lineales. proc descenso_mas_brusco(entero n, real &x[n], real tolerancia, entero maxiter, proc funs, proc gradiente, entero &codigo_error) ! ! Solucin aproximada de un sistema de ecuaciones no lineales f(x) = 0 con el mtodo del ! descenso ms brusco. ! Descripcin de parmetros: ! n Nmero de ecuaciones y de incgnitas ! x Vector, de longitud n, que en la llamada contiene una estimacin inicial de ! la solucin x. En el regreso, contendr a la ltima iteracin calculada. ! tolerancia Mximo error permitido. Si la norma euclidiana de la diferencia entre las ltimas dos iteraciones es menor que tolerancia, se considera haber llegado ! a la solucin. ! maxiter Nmero mximo de iteraciones. ! funs Procedimiento que calcula el valor de las ecuaciones f(x) = 0 evaluadas en ! vector x: ! proc funs(entero n, real x[n], real f[n]) ! n Nmero de ecuaciones y de incgnitas. ! x Vector de incgnitas. De longitud n. ! f Vector de ecuaciones evaluadas en x. De longitud n. ! gradiente Procedimiento que calcula el gradiente de la funcin G = f[1]82 + f[2]82 + ! ... + f[n]82, evaluado en el vector x: ! proc gradiente (entero n, real x[n], real nabla[n]) ! n Nmero de ecuaciones y de incgnitas. ! x Vector de incgnitas. De longitud n. ! nabla Vector gradiente de G evaluado en x. De longitud n. ! codigo_error Bandera cuyo valor indica el tipo de situacin encontrada: ! codigo_error = 0 Sin error. El vector x tambin es la solucin del ! sistema. ! codigo_error = 1 No se alcanz la convergencia despus de maxiter 86

! iteraciones. ! codigo_error = 2 La norma del vector gradiente es muy cercana a cero. ! codig0_error = 3 Error en la bsqueda a travs de una lnea. ! real norma, line_search, alfa, norma_gradiente entero iter, i real x0[n], nabla[n], s[n], suma, delta codigo_error = 0 ejecuta i = 1, n x0[i] = x[i] ejecuta iter = 1, maxiter { llama gradiente(n, x0 ,nabla) ! evaluacin del vector gradiente suma = 0.0 ejecuta i = 1, n suma = suma + nabla[i]82 norma_gradiente = SQRT(suma) si norma_gradiente < 1X10-10 entonces { codigo_error = 2 regresa } ! ! bsqueda unidimensional de alfa de tal forma que G(x0 + alfa*s) sea un mnimo ! ejecuta i = 1, n s[i] = -nabla[i] delta = 0.10 alfa = line_search(n, x0, s, delta, funs) si delta < 0.0001 o delta > 10.0 entonces { codigo_error = 3 regresa } suma = 0.0 ejecuta i = 1, n { x[i] =x0[i] + alfa*s[i] ! clculo de la nueva iteracin x suma = suma + (x[i] - x0[i])82 } norma = SQRT(suma) ! se checa la convergencia si norma < tolerancia entonces regresa 87

ejecuta i = 1, n x0[i] = x[i] } codigo_error = 1 regresa fin

! se prepara una nueva iteracin

! sin convergencia

func line_search(entero n, real x[n], real s[n], real &delta , proc funs) ! ! Esta funcin encuentra el valor de alfa que minimiza la funcin objetivo G evaluada en ! x + alfa*s. Se supone que G es una funcin unimodal. G se define como la suma de los ! cuadrados de las ecuaciones ! real f[n], alfa entero i, nexp real suma, alfa0, alfa1, alfa2, G0, G1, G2, a, b, fs, l, p, q, Gp, Gq real xarg[n] ! ! bsqueda de un intervalo [a, b] que contiene el mnimo de G(x+delta*s). Esta bsqueda se ! conoce como encajonamiento (bracketing) ! alfa0 = 0.0 llama funs(n, x, f) suma = 0.0 ejecuta i = 1, n suma = suma + f[i]82 G0 = SQRT(suma) alfa1 = alfa0 + delta ! delta es el incremento inicial para alfa llama funs(n, x + alfa1*s, f) suma = 0.0 ejecuta i = 1, n suma = suma + f[i]82 G1 = SQRT(suma) si G1 $ G0 entonces { repite si delta < .0001 entonces regresa delta = delta / 2.0 ! se reduce delta hasta que G1 > G0 alfa1 = alfa0 + delta llama funs(n, x + alfa1*s, f) suma = 0.0 ejecuta i = 1, n suma = suma + f[i]82 88

G1 = SQRT(suma) hasta(G1 > G0) } otro { alfa2 = alfa1 + delta ! G1 > G0 llama funs(n, x+ alfa2*s, f) suma = 0.0 ejecuta i = 1, n suma = suma + f[i]82 G2 = SQRT(suma) mientras(G2 # G1) { alfa0 = alfa1 alfa1 = alfa2 G0 = G1 G1 = G2 alfa2 = alfa1 + delta si alfa2 > 10.0 entonces regresa llama funs(n, x + alfa2*s, f) suma = 0.0 ejecuta i = 1, n suma = suma + f[i]82 G2 = SQRT(suma) } } a = alfa0 ! el encajonamiento tuvo xito b = alfa2 ! ! bsqueda unidimensional con seccin dorada ! fs = (3.0 - SQRT(5.0)) / 2.0 l=b-a p = a + fs*l q = b - fs*l llama funs(n, x + p*s, f) suma = 0.0 ejecuta i = 1, n suma = suma + f[i]82 Gp = SQRT(suma) llama funs(n, x + q*s, f) suma = 0.0 ejecuta i = 1, n 89

suma = suma + f[i]82 Gq = SQRT(suma) ejecuta nexp = 2, 10 ! se limita el nmero de experimentos a 10 { si Gp > Gq entonces { a=p p=q Gp = Gq l=b-a q = b - fs*l llama funs(n, x + q*s, f) suma = 0.0 ejecuta i = 1, n suma = suma + f[i]82 Gq = SQRT(suma) } otro } b=q q=p Gq = Gp l=b-a p = a + fs*l llama funs(n,x + p*s, f) suma = 0.0 ejecuta i = 1, n suma = suma + f[i]82 Gp = SQRT(suma) } } alfa = (a + b) / 2 ! alfa es el valor devuelto regresa alfa fin

90

Potrebbero piacerti anche