• No se han encontrado resultados

Implementacion de grandes expresiones y derivadas

De no ser por la ayuda de los ordenadores, la obtencion de formulas tales como las que han precedido en secciones previas sera un duro y tedioso ejercicio expuesto con casi toda seguridad al riesgo de cometer un error indetectable. La mayor parte de las expresiones que

han hecho su aparicion en este captulo han sido obtenidas con Mathematica, un popular

programa dedicado al calculo simbolico y numerico [WOLF91].

La estructura de E[G] y E[G2], especialmente en los casos segundo y tercero, permite

un uso eciente de esta herramienta, y obtener resultados parciales segun un bloque i. El

programa ha demostrado su utilidad tambien en la vericacion de resultados que haban sido producidos \a mano". Pero donde se ha obtenido el maximo aprovechamiento de herramientas informaticas aplicadas al problema que nos ocupa ha sido en la generacion

de codigo Fortran que implementa las operaciones que conducen al calculo de E[G] y E[G2].

En este caso el programa se debe al autor, y aunque no es util para analizar cualquier tipo de expresion algebraica, s es mas que suciente como para abordar las que se presentan en este terreno.

Aunque Mathematica puede escribir en lenguaje Fortran una expresion algebraica

cualquiera, no resulta una solucion satisfactoria, ya que no produce codigo optimizado ni esta adecuado para tratar grandes expresiones. Por otro lado, esta la cuestion de que junto con la evaluacion de los componentes de las esperanzas hay que considerar la evaluacion de las derivadas; cuestion en la que es de esperar el aprovechamiento de subexpresiones comunes que intervienen en ambas partes. Por todo esto parece apropiado crear un pro- grama dedicado a generar partes de la funcion objetivo a partir de una expresion deducida

8 MODELOS ALTERNATIVOS PARA LA GENERACION ESPERADA

125

por Mathematica con el objetivo de conseguir la maxima eciencia del codigo nal.

Como el primer caso (variables independientes) puede considerarse lo bastante simple como para que su tratamiento no automatico sea suciente, nos referiremos en lo sucesivo solamente a los otros dos casos (dependencia diagonal, y dependencia total y diagonal), que comparten una estructura semejante e incluyen una dicultad adicional teniendo en cuenta la complejidad del resultado a tratar.

Ambos casos tienen en comun que E[G] y E[G2] pueden ser calculados en K 1

pasos, cada uno de ellos (digamos el i-esimo) tomando en cuenta solo las variablesX0i 1

y Xi, donde con X nos estamos reriendo a volumenes iniciales v, volumenes nalesV o

descargasd. (8.10), (8.11) y (8.15) son resultados que muestran este hecho.

De estas expresiones, se puede observar que E[G] esta relacionado con una suma de

terminos tal como:

Mcx(v0i 1)t(vi)w(V0i 1)y(Vi)z[d0i 1+d0i]

dondeM es un numero,xes unndice entre 0 y 3, ascomot;w;y;z, aunque dependiendo

de x: es decir, mientras se cumpla que t+w+y+z = x. Notese que no vale la pena

tener en cuenta el factor (d0i 1+d0i): resulta ser un factor comun a todos los terminos

y puede ser obviado de este tratamiento para ser considerado con posterioridad. De la

misma manera, se tiene que E[G2] es una suma de terminos como:

Mcxcx0(v0i 1)t(vi)w(V0i 1)y(Vi)z

(d0i 1)2 + (d0i)2+d0i 1d0i

;

donde M es otra vez un numero,x y x0 toman valor de entre 0 y 3, y t;w;y;z son enteros

que pueden variar entre 0 y 6, nuevamente dependiendo de la combinacion (x;x0): mas

exactamente, de acuerdo con la ecuacion t+w+y+z = x+x0. El factor relativo a la

descarga puede ser dejado de lado hasta el nal.

Esta estructuracion se ha adoptado porque es la que usa Mathematica al manejar

expresiones algebraicas. As, tras la denicion de un cierto metodo, se ha procedido a combinar, generar y simplicar una determinada expresion teoricamente asociada a un

bloque i. Cuando por n se obtiene el resultado nal, Mathematica produce una salida a

un chero; por ejemplo:

b0+12*b0*b1*v1+5*b1^2*v1*V1+7*b0*b2*V1^2+3*b1*b2*v1*V1^2+8*b0*b3*v1*V1^3

que se corresponde con la expresion (evidentemente es solo una muestra ilustrativa):

c0+ 12c0c1vi+ 5c21viVi+ 7c0c2(Vi)2+ 3c1c2vi(Vi)2+ 8c0c3vi(Vi)3

El programa desarrollado lee el chero generado por Mathematica de acuerdo con el

formato explicado. Se supone la siguiente equivalencia de smbolos:

v0 $v0i 1 v1 $vi V0 $V0i 1 V1 $Vi bx $cx

126

Aspectos estocasticos en la coordinacion hidrotermica a largo plazo

presiones aparecen repetidas veces, por lo que deben detectarse y generar codigo Fortran para su implementacion. Afortunadamente, las subexpresiones que se dan presentan una

estructura muy favorable. Por ejemplo, si un termino contiene vi(Vi)3, entonces existiran

otros terminos que usan las subexpresionesvi(Vi)2 y (Vi)3, e incluso viVi y (Vi)2.

Tras identicar las expresiones comunes, que se asocian a variables auxiliares, se crea un codigo acorde con los estandares de Fortran:

w 01 = 12*b0*b1 w 02 = 7*b0*b2 w 11 = 5*b1*b1 w 03 = 8*b0*b3 w 12 = 3*b1*b2 w0002 = V1*V1 w0011 = V1*y1 w0003 = w0002*V1 w0012 = w0002*y1 w0013 = w0003*y1 s 0 = b0 s 01 = w 01*(y1) s 02 = w 02*(w0002) s 11 = w 11*(w0011) s 03 = w 03*(w0013) s 12 = w 12*(w0012)

En este momento hay que recordar que Fortran no es un lenguaje que diferencie entre

mayusculas y minusculas; por esta razon, vi se identica con la variable llamada y1 en la

salida Fortran, mientras que Vi se asocia a V1.

La obtencion de derivadas es un paso casi directo. Por ejemplo, derivar respecto vi

da lugar a la siguiente expresion parcial:

Mw cx(v0i 1)t(vi)w 1(V0i 1)y(Vi)z[d0i 1+d0i]

y respecto vj, con j < i, se tiene:

Mtcx(v0i 1)t 1(vi)w(V0i 1)y(Vi)z[d0i 1+d0i]

ya que v0i 1 =v0+v1+:::+vi 1. Paraj > i, claramente la derivada es cero. En cuanto

a las derivadas respecto las variables de descarga, se trata de un calculo trivial:

@E[G]

@dj =

2Mcx(v0i 1)t(vi)w(V0i 1)y(Vi)z; si j < i Mcx(v0i 1)t(vi)w(V0i 1)y(Vi)z; si j =i

Un procedimiento similar se seguira si se considerasen terminos relacionados con

E[G2]. En nuestro ejemplo, el codigo resultante para la codicacion de las derivadas es:

z01y1 = w 01

8 MODELOS ALTERNATIVOS PARA LA GENERACION ESPERADA

127

z11y1 = w 11*(V1) z11V1 = w 11*(y1) z03y1 = w 03*(w0003) z03V1 = w 03*(3*w0012) z12y1 = w 12*(w0002) z12V1 = w 12*(2*w0011)

Finalmente, se tiene la suma de los terminos correspondientes:

suma = s 0 + s 01 + s 02 + s 11 + s 03 + s 12 z y1 = z01y1 + z11y1 + z03y1 + z12y1

z V1 = z02V1 + z11V1 + z03V1 + z12V1

Las variables que se generan llevan un nombre apropiado a su signicado; a contin- uacion se describe como se usan estas variables:

w xx0: es igual a Mc

xcx0

wtywz: es igual a (v0i 1)t(V0i 1)y(vi)w(Vi)z s x: es igual aM0cxP

nMnV arx, dondeV arxes una variable relativa a E[G] asociada

a x.

s xx0: es igual aM

0cxcx0 P

nMnV arx;x0, donde V arx;x0 es una variable relativa a E[G2]

asociada a x y x0. En estos dos casos, M

n;n0 son constantes

z xTn: derivada de los terminos en cx respecto Tn

zxx0Tn: derivada de los terminos en c

xcx0 respecto Tn

z Tn: derivada total respectoTn

En estas expresiones se debe asumir:

* x;x0, valores entre 0 y 3.

* T, se reere a la variable: v o V, segun sea y o V.

* n, se reere a 0i 1 si n=0 o i si n=1.

por ejemplo, z y1 contiene la suma de terminos relacionados con la derivada

respecto vi.

suma: es igual a la suma de los terminos que componen la expresion inicial

El ejemplo que ilustra esta parte es un caso muy simplicado que no considera las

variablesv0i 1 y V0i 1. En caso de que estuvieran presentes apareceran los smbolos que

hacen referencia a vj y Vj, conj < i. Es importante notar que, cuando se considera cierto

ndice i, las derivadas para cualquiera de los ndicesj menores quei son las mismas (pero

a medida que se incrementa i se van diferenciando los distintos ndices: as, el valor 0 es

el que interviene mas veces, y el K 1 el menos usado).

El algoritmo que genera el codigo construye posibles factorizaciones de cada termino ledo. Cuando un factor determinado es semejante a un termino que aparece en otra parte de la expresion tratada se produce una coincidencia que es aprovechada para producir codigo comun. De esta manera se va generando una secuencia de instrucciones que busca el mnimo esfuerzo computacional en cuanto a numero de operaciones a efectuar. La salida de este programa es un fragmento de codigo Fortran que puede ser facilmente insertado en una subrutina (esto es aconsejado, manteniendo los nombres usados como variables

128

Aspectos estocasticos en la coordinacion hidrotermica a largo plazo

locales). En la funcion objetivo puede haber una instruccion de llamada a la subrutina,

generalmente ubicada dentro de un bucle con el ndice variando desde 1 hasta K 1.

Puesto que no hay errores, se dispone de los gradientes correctos desde la primera ejecucion (eliminando una pesada etapa de depuracion en la codicacion de las derivadas). Ademas, al no existir operaciones duplicadas, el codigo que se ha obtenido es muy eciente, aunque la expresion matematica de partida fuera tan complicada como las que se han presentado a lo largo de este captulo.

Documento similar