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 plazopresiones 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 plazolocales). 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.