En esta sección vamos a repetir el ejemplo . Vamos a iniciar un programa nuevo, aunque muchas de las partes serán similares al programa anterior.
Explicaremos el programa por partes. La primera parte es similar a ejemplos anteriores:
#!/usr/bin/env python # -*- coding: iso-8859-1 -*- from PinchPython import * import os c1 = Corriente() c2 = Corriente() c3 = Corriente() c4 = Corriente() vapor = Corriente() agua = Corriente() c1.setT0(20.) c1.setTf(180.) c1.setMCP(0.2) c1.setCoeficientePelicula(0.0006) c2.setT0(250.) c2.setTf(40.) c2.setMCP(0.15) c2.setCoeficientePelicula(0.0010) c3.setT0(140.) c3.setTf(230.) c3.setMCP(0.3) c3.setCoeficientePelicula(0.0008) c4.setT0(200.) c4.setTf(80.) c4.setMCP(0.25) c4.setCoeficientePelicula(0.0008) vapor.setT0(240.) vapor.setTf(239.) vapor.setMCP(7.50) vapor.setCoeficientePelicula(0.0030) agua.setT0(20.) agua.setTf(30.) agua.setMCP(1.) agua.setCoeficientePelicula(0.0010)
Ahora definiremos las corrientes frías y calientes para las curvas compuestas no balanceadas, que se emplearán para el cálculo de la temperatura del punto pinch:
corrientesFrias = [c1, c3] corrientesCalientes = [c2, c4]
Es necesario definir algunas listas donde guardaremos los resultados que se vayan calculando:
lista_At = [] lista_coste_area = [] lista_coste_energia = [] lista_coste_total = []
Y antes de comenzar el bucle de optimización, fijaremos el valor inicial de min:
At = 2.0 # ºC
En este punto vamos a comenzar a escribir el bucle, que para cada valor de min calculará el área de la red y los consumos del proceso, y después los costes. El valor de min para un coste mínimo es el óptimo.
while At<45.0: cFria = CurvaCompuesta(corrientesFrias) cCaliente = CurvaCompuesta(corrientesCalientes) tabla = TablaDelProblema(cFria,cCaliente,At) tPinch = tabla.getTemperaturaModificadaPinch() qc = tabla.getQC() qh = tabla.getQH() agua.setMCP(qc/10.) vapor.setMCP(qh) cFria_bal = CurvaCompuesta([c1,c3,agua]) cCaliente_bal = CurvaCompuesta([c2,c4,vapor]) red = RedIntercambiadores(cFria_bal,cCaliente_bal,tPinch,At) N_sp = red.getNumeroMinimoIntercambiadoresSobrePinch() N_bp = red.getNumeroMinimoIntercambiadoresBajoPinch() N = N_sp + N_bp try: area = red.getAreaRedMonopaso() except: print "Error calculando area." area = -999 if area > 0: coste_area = N*(10552. + 131.9*area/N) coste_energia = 120000.*qh + 10000.*qc lista_coste_area.append(coste_area) lista_coste_energia.append(coste_energia) lista_coste_total.append(coste_area+coste_energia) lista_At.append(At) At += 0.5
En este bucle calculamos la temperatura del punto pinch para cada caso, fijamos el consumo adecuado de cada servicio auxiliar, y calculamos el área de la red. Si no se ha producido ningún error en el cálculo del área, calculamos cada coste y guardamos los resultados en su lista correspondiente. El bucle continúa con un pequeño incremento de min.
Una vez que ha terminado el bucle, podemos hallar el valor óptimo de min, y escribir los resultados en un fichero para representarlos gráficamente.
posicion_optimo = lista_coste_total.index(min(lista_coste_total)) At_optimo = lista_At[posicion_optimo] file = open('supertargeting','w') for i in range(len(lista_coste_area)): file.write(str(lista_At[i])+'\t'\ +str(lista_coste_area[i])+'\t'\ +str(lista_coste_energia[i])+'\t'+\ str(lista_coste_total[i])+'\n') file.close() print "Archivo terminado" print "ATMin optimo = "+str(At_optimo)+" ºC"
Una vez que se ha terminado el fichero de resultados, podemos representarlo gráficamente con Gnuplot. En este caso, la imagen estará en el fichero optimo.png.
comando = 'echo "set terminal png small; set size .65; \ set grid; set output \'optimo.png\';\ set ylabel \'T (C)\'; set xlabel \'H (MW)\';\ plot \'supertargeting\' using 1:2 with lines title \'Coste cambiadores\'' comando += ", 'supertargeting' using 1:3 with lines title 'Coste energia'" comando += ", 'supertargeting' using 1:4 with lines title 'Coste total'" comando += '"| gnuplot' os.system(comando)
Al ejecutar este programa, se produce la siguiente salida de resultados:
Error calculando area. Error calculando area. Error calculando area. Error calculando area. Error calculando area. Archivo terminado ATMin optimo = 10.0 ºC
Como vemos, en algunos casos se ha producido errores en el cálculo del área. Hay que tener en cuenta que para valores muy altos de min el número de unidades de la red tiende a cero, y se pueden producir errores al dividir por este parámetro. La gráfica, similar a la figura , obtenida con el programa se muestra en la figura .
2004-05-30