Está en la página 1de 17

Control de Procesos

Tarea:
Reactor CSTR de Primer Orden – Isotérmico

Autor:
Mario Alberto Lugo Valadez

Catedrático:
Dr. Héctor Hernández Escoto

Fecha de entrega:
27 de noviembre del 2023
1. Evaluar la EDO correspondiente con las condiciones nominales asignadas
a la misma para el reactor CSTR:

F
Ċ=−k ( T ) C a + ( C −C a ),
V e
( F ,C e , T ) → C

Condiciones nominales
3
ft
F=40
h
mol ∙lb
C e =0.55 3
ft
T =590.35 R
3
V =48 ft
−E
k =α e RT
10 1
α =7.08 x 10
h
BTU
E=30,000
mol ∙ lb
BTU
R=1.9872
mol ∙ lb ∙ R
BTU
−30000
mol ∙lb
BTU
1 1.9872 mol ∙lb ∙R ∗590.35 R
10
k =(7.08 x 10 )e =0.55477
h
Ingresando la ecuación y las condiciones nominales a Python, se obtiene la siguiente gráfica:

25 de noviembre de 2023 1
I TIEMPO (S) CONCENTRACIÓN

0 0.0 0.000000
1 0.4 0.140681
2 0.8 0.221423
3 1.2 0.267763
4 1.6 0.294359
5 2.0 0.309624
6 2.4 0.318385
7 2.8 0.323413
8 3.2 0.326298
9 3.6 0.327955
10 4.0 0.328905
11 4.4 0.329451
12 4.8 0.329764
13 5.2 0.329944
14 5.6 0.330047
15 6.0 0.330106
16 6.4 0.330140
17 6.8 0.330159

25 de noviembre de 2023 2
18 7.2 0.330171
19 7.6 0.330177
20 8.0 0.330181
21 8.4 0.330183
22 8.8 0.330184
23 9.2 0.330185
24 9.6 0.330185
25 10.0 0.330185
26 10.4 0.330186
27 10.8 0.330186
28 11.2 0.330186
29 11.6 0.330186
30 12.0 0.330186
31 12.4 0.330186

Donde también se aprecia que el estado estacionario se logra a los 10.4 segundos con una
mol ∙lb
concentración final de 0.330186 3 .
ft
De manera analítica, para comprobar que esto se sea verídico y evitar cualquier clase de
sesgo al momento de realizar la simulación numérica de manera computacional, se tiene que:

Ċ=0
Por lo tanto:
F
0=−k ( T ) C a + ( C −Ca )
V e
F F
0=−k C a+ C− C
V e V a

Factorizando C a
F F
0=−C a (k + )+ C
V V e
F F
C a (k + )= C e
V V

25 de noviembre de 2023 3
Despejando C a
F
C
V e
C a=
F
(k + )
V

Sustituyendo
3
ft
40
h mol ∙ lb
3
∙ 0.55 3
48 ft ft mol ∙lb
C a= 3
=0.330186 3
ft ft
40
1 h
(0.55477 + )
h 48 ft 3

Consecuentemente, en efecto, la concentración final alcanzada es exactamente la misma


calculada de tanto de manera analítica como computacional.

2. Linealización de la ecuación mediante Series de Taylor:


F
Ċ=−k ( T ) C a + ( C −C a )
V e

Para llegar a su forma (no se considera T al ser isotérmico):


~
˙ ~ ~ ~
C=a Ca+ b1 F +b 2 Ce

Donde las variables de desviación y sus derivadas parciales:

a=
[ ]
∂f
∂ Ca ( C a=C a0)
=−k ( T )−
F
V

b 1= [ ]
∂f
∂F ( F= F0)
=
C Ae−C A
V

b 2=
[ ] ∂f
∂ Ce ( C e =C e0)
=
F
V

25 de noviembre de 2023 4
Sustituyendo:

a=
[ ]∂f
∂ Ca ( C a=C a0)
=−0.55477−
40
48
=−1.388

b 1=
[ ]
∂f
∂F ( F= F0)
=
0.55−0.330186
48
=0.00457

b 2=
[ ]∂f
∂ Ce ( C e =C e0)
=
40
48
=0.8333

~
˙ ~ ~ ~
C=−1.3881 Ca+0.00457 F +0.8333 Ce

Por lo tanto:
τ KP
CA
KP
F
KP
Ce

ts 2.8
τ= = =0.7 -1.3881 0.00457 0.8333
4 4

~ C ~ F~ C~
τ C˙ + K P Ca=K P F+ K P Ce
A e

~ ~ ~ ~
0.7 C˙ +1.3881 Ca=0.00457 F+0.8333 Ce

Gráficamente se tiene:

25 de noviembre de 2023 5
Donde también se aprecia que el estado estacionario se logra a los 10 segundos con una
mol ∙lb
concentración final de 0.461865 3 .
ft
Para conocer las ganancias del sistema con una desviación del 2% en cada una de las
variables se tiene:
~
F=±2 % ∙ ( 40 )=± 0.8
~
Ce=± 2 % ∙ ( 0.55 )=±0.011
~
Para la desviación en F :

25 de noviembre de 2023 6
~
Para la desviación en Ce :

Donde:
DESVIACIÓN VALOR CA ∆ Ca TS GANANCIA(K)

~ 40.8 0.464499 0.002634 2.8 0.0048


∆F
39.2 0.459231 0.002634 2.8 0.00435

~ 0.561 0.468469 0.006604 2.8 0.85


∆ Ce
0.539 0.455262 0.006604 2.8 0.81666

Por lo tanto, considerando el promedio de las 3 ganancias:

F
KP 0.0045733
Ce
KP 0.833322

τ 0.7

De:
~ ~ F~ C~
τ C˙ + Ca=K P F + K P Cee

~ ~ ~ ~
0.7 C˙ + Ca=0.0045733 F+ 0.83332 Ce

25 de noviembre de 2023 7
~ ~ ~
˙C=−C A +0.0045733 F +0.83332 Ce
~
0.7

Sistema de Control

En un sistema de control de tipo PI o PID, es necesaria la retroalimentación mediante


sensores y transmisores cuyos cuales son esenciales para la respuesta del control del proceso
mediante actuadores y controladores como se presenta en el anterior diagrama, para ello es
necesario conocer las ganancias estáticas óptimas para lograr las condiciones deseadas y
requeridas de las variables del proceso.

Controlador PI (Proporcional-Integral)
KC
F=F+ K c (C−C)+∫ (C−C)dτ
τI
Donde:
KC
=K I Ganancia Integral
τI

3. Realizar el análisis de estabilidad del sistema de control

Partiendo de la ecuación:

τ~
C˙ A +~
C A=K C ~
C Ae + K F ~
Ae
F

25 de noviembre de 2023 8
~ ~ ~ ~
0.7 C˙ + Ca=0.0045733 F+ 0.83332 Ce

El sistema de control en términos de la variable de desviación se tiene que:


~
C=C−C

~ ~ KC ~
F=K c C +∫ C dτ
τI
~
Sustituyendo F en:
~ ~ ~ ~
τ C˙ A + C A=K c C e + K I F

~ ~ ~
[ ~
τ C˙ A + C A=K c C e + K I K c C +∫
KC~
τI
C dτ
]
Se deriva nuevamente para eliminar la integral:

~ ~ ~ ~ KC ~
τ C¨ A + C˙ A=K C C˙ Ae + K F K c C˙ A + K F C
Ae
τI

Reacomodando:

~ ~ KC ~ ~
τ C¨ A + C˙ A ( 1−K F K c )−K F C=K C C˙ Ae
τI Ae

Reesc

( τ τI
−K F K C
~
)
C¨ A +
( 1− K F K c ) τ I ~˙ ~ τ I K C ~˙
−K F K C
C A + C= C
−K F K C Ae

Criterios de estabilidad
τ τI
>0
−K F K C

( 1−K F K c ) τ I
>0
−K F K C
τ τI
Analizando primero >0:
−K F K C

25 de noviembre de 2023 9
Tanto τ como K F son positivos, entonces hay dos opciones para que la expresión sea mayor
que cero
1. Si τ I >0 , por lo tanto, K C <0
2. Si τ I <0 , por lo tanto, K C >0

( 1−K F K c ) τ I
Analizando >0 :
−K F K C

( 1−K F K c ) τ I
>0
−K F K C
1−K F K c >0
1
Kc<
KF

Para el análisis de los criterios de estabilidad para conocer la zona de aceptación de los
valores dados para cada una de las ganancias, si se considera este último criterio para la
ganancia proporcional esta misa estará en un rango positivo de valores para la misma en
algún momento dado, tomando en cuenta esto, τ I < 0, y si Kc < 0, por consecuente, τ I > 0.
Superficie de respuesta con escenario de prueba de -1 % en la temperatura, Kc, Ki, e IAE
graficados.

25 de noviembre de 2023 10
Anexos (Códigos)
1. Ecuación No Lineal Reactor CSTR
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
import pandas as pd
import math

#Función de cambio definida previamente


def funcionCSTR(c, t):
global R, T, E, alpha
R = 1.9872 # Btu/mol*lb*R
T = 590.35 # Rankine
E = 30000 # Btu/mol*lb
alpha = 7.08e10 # 1/h
Cae = 0.55 # mol*lb/ft3
V = 48 #ft3
F = 40 #ft3/h
k = alpha * math.exp(-E / (R * T))
dcadt = -k*c+(F/V)*(Cae-c)
return dcadt

# Condiciones iniciales
c0 = 0

# Tiempo inicial y final


t0 = 0
tf = 20

# Puntos de solución-graficación
n = 50

# Vector de puntos de solución-graficación


tiempo = np.linspace(t0, tf, n+1)

# Resolución del sistema de EDOs


c = odeint(funcionCSTR, c0, tiempo)

# Graficación de trayectorias de variables de estado


plt.figure(1)
plt.plot(tiempo, c)
plt.grid()
plt.xlabel('Tiempo')
plt.ylabel('Ca (mol*lb/ft3)')
plt.title('Ca vs tiempo')

25 de noviembre de 2023 11
plt.legend(['Concentración (mol*lb/ft3)'])
plt.show()

# Crear un DataFrame de pandas para tabular los valores


data = pd.DataFrame({'Tiempo': tiempo[:51], 'Concentración (mol/L)': c[:51,
0]})

# Mostrar el DataFrame
print(data)

2. Ecuación Linealizada
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
import pandas as pd

# Función de cambio definida previamente


def funcionLineal(c_final, t, F_nominal, Cae_nominal):
dc_dt = -1.3881 * c_final + 0.00457 * F_nominal + 0.8333 * Cae_nominal
return dc_dt

# Condiciones iniciales
c0 = 0

# Tiempo inicial y final


t0 = 0
tf = 20

# Puntos de solución-graficación
n = 50

# Vector de puntos de solución-graficación


tiempo = np.linspace(t0, tf, n+1)

# Valores de Ce y F a evaluar
Ce_values = [0.55, 0.561, 0.539]
F_values = [40] #[40, 40 + 0.8, 40 - 0.8]

# Crear una sola gráfica para todas las evaluaciones


plt.figure(figsize=(10, 6))

# Crear un DataFrame para almacenar los valores


data = pd.DataFrame({'Tiempo': tiempo})

for Ce in Ce_values:
for F in F_values:

25 de noviembre de 2023 12
# Resolución del sistema de EDOs para los valores específicos de Ce y
F
c = odeint(funcionLineal, c0, tiempo, args=(F, Ce))

# Almacenar los valores en el DataFrame


data[f'Concentración (mol/L) (Ce={Ce}, F={F})'] = c[:, 0]

# Graficación de trayectorias de variables de estado


plt.plot(tiempo, c, label=f'Ce={Ce}, F={F}')
'''
for F in F_values:
# Resolución del sistema de EDOs para el valor específico de F
c = odeint(funcionLineal, c0, tiempo, args=(F, Ce_values[0]))

# Almacenar los valores en el DataFrame


data[f'Concentración (mol/L) (Ce={Ce_values[0]}, F={F})'] = c[:, 0]

# Graficación de trayectorias de variables de estado


plt.plot(tiempo, c, label=f'Ce={Ce_values[0]}, F={F}')
'''
plt.grid()
plt.xlabel('Tiempo')
plt.ylabel('Ca (mol*lb/ft3)')
plt.title('Ca vs tiempo')
plt.legend()
plt.show()

# Imprimir el DataFrame con los valores


print(data)

3. Gráfica Lineal vs. No Lineal


import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
import pandas as pd
import math

# Función de cambio original


def funcionCSTR(c, t):
global R, T, E, alpha
R = 1.9872 # Btu/mol*lb*R
T = 590.35 # Rankine
E = 30000 # Btu/mol*lb
alpha = 7.08e10 # 1/h
Cae = 0.55 # mol*lb/ft3
V = 48 # ft3

25 de noviembre de 2023 13
F = 40 # ft3/h
k = alpha * math.exp(-E / (R * T))
dcadt = -k * c + (F / V) * (Cae - c)
return dcadt

# Nueva función de cambio


def FuncionLineal(c_final, t):
global Cae_nominal, F_nominal
Cae_nominal = 0.55
F_nominal = 40
dc_dt = -1.3881 * c_final + 0.00457*F_nominal + 0.8333 * Cae_nominal
return dc_dt

# Condiciones iniciales
c0 = 0
c_tilde0 = 0

# Tiempo inicial y final


t0 = 0
tf = 20

# Puntos de solución-graficación
n = 50

# Vector de puntos de solución-graficación


tiempo = np.linspace(t0, tf, n+1)

# Resolución del sistema de EDOs original


c = odeint(funcionCSTR, c0, tiempo)

# Resolución del sistema de EDOs nueva


c_tilde = odeint(FuncionLineal, c_tilde0, tiempo)

# Graficación de trayectorias de variables de estado


plt.figure(1)
plt.plot(tiempo, c, label='No lineal')
plt.plot(tiempo, c_tilde, label='Lineal')
plt.grid()
plt.xlabel('Tiempo')
plt.ylabel('Concentración')
plt.title('Lineal vs. No Lineal')
plt.legend()
plt.show()

# Crear DataFrames de pandas para tabular los valores


data_original = pd.DataFrame({'Tiempo': tiempo[:51], 'No Lineal': c[:51, 0]})
data_nueva = pd.DataFrame({'Tiempo': tiempo[:51], 'Lineal': c_tilde[:51, 0]})

25 de noviembre de 2023 14
# Mostrar los DataFrames
print("Datos ec. No lineal:")
print(data_original)

print("\nDatos ec. Lineal:")


print(data_nueva)

4. Superficie de respuesta
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Definicion de la funcion para las EDOs


def funciones(x, t, F_nominal, CAeN, V, T_nominal, R, alfa, E, cN, KC, KI):
c, ie, IAE = x

# Definicion de Entrada
CAe = CAeN
F = F_nominal
T = T_nominal - 0.01 * T_nominal

# Cinética
k = alfa * np.exp(-E / R * T)

# Controlador
F_ctrl = F_nominal + KC * (c - cN) + KI * ie

# Funciones de cambio
dcdt = -k * c + (F_ctrl / V) * (CAe - c)
diedt = c - cN
dIAEdt = abs(c - cN)

return [dcdt, diedt, dIAEdt]

# Asignacion de valores a Parametros


F_nominal = 40
CAeN = 0.55
V = 48
T_nominal = 590.35
R = 1.9872
alfa = 7.08e+10
E = 30000
cN = 0.46215

# Condiciones iniciales
c0 = 0.46125

25 de noviembre de 2023 15
ie0 = 0
IAE0 = 0
x0 = [c0, ie0, IAE0]

# Tiempo Inicial y final


t0 = 0
tf = 7

# Valores para KC y KI
KC_values = np.arange(0, 0, 1)
KI_values = np.arange(-100, 110, 10)

# Matrices para almacenar los resultados


KC_mesh, KI_mesh = np.meshgrid(KC_values, KI_values)
IAE_results = np.zeros_like(KC_mesh, dtype=float)

# Iterar sobre valores de KC y KI


for i, KC in enumerate(KC_values):
for j, KI in enumerate(KI_values):
sol = odeint(funciones, x0, np.linspace(t0, tf, 100),
args=(F_nominal, CAeN, V, T_nominal, R, alfa, E, cN, KC,
KI))
IAE_results[j, i] = np.trapz(np.abs(sol[:, 2]), dx=(tf - t0) / 100)

# Graficacion de superficie
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(KC_mesh, KI_mesh, IAE_results, cmap='viridis')

ax.set_xlabel('KC')
ax.set_ylabel('KI')
ax.set_zlabel('IAE')
ax.set_title('Superficie de respuesta para IAE para diferentes valores de Kc y
Ki')

plt.show()

25 de noviembre de 2023 16

También podría gustarte