Uploaded by Edgar Andres Barrera Vega

OPTIMIZACIÓN Y USO DE PDE EN MODELOS MATEMATICOS

advertisement
OPTIMIZACIÓN Y USO DE PDE’s EN MODELOS
MATEMÁTICOS
Edgar Andres Barrera Vega - Cód: 02-235126
Inti Marcelo Ramon Hernandez - Cód: 02-235104
Dpto. de Ingenierı́a Mecánica y Mecatronica, Facultad de Ingenierı́a
Universidad Nacional de Colombia
Bogotá D.C.
17 de junio de 2015
Resumen
En este artı́culo se presenta el estudio y correspondiente análisis de un problemas de optimización del proceso de diseño de un resorte helicoidal sometido a una carga y frecuencia de carga
especı́ficas, con unos esfuerzos cortantes admisibles determinados. Se explica el planteamiento de
las ecuaciones y expresiones matemáticas que rigen tales casos, y la posterior implementación de
modelos computacionales para que se facilitara el estudio de tal caso. El proceso de optimización
consiste en hallar la masa mı́nima del resorte, para que soporte las cargas y frecuencias aplicadas
al mismo.
También se encuentra el estudio y correspondiente análisis de un problema relacionado con la
distrubición de la concentración de un reactivo en un reactor quı́mico cuya sección transversal es
constante. Para la resolución del mismo se recurre a la implementación de un modelo matemático
que se compone de ecuaciones diferenciales parciales, por lo que su tratamiento cambia respecto a
los modelos con ecuaciones diferenciales ordinarias.
Y por ultimo se plantea el estudio y correspondiente análisis de un problema de transferencia
de calor en una placa plana; la cual esta sometida a una fuente generadora de calor. A pesar de
que para la situación real se debe considerar la transferencia de calor por conducción, convección
y radiación, en el modelo solo se considerará el efecto ocasionado por conducción. La acción de la
fuente de calor se considerará aplicada en un punto especı́fico de la placa. Se espera plantear el
modelo matemático que permita determinar la distribución de temperatura a lo largo de la placa,
en un esquema temporal implı́cito y explı́cito.
Introducción
La modelación matemática es una herramienta que ayuda a representar situaciones, sistemas o
fenómenos de estudio de alta complejidad, facilitando la comprensión, el análisis y las predicciones
de cada caso. Los modelos pueden ser implementados en distintos campos profesionales, como las
ingenierı́as, administración, lı́neas de producción, incluso en estrategia militar y áreas de la salud.
Sin embargo, cabe aclarar que un modelo matemático representa los escenarios anteriormente descritos de manera parcial e imperfecta. La calidad y eficacia de las representaciones dependen de la
robustez y detalles del modelo, como lo son las suposiciones hechas en la descripción del objeto de
estudio.
Los elementos de un modelo se pueden clasificar en tres:Las variables independientes y parámetros:
son los que afectan el modelo pero que no son estudiados por el mismo, pueden asumir valores constantes
o variables según la naturaleza del modelo; las variables dependientes, que son los elementos que el
modelo se encarga de estudiar; y suposiciones, que incluyen los principios y leyes que rigen el modelo,
las ecuaciones constitutivas, e información adicional que pueda simplificar el modelo en algunos rasgos.
Por otro lado, la optimización es una herramienta de carácter matemático que se emplea en una
gran variedad de campos con el objetivo de encontrar la solución de una cantidad considerable de
problemas. La optimización permite mejorar distintos procedimientos y procesos, tales como el diseño
1
convencional, estrategias de mercadeo, entre otros, hallando valores máximos y mı́nimos que satisfagan
de la mejor manera una necesidad en particular.
Ası́ como hay elementos que afectan un modelo matemático, también se encuentran elementos que
afectan un proceso de optimización. En primer lugar, está la Función Objetivo, la cual es la expresión
que se quiere maximizar o minimizar según el caso. En segundo lugar están las variables de diseño,
sobre las cuales se tiene control y autonomı́a; y finalmente, están las restricciones del proceso, las cuales
son limitaciones en los valores que pueden tomar las variables de diseño, para garantizar condiciones
de funcionamiento secundarias.
1.
Caso de estudio 1 - Diseño óptimo paramétrico de un resorte helicoidal
El diseño de elementos de máquinas es uno de los procesos que hace uso de la herramienta de
optimización para aumentar la eficiencia del mismo. En este caso en particular se va a realizar la
optimización del diseño de un resorte mediante el uso de tal herramienta:
Se desea determinar la sensibilidad del proceso de optimización de diseño de un resorte helicoidal
(Ver figura 1) sometido a una carga de compresión cı́clica. Al igual que un caso de estudio presentado
anteriormente, se requieren los valores óptimos de los diferentes parámetros para resortes cuya masa
sea la mı́nima posible. En este caso, se desea conocer la sensibilidad del modelo de optimización para
diferentes combinaciones de esfuerzo cortante admisible, frecuencia de carga y para los dos valores de
carga diferente, según los valores presentados en las tablas 1, 2, y 3.
Figura 1: Esquema del resorte helicoidal
τadm1
65
τadm2
70
τadm3
75
τadm4
80
Cuadro 1: Valores de esfuerzo cortante τadm [Ksi], para estudio paramétrico.
ω01
80
ω02
90
ω03
100
ω04
110
Cuadro 2: Valores de Frecuencia de carga ω0 [Hz], para estudio paramétrico
P1
8
P2
16
Cuadro 3: Valores de Carga aplicada P [lbF], para estudio paramétrico
2
1.0.1.
Modelo de optimización
Para comenzar a diseñar el Modelo de optimización, se debe determinar los principios y leyes
fundamentales que se ven involucradas en el diseño del resorte, las variables de diseño, las restricciones
y por supuesto la función objetivo.
1.0.2.
Parámetros de diseño del resorte:
En esa sección se especifican los parámetros que participan en el funcionamiento del diseño, pero
que son independientes de otros.
Po [lbF]: Carga Aplicada → Se varı́a como parámetro de estudio;
∆ [in]: Mı́nima deformación por compresión = 0.5 [in];
Q: Número de espiras inactivas = 2;
τ [Ksi] : Esfuerzo Cortante admisible → Se varı́a como parámetro de estudio;
Dext [in]: Diámetro exterior máximo = 1.5 [in];
δ [in]: Deformación ;
ωo [Hz]: Frecuencia de carga → Se varı́a como parámetro de estudio;
omega [Hz]: Frecuencia natural del resorte;
G[psi]: Módulo de rigidez del material = 1,15E 7 [psi];
K: Constante de elástica del resorte ;
ρ [lb/in3 ]: Densidad del material = 0,283[lb/in3 ]
1.0.3.
Variables de diseño involucradas:
Los factores que se categorizan como variables de diseño son aquellos que se obtienen a raı́z de minimizar la función objetivo, partiendo de una combinación de parámetros determinados por el diseñador
y que permiten después obtener el valor de la masa del resorte.
D [in]: Diámetro medio;
d [in]: Diámetro del alambre;
N : Numero de espiras activas;
La masa minimizada M del resorte, se obtiene después al reemplazar las variables de diseño
obtenidas en la función 5.
1.0.4.
Relaciones y principios fundamentales
Para estudiar el comportamiento de este problema y poder realizar el modelo computacional del
mismo, recurrimos a las siguientes relaciones o principios que fueron tomados de [1, Eq. 10-3, 10-5 y
10-9, Pág. 503] y sirven como base inicial para el correspondiente análisis.
Ley de Hooke:
P = Kδ;
Constante elástica:
K=
(1)
d4 G
;
8D3 N
(2)
Esfuerzo cortante en un elemento curvo:
τ=
8kP D
;
πd3
donde
k=
3
(4D − d)
0,615d
+
;
(4D − 4d)
D
(3)
Frecuencia natural:
d
ω=
2πD2 N
1.0.5.
s
2
G
;
2ρ
(4)
Función objetivo del caso de estudio
Ya que el problema pide hallar los valores óptimos de los tres parámetros variables con masa
mı́nima, se determina que la función objetivo tiene que ser referente a la masa del resorte. Se parte
entonces de la definición general de masa, donde m es la masa del resorte, V el volumen total del
resorte y ρ la densidad del material. Se debe despejar la masa en función del volumen y la densidad,
de la siguiente manera:
m
→ m = ρV ;
ρ= ;
V
El volumen total del resorte, se obtiene multiplicando el área transversal del alambre, por el perimetro de una espira, por el número de espiras del resorte, de la siguiente manera:
V = (N + Q)
πd2
πD;
4
Reemplazando la expresión anterior en la fórmula de la masa, se obtiene la siguiente expresión, la
cual servirá de referencia para la función objetivo del modelo de optimización:
π 2 d2 D ρ
;
(5)
4
Teniendo ya todo establecido, se procede ahora a obtener la función objetivo a partir de la Expresión
5 observando que los términos 14 , ρ y π son constantes, por lo tanto, la parte de dicha expresión que
varia y se puede tomar como Función Objetivo es la que se presenta a continuación:
M = (N + Q)
F = (N + Q)d2 D
1.0.6.
(6)
Restricciones del caso de estudio
Las restricciones de este problema surgen de dos tipos de caracterı́sticas: De funcionamiento y
geométricas: Las restricciones provenientes del funcionamiento del resorte provienen de las relaciones
y principios fundamentales considerados anteriormente, explı́citamente mostrados desde la expresión 1
hasta la expresión 4. Cabe resaltar que todas las restricciones que surgieron durante el planteamiento
del problema son de tipo desigualdad.
La primera restricción surge de determinar que la deformación máxima del resorte será de 0.5in
(∆ = δ = 0,5[in]) y al reemplazar la expresión 2 en la expresión de la Ley de Hooke (1),
obteniendo la siguiente fórmula:
8 P D3 N
;
d4 G
∆ ≤
(7)
La segunda restricción proviene de establecer que el esfuerzo cortante admisible τadm tiene que
ser menor al esfuerzo cortante último τ , mostrado en la ecuación 3:
τadm ≥
8P D
πd3
0,615d
(4D − d)
+
;
(4D − 4d)
D
(8)
La tercera restricción surge de la expresión 4, la cual es la correspondiente a la frecuencia natural
del resorte. En caso tal de que la frecuencia de carga sea igual a la frecuencia natural del muelle,
éste entrarı́a en un estado de resonancia, oscilando cada vez mas y de manera mas brusca hasta
que el resorte colapse. Por lo anterior, es necesario que la frecuencia de la carga (ω0 ) sea menor
que la frecuencia natural (ω); es decir:
ω0
d
≤
2πD2 N
4
s
2
G
2ρ
(9)
Las restricciones de tipo geométricas surgen de las caracterı́sticas dimensionales del resorte, como
lo son su diámetro medio D, el diámetro del alambre d, y el número de espiras activas N .
La cuarta restricción parametriza el diámetro externo de las espiras, el cual no debe ser mayor
a 1.5 [in] (Dext = 1,5[in]):
Dext ≥ D + d
(10)
La quinta restricción delimita los valores máximos y mı́nimos que puede tener el diámetro del
alambre, los cuales son dmin = 0,05[in] y dmax = 0,2[in]:
dmin ≤ d ≤ dmax
(11)
La sexta restricción enmarca el intervalo de valores en los que puede oscilar el valor del diámetro
medio D del resorte, los cuales para el caso de estudio, se tomaran de Dmin = 0,25[in] y Dmax =
1,3[in]:
Dmin ≤ D ≤ Dmax
(12)
La ultima restricción establece el rango de espiras que puede tener el resorte, partiendo con un
mı́nimo de espiras igual al número de espiras inactivas Nmin = Q = 2 y máximo Nmax = 15 :
Nmin ≤ N ≤ Nmax
(13)
Luego, tomando las restricciones planteadas de las expresiones 7 a la 13, se reemplazan los valores
limites; para mayor eficiencia, se dividen las expresiones 7 a la 10 entre dichos valores correspondientes
y desigualando todo a ≤ 0 para expresarlo en forma estandar, se obtienen las siguientes expresiones:
1−
8P D
τadm πd3
P0 D 3 N
≤ 0
718750d4
0,615d
(4D − d)
+
− 1 ≤ 0;
(4D − 4d)
D
1−
717,399d
≤ 0
ω0 D2 N
(14)
(15)
(16)
D+d
−1 ≤ 0
1,5
(17)
0,05 ≤ d ≤ 0,2
(18)
0,25 ≤ D ≤ 1,3
(19)
2 ≤ N ≤ 15
(20)
Las expresiones 14 a la 17 son denominadas restricciones del modelo de optimización y las expresiones 18 a la 20 se pueden interpretar como el Dominio de las variables del Diseño.
1.1.
Optimización del Diseño
Para la optimización del diseño del resorte en cuestión, se recurre al servidor en linea NEOS
SERVER, utilizando el paquete computacional Ipopt.
Ipopt (Interior Point OPTimizer, pronounced eye-pea-Opt) es un paquete computacional que permite realizar optmización de sistemas no lineales. Está diseñado para encontrar soluciones matemáticas
locales a problemas de optmización de la forma: Tomado de [2]
min f (x)
x ∈ Rn
s.t ........ gL ≤ g(x) ≤ gU
xL ≤ x ≤ xU
5
P0 [lbF]
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
16
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
ω0 [rad/seg]
80
80
80
80
90
90
90
90
100
100
100
100
110
110
110
100
80
80
80
80
90
90
90
90
100
100
100
100
110
100
110
110
τadm [ksi]
65
70
75
80
65
70
75
80
65
70
75
80
65
70
75
80
65
70
75
80
65
70
75
80
65
70
75
80
65
70
75
80
N
10.846
10.7227
10.6089
10.5034
10.846
10.7227
10.6089
10.5034
10.846
10.7227
10.6089
10.5034
10.846
10.7227
10.6089
10.5034
12.0599
11.9161
9.7336
7.7143
12.0599
11.9161
9.7336
7.7143
12.0599
11.9161
9.7336
7.7143
12.0599
11.9161
9.7336
7.7143
d [in]
0.0715
0.0687
0.0661
0.0638
0.0715
0.0687
0.0661
0.0638
0.0715
0.0687
0.0661
0.0638
0.0715
0.0687
0.0661
0.0638
0.0525
0.0504
0.0500
0.0500
0.0525
0.0504
0.0500
0.0500
0.0525
0.0504
0.0500
0.0500
0.0525
0.0504
0.0500
0.0500
D [in]
0.4769
0.4533
0.4323
0.4136
0.4769
0.4533
0.4323
0.4136
0.4769
0.4533
0.4323
0.4136
0.4769
0.4533
0.4323
0.4136
0.3840
0.3651
0.3864
0.4175
0.3840
0.3651
0.3864
0.4175
0.3840
0.3651
0.3864
0.4175
0.3840
0.3651
0.3864
0.4175
Masa [lb]
0.0774
0.0671
0.0588
0.0519
0.0774
0.0671
0.0588
0.0519
0.0774
0.0671
0.0588
0.0519
0.0774
0.0671
0.0588
0.0519
0.0367
0.0318
0.0280
0.0250
0.0367
0.0318
0.0280
0.0250
0.0367
0.0318
0.0280
0.0250
0.0367
0.0318
0.0280
0.0250
Cuadro 4: Valores óptimos en el proceso de Diseño del resorte con Diferentes Parametros
En el servidor NEOS se carga la descripción del modelo .mod (Ver Apéndice A) en donde se
encuentran la función objetivo expresada en 6 y las restricciones que se formularon de la expresión 14
a 20, estableciendo como valores semillas N = 3, d = 0,2 y D = 1.
Las soluciones a la Optimización del diseño suministrada por NEOS para cada combinación de
parámetros presentados en las Tablas 1 a 3 se puede observar en la Cuadro 4.
1.2.
Análisis de Sensibilidad
Como el objetivo principal de este articulo es determinar la sensibilidad del modelo, se analizan el
numero de condicionamiento para cada caso del diseño, es decir, dejando P0 y ω0 constantes y variando
τadm , y ası́ sucesivamente.
En las Figuras 2, 3 y 4 se representas las gráficas que relacionan la variación relativa en la entrada
de datos y el numero de Condicionamiento dada por la expresión 21 para cada caso particular en donde
se deja constante un parámetro.
Condicionamiento =
∆M/M
∆x/x
donde x es el parametro de entrada.
6
(21)
Figura 2: Variación Relativa de τadm Vs Condicionamiento
Figura 3: Variación Relativa de ω0 Vs Condicionamiento
Figura 4: Variación Relativa de P0 Vs Condicionamiento
Como se puede observar en el caso en que el único parámetro que varia es τadm (Ver Figura 2) el
numero de condicionamiento máximo que se presenta es menor a 1.75, por lo tanto se puede concluir
que el modelo es robusto para datos de entrada dependientes de τadm . Además se aprecia que a medida
que aumenta la variación relativa en el dato de entrada, el numero de Condicionamiento disminuye.
Ahora, cuando el único parámetro que se varia es la frecuencia de carga ω0 , se puede observar en
la Figura 3 que su numero de condicionamiento siempre sera es decir, es decir que cualquier variación
en ω0 no refleja ninguna variación en el valor de la Masa optima, por lo tanto se concluye que para
datos de entrada dependientes de ω0 el modelo en Insensible o nada Sensible.
Finalmente, al observar la Figura 4 se aprecia que la única variación presente en P0 de 16 lbF a
8 lbF representa un numero de Condicionamiento de 1.05029, lo cual deja a la vista que el modelo es
robusto para datos de entrada dependientes de P0 .
7
2.
Caso de estudio 2 - Transporte unidimensional en un reactor quı́mico (FDM)
Una de las ecuaciones diferenciales parciales más comunes es la ecuación de advección - reacción difusión. En particular, la ecuación de advección-difusión-reacción unidimensional (ecuación 22) es un
modelo matemático válido para calcular la distribución de la concentración de un reactivo a lo largo
de un reactor quı́mico cuya sección transversal permanece constante (Figura 5).
∂y
∂2y
∂y
= D 2 −U
− ky
∂t
∂x
∂x
(22)
Donde:
y: Concentración del reactivo [kg/m3 ]
t: Tiempo [s].
D: Coeficiente de difusión [m2 /s]
x: Distancia longitudinal [m].
U : Velocidad promedio (en x) de flujo reactivo [m/s].
k: Velocidad de reacción del reactivo [s−1 ].
Figura 5: Reactor con un solo punto de entrada y salida.
2.1.
Modelo matemático
Para comenzar a diseñar el Modelo de matemático que describe este problema, se deben determinar
los principios y leyes fundamentales que se ven involucradas, las variables dependientes, independientes
y las condiciones de frontera.
2.1.1.
Parámetros del problema:
En esa sección se especifican los parámetros de funcionamiento y las leyes que rigen el modelo:.
D = 1.8 [m2 /s];
L= 0.9 [m];
U = 0.2 [m/s]
CRef =0.1 [Kg/m3 ];
k= 5[s−1 ];
Donde CRef es un valor de referencia de la concentración.
8
2.1.2.
Condiciones de frontera del problema:
Este problema posee dos condiciones de frontera:
La primera, en el punto x = 0, es tipo Robin (R) o Fourier:
−D
∂y
+ U y = U CRef
∂x
(23)
La segunda condición de frontera, en el punto x = L, es de tipo Neumann:
∂y
=0
∂x
2.1.3.
(24)
Adimensionalización:
Para poder estudiar y entender mejor el comportamiento de este problema, se procede a realizar
la correspondiente adimensionalización de la expresion que lo rige (Ecuación 22 ), ası́ como también
de las que describen las condiciones de frontera (Ecuaciones 23 y 24). Dicho proceso se presenta a
continuación:
En primer lugar, se establecen los siguientes términos adimensionales:
y∗ =
y
CRef
x∗ =
x
Lc ;
t∗ =
t
τ
;
Donde τ =
Lc
U
⇒ t∗ =
t U
Lc ;
Luego, se procede a despejar y derivar las expresiones anteriores, en función de los términos adimensionales:
y = y ∗ CRef ;
dy = dy ∗ CRef ;
x = x∗ Lc;
dx = dx∗ Lc
t=
⇒ dx2 = dx∗2 Lc2 ;
t∗ Lc
U ;
dt = dt∗ Lc
U ;
Ahora, se realizan los correspondentes reemplazos en la ecuación 22:
CRef U ∂y ∗
CRef ∂ 2 y ∗
CRef ∂y ∗
=D
−U
− kCRef y ∗ ;
∗
2
∗2
Lc
∂t
Lc ∂x
Lc ∂x∗
Se Cancela el término CRef de toda la expresión, obteniendo:
D ∂ 2 y∗
U ∂y ∗
U ∂y ∗
=
−
− ky ∗ ;
Lc ∂t∗
Lc2 ∂x∗2
Lc ∂x∗
Ahora, se despeja el término temporal a un solo lado de la igualdad:
∂y ∗
Lc D ∂ 2 y ∗
Lc U ∂y ∗
Lc ∗
ky ;
=
−
−
∂t∗
U Lc2 ∂x∗2
U Lc ∂x∗
U
Luego, se simplifican términos de la expresión:
∂y ∗
D ∂ 2 y∗
∂y ∗
Lc k ∗
=
−
−
y ;
∗
∗2
∗
∂t
U Lc ∂x
∂x
U
Para reducir cálculos se agrupan términos constantes de la ecuación en dos parámetros:
9
D
Lc k
;
α=
;
U Lc
U
Finalmente, se obtiene la expresión 22 adimensionalizada:
β=
∂ 2 y∗
∂y ∗
∂y ∗
=
β
−
− αy ∗ ;
(25)
∂t∗
∂x∗2
∂x∗
Se prosigue con la adimensionalización de las condiciones de frontera, utilizando los mismos parámetros adimensionales que se establecieron anteriormente.
Primero, se adimensionaliza la condición de frontera en x = 0:
∂y
+ U y = U CRef
∂x
CRef ∂y ∗
+ U CRef y ∗ = U CRef
−D
Lc ∂x∗
−D
Se cancela el término CRef :
−D ∂y ∗
+ U y∗ = U
Lc ∂x∗
Anulando el coeficiente de la derivada parcial de y respecto a x:
∂y ∗
U Lc ∗
U Lc
−
y =−
∂x∗
D
D
Se utilizan los coeficientes β y α, determinados anteriormente:
∂y ∗
1
1
− y∗ = −
∗
∂x
β
β
(26)
Ahora, se adimensionaliza la condición de frontera en x = L:
∂y
=0
∂x
CRef ∂y ∗
=0
Lc ∂x∗
∂y ∗
=0
∂x∗
2.2.
2.2.1.
(27)
Aplicación del método de diferencias finitas:
Ecuación general:
Ahora se procede a aplicar el método de diferencias finitas a la ecuación 25, visto en [2], implementando un esquema temporal del tipo Crank Nicolson y centradas en el espacio, como se muestra a
continuación:
(De ahora en adelante, los términos adimensioanles de de la ecuación 25 se escribirán como: y ∗ = y;
x = x; t∗ = t; por cuestiones de practicidad y facilidad de entendimiento de las expresiones)
∗
∂y
∂2y
∂y
=β 2 −
− αy;
∂t
∂x
∂x
Aplicando diferencias finitas desde una perspectiva muy general se tiene:
∂y
yi n+1 − yin
=
∂t
∆t
n
n
2
yi+1 − 2yin + yi−1
∂ y
=
2
∂x2
∆x
10
n
y n − yi−1
∂y
= i+1
∂x
2∆x
Ahora, se procede a implementar el esquema Crank Nicolson, el cual se considera de tipo semiimplı́cito, para la discretización de la ecuación 25:
n+1
n+1
y n+1 − 2yin+1 + yi−1
y n+1 − yi−1
1
yi n+1 − yin
=
( β i+1
− i+1
− αyin+1 )
2
∆t
2
2∆x
∆x
+
n
n
n
yi+1
− yi−1
y n − 2yin + yi−1
1
−
( β i+1
− αyin )
2
2∆x
∆x2
Agrupando términos:
1
β n+1
2β n+1
β n+1
1 n+1
1 n+1
yi n+1 − yin
= (
y
−
y
+
y
−
y
+
y
− αyin+1 )
∆t
2 ∆x2 i+1
2∆x i+1
2∆x i−1
∆x2 i
∆x2 i−1
+
1
β n
2β n
β n
1 n
1 n+1
n
y
y +
(
−
2 yi−1 − 2∆x yi+1 + 2∆x yi−1 − αyi )
2 ∆x2 i+1 ∆x2 i
∆x
Multiplicando toda la expresión por ∆t:
yi n+1 − yin =
∆t n+1
1 β∆t n+1 2β∆t n+1 β∆t n+1
∆t n+1
yi+1 −
yi
+
yi−1 −
(
yi+1 +
y
− ∆t αyin+1 )
2
2
2
2 ∆x
2∆x
2∆x i−1
∆x
∆x
2β∆t n β∆t n
∆t n
∆t n+1
1 β∆t n
(
y
−
yi +
yi−1 −
y
+
y
− ∆t αyin )
2 ∆x2 i+1
2∆x i+1 2∆x i−1
∆x2
∆x2
Se decide reducir constantes en tres coeficientes determinados, para facilitar los cálculos y el entendimiento del planteamiento:
+
β ∆t
= φ;
2 (∆x)2
∆t
= µ;
4 ∆x
∆t α
=θ
2
Reemplazando en la expresión anterior:
n+1
n+1
n+1
n+1
yi n+1 − yin = φyi+1
− 2φyin+1 + φyi−1
− µyi+1
+ µyi−1
− θyin+1
n
n
n
n
+ φyi+1
− 2φyin + φyi−1
− µyi+1
+ µyi−1
− θ yin )
Ahora, se ponen a un lado de la igualdad los términos que se calculan en el tiempo n + 1, y al otro
los que se calculan en el tiempo n:
n+1
n+1
n+1
n+1
n
n
n
n
yi n+1 +2φyin+1 +θ yin+1 −φyi+1
+µyi+1
−φyi−1
−µyi−1
= φyi+1
−µyi+1
−2φyin +yin −θ yin +φyi−1
+µyi−1
Agrupando términos semejantes:
n+1
n+1
n
n
(1 + 2φ + θ)yin+1 − (φ − µ)yi+1
− (φ + µ)yi−1
= (1 − 2φ − θ)yin + (φ − µ)yi+1
+ (φ + µ)yi−1
Redefiniendo coeficientes:
η = 2φ + θ;
γ = φ − µ;
ρ = φ + µ;
Reemplazando en la ecuación anterior, se obtiene entonces, la ecuación general para los nodos del
sistema:
n+1
n+1
n
n
−ρ yi−1
+ (1 + η) yin+1 − γ yi+1
= ρ yi−1
+ (1 − η) yin + γ yi+1
11
(28)
2.2.2.
Condiciones de frontera:
Ahora se discretizan las dos condiciones de frontera del problema, aplicando el método de diferencias
finitas de tipo centradas:
Discretizando la condición de frontera en el punto x = 0:
Se parte de la ecuación 26:
∂y
1
1
− y=−
∂x β
β
Discretizando:
yi+1 − yi−1
1
−1
− yi =
2 ∆x
β
β
Aplicandolo al nodo i = 1, es decir, al nodo de frontera:
y2 − y0
1
−1
− y1 =
2 ∆x
β
β
⇒ y0 = y2 − 2 ∆x(
−1
1
+ y1 )
β
β
(29)
Ahora, se hace el mismo tratamiento al nodo correspondiente al de la frontera para x = L,
partiendo de la ecuación 27:
∂y
=0
∂x
Discretizando:
yi−1 − yi+1
=0
2 ∆x
Asumiendo un total de 5 nodos, se aplica la expresión anterior para tal nodo, obteniendo:
y4 − y6
=0
2 ∆x
⇒ y4 = y6
(30)
Siendo y4 y y6 los nodos penúltimo y fantasma de la frontera en x = L, respectivamente.
2.2.3.
Aplicación de la ecuación discretizada 28 a los nodos del sistema:
Se aplica la ecuación 28 a los nodos del sistema, teniendo consideración especial con el nodo correspondiente a la frontera en x = 0 y a la frontera en x = L. La ecuación general se comporta de igual
forma para todos los nodos internos del dominio.
Nodo i = 1:
−ρ y0n+1 + (1 + η) y1n+1 − γ y2n+1 = ρ y0n + (1 − η) y1n + γ y2n
Se Reemplaza y0 en términos de y2 y y1 , en ambos instantes de tiempo, como se muestra en la
expresión 29, obteniendo:
−ρ (y2n+1 − 2 ∆x(
1
−1
+ y1n+1 )) + (1 + η) y1n+1 − γ y2n+1 =
β
β
ρ (y2n − 2 ∆x(
−1
1
+ y1n )) + (1 − η) y1n + γ y2n
β
β
Agrupando términos:
−ρy2n+1 + 2ρ ∆x(
1
−1
+ y1n+1 ) + (1 + η) y1n+1 − γ y2n+1 =
β
β
ρy2n − 2ρ ∆x(
−1
1
+ y1n ) + (1 − η) y1n + γ y2n
β
β
12
−ρy2n+1 −
2ρ ∆x 2ρ ∆x n+1
+
y1
+ (1 + η) y1n+1 − γ y2n+1 =
β
β
ρy2n +
2ρ ∆x 2ρ ∆x n
−
y1 + (1 − η) y1n + γ y2n
β
β
Finalmente se obtiene:
(
2ρ ∆x
ρ∆x
−2ρ ∆x
+ 1 + η)y1n+1 − (ρ + γ)y2n+1 = (
+ 1 − η)y1n + (ρ + γ)y2n + 4
(31)
β
β
β
Último Nodo (Se asumen 5 nodos en total):
−ρ y4n+1 + (1 + η) y5n+1 − γ y6n+1 = ρ y4n + (1 − η) y5n + γ y6n
Se Reemplaza y6 por y4 , como se muestra en la expresión 30, obteniendo:
−ρ y4n+1 + (1 + η) y5n+1 − γ y4n+1 = ρ y4n + (1 − η) y5n + γ y4n
Agrupango términos:
−(ρ + γ)y4n+1 + (1 + η) y5n+1 = (ρ + γ)y4n + (1 − η) y5n
2.2.4.
(32)
Representación Matricial del modelo:
Las expresiones de los nodos del sistema se pueden plasmar mediante una representación matricial,
reemplazando Ψ = ρ β∆x en las ecuación 31 para la primera fila; en la ecuación 32 para la última
fila; y en la ecuación 28 para las filas internas. Se obtiene entonces un esquema matricial de la forma
A y n+1 = B y n + BC, tal y como se muestra a continuación:
  n+1

y1
(2Ψ + 1 + η) −(ρ + γ)
0
0
0
 y2 

−ρ
(1
+
η)
−γ
0
0
 

 

0
−ρ
(1 + η)
−γ
0 
=
 y3 


0
0
−ρ
(1 + η)
−γ  y4 
0
0
0
−(ρ + γ) (1 + η) y5
  n  

y1
4Ψ
(−2Ψ + 1 − η) (ρ + γ)
0
0
0
0
 y2 

ρ
(1
−
η)
γ
0
0
 
 

 
 

0
ρ
(1 − η)
γ
0 
 y3  +  0 

0

0
0
ρ
(1 − η)
γ  y4 
0
0
0
(ρ + γ) (1 − η)
y5
0
2.2.5.
Análisis de estabilidad:
Para realizar el análisis de estabilidad de el modelo se acude a mirar la dominancia de la diagonal
de la matriz (aunque esto sólo es estrictamente válido para esquemas implı́citos):
X
| Aii | ≥
= | Aij |; P ara todo i.
(33)
i6=j
Aplicando esta ecuación a la representación matricial mostrada anteriormente, obtenemos las siguientes
desigualdades:
| 1 − η | ≥ | ρ + γ |;
| 1 − 2φ − θ | ≥ | φ + µ + φ − µ |;
| 1 − 2φ − θ | ≥ | 2φ |;
13
|1−
|1−
β ∆t ∆t α
β ∆t
|;
|≥|
2 −
2
∆x
∆x2
D ∆t
∆t Lc k
D ∆t
|≥|
|;
2 −
2U
U Lc ∆x
U Lc ∆x2
Lc k
D
D
|;
2 + 2U ) | ≥ | ∆t
U Lc ∆x
U Lc ∆x2
Se parte este análisis en dos partes, abriendo el valor absoluto de la expresión y ası́ poder hallar
los intervalos en los que puede oscilar el ∆t para respetar la estabilidad del modelo:
| 1 − ∆t (
Lı́mite inicial de ∆t:
1 − ∆t (
Lc k
D
D
;
2 + 2U ) ≥ ∆t
U Lc ∆x
U Lc ∆x2
1 ≥ ∆t (
D
Lc k
D
;
2 + 2U ) + ∆t
U Lc ∆x
U Lc ∆x2
1 ≥ ∆t (
2D
Lc k
2 + 2U );
U Lc ∆x
Despejando ∆t:
∆t ≤ (
Lı́mite final de ∆t
Lc k −1
2D
+
) ;
2U
U Lc ∆x2
(34)
Lc k
D
D
+
;
) ≤ −∆t
2U
U Lc ∆x2
U Lc ∆x2
D
Lc k
D
1 ≤ ∆t (
;
2 + 2U ) − ∆t
U Lc ∆x
U Lc ∆x2
1 − ∆t (
Cancelando términos semejantes:
1 ≤ ∆t
Lc k
;
2U
Despejando ∆t:
∆t ≥ (
Lc k −1
) ;
2U
(35)
Finalmente, se encuentra el intervalo de valores que puede asumir ∆t para mantener la condición
de estabilidad del sistema:
(
2.3.
Lc k −1
Lc k −1
2D
+
)
≤ ∆t ≤ (
) ;
2U
2U
U Lc ∆x2
(36)
Implementación computacional:
Para simular el modelo matemático anteriormente planteado se hace uso del lenguaje de programación FORTRAN 90, como se puede ver el script en el apéndice B.
Para la parte explı́cita de la ecuación matricial (el lado derecho de la igualdad) se usó un simple
algoritmo de multiplicación matriz - vector y suma vector- vector. Como todos los valores de este
lado son conocidos, se obtiene un vector cuyas entradas también se conocen, y ası́ finalmente tener un
sistema matricial Ax = d, donde A es una matriz tridiagonal; x es el vector de incógnitas y d es el
vector anteriormente mencionado.
Este tipo de sistemas se puede solucionar eficientemente usando el algoritmo de Thomas (Ver [3,
Pág 49]), como se puede apreciar a continuación:
Identificar el sistema tridiagonal A.
14
Colocar:
β1 = A1,1 ;
γ1 =
d1
;
β1
Para las demás filas se usan las siguientes formulas:
βi = Ai,i −
γi =
Ai,i−1 Ai−1,i
;
βi−1
di − Ai,i−1 γi−1
;
βi
i = 2, ..., n;
i = 2, ..., n;
Finalmente se obtiene el vector solución regresivamente, donde:
xn = γn ;
xi = γi −
2.4.
Ai,i+1 xi+1
;
βi
i = n − 1, ..., 1;
Resultados:
Habiendo simulado el modelo matemático implementando una herramienta computacional, usando
un numero de 45 nodos a lo largo del reactor, un intervalo de tiempo de 0.01 segundos, y un tiempo
total de simulación de 10 segundos, se obtienen las siguientes gráficas:
Figura 6: Curvas de la concentración a lo largo del reactor en diferentes instantes de tiempo.
15
Figura 7: Curva de la concentración después de haber transcurrido 10 segundos.
En la figura 6 las curvas están ordenadas de abajo hacia arriba, de la siguiente manera:
La curva de color rojo corresponde al instante t = 0[s].
La curva de color verde corresponde al instante t = 0,05[s].
La curva de color azul oscuro corresponde al instante t = 0,1[s].
La curva de color rosado corresponde al instante t = 0,2[s].
La curva de color azul claro corresponde al instante t = 0,4[s].
A partir del instante t = 1[s], no se presenta variación en la concentración del reactor, es decir,
se estabiliza el sistema.
Como se puede observar en la gráfica 6, se verifica, en todas las curvas, el cumplimiento de las
condiciones de frontera (Ecuaciones 23 y 24), ya que en el extremo izquierdo del reactor, la concentración es distinta a cero, y en el extremo derecho, todas las curvas parecen comportarse asintóticamente,
regidas por la condición de frontera Neumann nula.
Adicionalmente se presenta en la gráfica 7 en el instante final de simulación (t = 10[s]), reafirmando
la estabilidad del sistema en este intervalo de tiempo.
16
3.
Caso de estudio 3 - Modelo de la distribución de temperaturas en una placa sometida a una fuente de calor (FDM)
Considere una placa bidimensional fabricada de un material con coeficiente de difusividad térmica α
, tal como la mostrada en la figura 8. Como se observa, las fronteras fı́sicas de la placa están designadas
por las letras A, B, C, y D. Asuma que la placa está sometida a una fuente de calor puntual localizada
en la coordenada x = 0, 5; y = 0, 5.
Figura 8: Reactor con un solo punto de entrada y salida.
3.1.
Modelo matemático
Para comenzar a diseñar el Modelo de matemático que describe este problema, se deben determinar
los principios y leyes fundamentales que se ven involucradas, las variables dependientes, independientes,
las condiciones de frontera y suposiciones realizadas.
Para simplificar el problema, se puede asumir que solo se considera el fenómeno de conducción
de calor transitorio, por lo que el problema puede ser modelado mediante la ecuación general de
conducción de calor (obtenida de [4]):
∇2 T +
egen
˙
1 ∂T
=
k
α ∂t
Re-organizando términos, se obtiene:
∂T
− α∇2 T = f (x, y, t)
∂t
Donde:
f (x, y, t): Corresponde a la función de la fuente de calor.
T : Es la Temperatura [K]
t: Es el tiempo [s].
α: Es el coeficiente de difusividad térmica[m2 /s]..
x y y: Coordenadas espaciales de la placa.
17
(37)
3.2.
Parámetros del modelo:
Para este problema, la función de la fuente generadora de calor se puede modelar de la siguiente
manera:
f (x, y, t) = [
3.2.1.
2
6
[−( x−0,5
wx )
− 3] e
−t
1+e
2
− ( y−0,5
wy ) ]
(38)
Condiciones de frontera del problema:
Este problema establece dos tipos de condiciones adimensionales para sus fronteras:
Las fronteras A y B pueden ser modeladas como fronteras tipo Dirichlet.
θA = 0;
(39)
θB = 1, 5;
(40)
∂θ
Las fronteras C y D pueden considerarse como fronteras tipo Neumann con flujo nulo ( ∂n
= 0);
donde n es el vector unitario ortogonal a la respectiva frontera:
3.2.2.
∂θC
= 0;
∂y
(41)
∂θD
= 0;
∂x
(42)
Adimensionalización:
Para poder estudiar y entender mejor el comportamiento de este problema, se procede a realizar
la correspondiente adimensionalización de la expresión que lo rige (Ecuación 37):
La expresión 37 también puede expresarse de manera adimensional, de la siguiente manera:
∂θ
ατ
τ
− 2 ∇2 θ = f (x, y, t)
∂t∗
Lref
Tref
Donde:
θ=
T −Tref
Tref
;
Tref = 273[K];
τ=
L2ref
α
;
Reemplazando τ en la expresión anterior, se obtiene la ecuación adimensional del modelo:
L2ref
∂θ
2
−
∇
θ
=
f (x, y, t)
∂t∗
α τ Tref
3.2.3.
(43)
Aplicación de las diferencias finitas:
Ecuación general:
Ahora se procede a aplicar el método de diferencias finitas a la ecuación 43, visto en [2], implementando el método ADI (Alternating - Dimension - Implicit).
18
Figura 9: Representación método ADI.
Figura 10: Método ADI - Múltiples sistemas TDM.
Primero se establece la ecuación general que se va a discretizar, por lo que se debe reemplazar la
función de la fuente de calor (Eq: 38) y el término β =
L2ref
α τ
en la ecuación 43:
∂2θ
∂2θ
6
∂θ
−( 2 +
) = β[
− 3] e
∗
2
∂t
∂x
∂y
1 + e−t
y−0,5 2
2
[−( x−0,5
wx ) − ( wy ) ]
Discretización según el método ADI:
Ahora se plantea la discretización de las ecuaciones según el método ADI:
Discretización en el intervalo temporal [n → n + 1/2]
n+1/2
∂θ
∂t
=
θi,j
n
− θi,j
;
∆t/2
(En n) →
∂2θ
∂x2
=
n
n
n
θi−1,j
− 2θi,j
+ θi+1,j
;
2
(∆x)
(En n) →
∂2θ
∂y 2
=
n
n
n
θi,j−1
− 2θi,j
+ θi,j+1
;
(∆y)2
Discretización en el intervalo temporal [n + 1/2 → n + 1]
n+1/2
∂θ
∂t
=
n+1
θi,j
− θi,j
∆t/2
;
(En n + 1) →
∂2θ
∂x2
=
n+1
n+1
n+1
θi−1,j
− 2θi,j
+ θi+1,j
;
2
(∆x)
(En n + 1) →
∂2θ
∂y 2
=
n+1
n+1
n+1
θi,j−1
− 2θi,j
+ θi,j+1
;
(∆y)2
19
(44)
Discretización de la función de la fuente de calor:
f (x, y, t) = [ 1
6
+ e−n∆t
− 3] e
[−( i∆xw−
x
0,5 2
)
− ( j∆yw−
y
0,5 2
) ]
;
Aplicación de la discretización por medio del metodo ADI:
Se aplican las discretizaciones generales a la ecuación 44, en los dos intervalos de tiempo establecidos
([n → n + 1/2]; [n + 1/2 → n + 1]):
n+1/2
θi,j
n+1/2
n+1/2
n
n
n
n
− θi,j
θi,j−1
θi−1,j
− 2θi,j
+ θi+1,j
+
− (
2
∆t/2
(∆x)
β
n+1/2
6
[−( i∆xw−
x
− 3] e
1 + e−n∆t
− ( j∆yw−
y
0,5 2
)
n+1/2
n+1
θi,j
− θi,j
∆t/2
n+1
n+1
n+1
θi,j−1
θi−1,j
− 2θi,j
+ θi+1,j
+
− (
(∆x)2
β[
6
1 + e−(n+1)∆t
− 3] e
[−( i∆xw−
x
0,5 2
)
n+1/2
− 2θi,j
+ θi,j+1
) =
2
(∆y)
0,5 2
) ]
(45)
n+1/2
n+1/2
− 2θi,j
+ θi,j+1
) =
(∆y)2
− ( j∆yw−
y
0,5 2
) ]
(46)
Se procede a desarrollar la ecuaciónes 45 y 46 haciendo las siguientes consideraciones y simplificaciones:
∆x = ∆y = ∆h
λ=
∆t
2(∆h)2
µ=
∆t β
2
→ Ecuación 45:
n+1/2
n+1/2
θi,j
n
− θi,j
−
=
n+1/2
θi,j
n
n
n
θi,j−1
− 2θi,j
+ θi+1,j
∆t θi−1,j
(
+
2
2
(∆x)
6
β∆t
[−( i∆xw−
x
[
− 3] e
−n∆t
2 1 + e
0,5 2
)
n+1/2
− ( j∆yw−
y
n+1/2
n
n
n
n
− θi,j
− λθi−1,j
+ λ2θi,j
− λθi+1,j
− λθi−1,j
n+1/2
− 2θi,j
+ θi,j+1
)
2
(∆y)
0,5 2
) ]
n+1/2
+ λ2θi,j
n+1/2
− λθi+1,j
= µ f (i∆x, j∆y, n∆t)
Acomodando los términos según el tiempo en el que se calculan, se obtiene:
n+1/2
θi,j
n+1/2
− λθi,j−1
n+1/2
+ λ2θi,j
n+1/2
− λθi,j+1
n
n
n
n
= θi,j
+ λθi−1,j
− λ2θi,j
+ λθi+1,j
+ µ f (i∆x, j∆y, n∆t)
Finalmente, la expresión para el primer intervalo es:
n+1/2
(1 + 2λ)θi,j
n+1/2
− λθi,j−1
n+1/2
− λθi,j+1
n
n
n
= (1 − 2λ)θi,j
+ λθi−1,j
+ λθi+1,j
+ µ f (i∆x, j∆y, n∆t)
20
(47)
→ Ecuación 46:
n+1/2
n+1
θi,j
− θi,j
n+1/2
n+1/2
n+1
n+1
n+1
− λθi−1,j
+ λ2θi,j
− λθi+1,j
− λθi,j−1
+ λ2θi,j
n+1/2
− λθi,j+1
=
µ f (i∆x, j∆y, (n + 1)∆t)
Acomodando los términos según el tiempo en el que se calculan, se obtiene:
n+1
n+1
n+1
n+1
θi,j
− λθi−1,j
+ λ2θi,j
− λθi+1,j
=
n+1/2
thetai,j
n+1/2
+ λθi,j−1
n+1/2
n+1/2
− λ2θi,j
+ λθi,j+1
+ µ f (i∆x, j∆y, (n + 1)∆t)
Finalmente, la expresión para el segundo intervalo de tiempo es:
n+1
n+1
n+1
(1 + 2λ)θi,j
− λθi−1,j
− λθi+1,j
n+1/2
n+1/2
= (1 − 2λ)θi,j
+ λθi,j−1
n+1/2
+ λθi,j+1
+ µ f (i∆x, j∆y, (n + 1)∆t)
(48)
Las ecuaciones 47 y 48, se cumplen para todos los nodos internos del dominio.
Debido a las condiciones de transferencia de calor en los bordes de la placa, se deben tener consideraciones especiales para establecer las ecuaciones de los nodos de las fronteras:
En x = 0 :
∂θ
= 0;
∂x
θ2,j − θ0,j
=0
2∆x
→
⇒
θ2,j = θ0,j
(49)
En x = 1 :
θn,j = 1,5;
(50)
θi,1 = 0;
(51)
En y = 0 :
En y = 1 :
∂θ
= 0;
∂y
θi,n+1 − θi,n−1
=0
2∆y
→
⇒
θi,n+1 = θi,n−1
(52)
→ Ecuaciones para la frontera A (Nodos (i, 2)):
Aplicando la ecuación 47:
n+1/2
(1 + 2λ)θi,2
n
n
(1 − 2λ)θi,2
+ λθi−1,2
n+1/2
− λθn+1/2 =
− λθ
i,3
i,1
n
+ λθi+1,2 + µ f (i∆x, 2∆y, n∆t)
n+1/2
(1 + 2λ)θi,2
n+1/2
− λθi,3
=
n
n
n
(1 − 2λ)θi,2
+ λθi−1,2
+ λθi+1,2
+ µ f (i∆x, 2∆y, n∆t)
Aplicando la ecuación 48:
n+1
n+1
n+1
(1 + 2λ)θi,2
− λθi−1,2
− λθi+1,2
=
n+1/2
(1 − 2λ)θi,2
n+1/2
+ λθn+1/2 + µ f (i∆x, j∆y, (n + 1)∆t)
+ λθ
i,1
i,3
21
(53)
n+1
n+1
n+1
(1 + 2λ)θi,2
− λθi−1,2
− λθi+1,2
=
n+1/2
n+1/2
(1 − 2λ)θi,2
+ λθi,3
+ µ f (i∆x, j∆y, (n + 1)∆t)
(54)
→ Ecuaciones para la frontera B (Nodos (n − 1, j)):
Aplicando la ecuación 47:
n+1/2
n+1/2
n+1/2
(1 + 2λ)θn−1,j − λθn−1,j−1 − λθn−1,j+1 =
n
n
n
(1 − 2λ)θn−1,j
+ λθn−2,j
+ λθn,j
+ µ f ((n − 1)∆x, j∆y, n∆t)
n+1/2
n+1/2
n+1/2
(1 + 2λ)θn−1,j − λθn−1,j−1 − λθn−1,j+1 =
n
n
(1 − 2λ)θn−1,j
+ λθn−2,j
+ λ 1,5 + µ f ((n − 1)∆x, j∆y, n∆t)
(55)
Aplicando la ecuación 48:
n+1
n+1
n+1
(1 + 2λ)θn−1,j
− λθn−2,j
− λθn,j
=
n+1/2
n+1/2
n+1/2
(1 − 2λ)θn−1,j + λθn−1,j−1 + λθn−1,j+1 + µ f ((n − 1)∆x, j∆y, (n + 1)∆t)
n+1
n+1
(1 + 2λ)θn−1,j
− λθn−2,j
=
n+1/2
n+1/2
n+1/2
(1 − 2λ)θn−1,j + λθn−1,j−1 + λθn−1,j+1 + 1,5 λ + µ f ((n − 1)∆x, j∆y, (n + 1)∆t) (56)
→
Ecuaciones para la frontera C (Nodos (i, n)):
Aplicando la ecuación 47:
n+1/2
(1 + 2λ)θi,n
n+1/2
− λθi,n−1
n+1/2
− λθi,n−1 =
n
n
n
(1 − 2λ)θi,n
+ λθi−1,n
+ λθi+1,n
+ µ f (i∆x, n∆y, n∆t)
n+1/2
n+1/2
− 2λθi,n−1 =
(1 + 2λ)θi,n
n
n
n
(1 − 2λ)θi,n
+ λθi−1,n
+ λθi+1,n
+ µ f (i∆x, n∆y, n∆t)
(57)
Aplicando la ecuación 48:
n+1
n+1
n+1
(1 + 2λ)θi,n
− λθi−1,n
− λθi+1,n
=
n+1/2
(1 − 2λ)θi,n
n+1/2
n+1/2
+ λθi,n−1 + λθi,n+1 + µ f (i∆x, n∆y, (n + 1)∆t)
n+1
n+1
n+1
(1 + 2λ)θi,n
− λθi−1,n
− λθi+1,n
=
n+1/2
(1 − 2λ)θi,n
n+1/2
+ 2λθi,n−1 + µ f (i∆x, n∆y, (n + 1)∆t)
22
(58)
→ Ecuaciones para la frontera D (Nodos (1, j)):
Aplicando la ecuación 47:
n+1/2
(1 + 2λ)θ1,j
n+1/2
n+1/2
− λθ1,j−1
− λθ1,j+1 =
n
n
n
(1 − 2λ)θ1,j
+ λθ0,j
+ λθ2,j
+ µ f (1∆x, j∆y, n∆t)
n+1/2
(1 + 2λ)θ1,j
n+1/2
n+1/2
− λθ1,j−1
− λθ1,j+1 =
n
n
(1 − 2λ)θ1,j
+ 2λθ2,j
+ µ f (1∆x, j∆y, n∆t)
(59)
Aplicando la ecuación 48:
n+1
n+1
n+1
(1 + 2λ)θ1,j
− λθ0,j
− λθ2,j
n+1/2
= (1 − 2λ)θ1,j
n+1/2
n+1/2
+ λθ1,j−1 + λθ1,j+1 + µ f (1∆x, j∆y, (n + 1)∆t)
n+1
n+1
(1 + 2λ)θ1,j
− 2λθ2,j
=
n+1/2
(1 − 2λ)θ1,j
n+1/2
n+1/2
+ λθ1,j−1 + λθ1,j+1 + µ f (1∆x, j∆y, (n + 1)∆t)
(60)
Representación matricial del modelo:
Ahora, se hace el planteamiento de las ecuaciones del modelo, tanto para los nodos internos como
para los nodos de frontera, en forma de matrices, lo cual es bastante útil para la resolución del mismo:
→ Primer paso:
 n+1
θi,2 2
  θi,2 


  θi,2 


 . 


=
 . 
.


 . 
.


 . 
.
−2λ (1 + 2λ) θi,n
n 
 

+λθi+1,2
µ f (i, j, n)
λ θi,1
µ f (i, j, n)  0 
+λθi+1,3 


 

µ f (i, j, n)  0 
+λθi+1,4 


 



  . 
.
 +
+



  . 
.


 



  . 
.


 



  . 
.
+λθi+1,n
µ f (i, j, n)
0


(1 + 2λ)
−λ
 −λ
(1
+ 2λ)
−λ


−λ
(1
+ 2λ) −λ


.







λθi−1,2
 λθi−1,3

 λθi−1,4








λθi−1,n
+(1 + 2λ)θi,2
+(1 + 2λ)θi,3
+(1 + 2λ)θi,4
.
.
.
.
+(1 + 2λ)θi,n
→ Segundo Paso:

(1 + 2λ)
−2λ
 −λ
(1
+ 2λ)
−λ


−λ
(1
+ 2λ) −λ


.






23

.
.
.
−λ
θ1,2
θ2,2
θ3,2
.
.
.
.
n+1






















(1 + 2λ) θn−1,2
=
(61)

λθ1,j−1
λθ2,j−1
λθ3,j−1











λθn−1,j−1
+(1 − 2λ)θ2,j
+(1 − 2λ)θ2,j
+(1 − 2λ)θ3,j
.
.
.
.
+(1 − 2λ)θn−1,j
+λθ1,j+1
+λθ2,j+1
+λθ3,j+1
 n+1
2











+λθn−1,j+1

µ
µ

µ


+





µ
 
f (i, j, n + 1)

f (i, j, n + 1)
 

f (i, j, n + 1) 

 
.
+
 
.
 
 
.
 
 
.
λ
f (i, j, n + 1)

0
0 

0 

. 

. 

. 

. 
θn,j
(62)
→ Frontera A:

(1 + 2λ)
−2λ
 −λ
(1
+ 2λ)
−λ


−λ
(1
+ 2λ) −λ


.







(1 − 2λ)θ2,j
(1 − 2λ)θ2,j
(1 − 2λ)θ3,j











(1 − 2λ)θn−1,j
+λθ1,3
+λθ2,3
+λθ3,3
.
.
.
.
+λθn−1,3
n












µ
µ

µ


+





µ

θ1,j
θ2,j
θ3,j
.
.
.
.
n+1












=



.





.




.
−λ (1 + 2λ) θn−1,j





0
f (i, j, n + 1)
λθ
1,1


f (i, j, n + 1)
  λθ2,1   0 





f (i, j, n + 1) 
 0 
λθ3,1 . 





.
+ . + . 





.
  .   . 





.
  .   . 


. 
.
λθn−1,1
λ θn,2
f (i, j, n + 1)
(63)
→ Frontera B:

λθn−2,2
 λθn−2,3

 λθn−2,4








λθn−1,n
+(1 − 2λ)θn−1,2
+(1 − 2λ)θn−1,3
+(1 − 2λ)θn−1,4
.
.
.
.
+(1 − 2λ)θn−1,n
n











 n+1
θn−1,2 2
  θn−1,3 


  θn−1,4 


 . 


=
 . 


 . 
.


 . 
.
−2λ (1 + 2λ)
θn−1,n
 
 

f (i, j, n)
λθn,2
λ θi,1

 

f (i, j, n)
  λθn,3   0 




f (i, j, n)  λθn,4   0 

  .   . 
.
+
+

  .   . 
.
 
 

  .   . 
.
 
 

  .   . 
.
f (i, j, n)
λθn,n
0


(1 + 2λ)
−λ
 −λ
(1
+ 2λ)
−λ


−λ
(1
+ 2λ) −λ


.






.

µ
µ

µ


+





µ
→ Frontera C:
24
(64)


(1 + 2λ)
−2λ
 −λ
(1
+ 2λ)
−λ


−λ
(1
+ 2λ) −λ


.







(1 − 2λ)θ1,n
(1 − 2λ)θ2,j
(1 − 2λ)θ3,j











(1 − 2λ)θn−1,n
→
 n+1
2
+2λθ1,n−1
+2λθ2,n−1
+2λθ3,n−1
.
.
.
.
+2λθn−1,n−1











n+1



















.





.
−λ (1 + 2λ) θn−1,n

 

0
µ f (i, j, n)
µ f (i, j, n)  0 

 

µ f (i, j, n)  0 

 

  . 

.

+
+
  . 

.

 

  . 

.

 

  . 

.
λ θn,n
µ f (i, j, n)
=
(65)
Frontera D:

(1 + 2λ)
 −λ










 n+1
θ1,2 2
  θ1,3 


  θ1,4 


 . 


=
 . 
.


 . 
.


 . 
.
−2λ (1 + 2λ) θ1,n

 
n 
λ θi,1
µ f (i, j, n)
µ f (i, j, n)  0 


 


µ f (i, j, n)  0 


 


  . 


.

+
 +
  . 


.

 


  . 


.

 


  . 


.
0
µ f (i, j, n)
−λ
(1 + 2λ)
−λ
−λ
(1 + 2λ) −λ
.

2λθ2,2
 2λθ2,3

 2λθ2,4








2λθ2,n
3.2.4.
.
θ1,n
θ2,n
θ3,n
.
.
.
.
+(1 − 2λ)θ1,2
+(1 − 2λ)θ1,3
+(1 − 2λ)θ1,4
.
.
.
.
+(1 − 2λ)θ1,4

(66)
Implementación computacional:
Para realizar la simulación de este caso de estudio utilizando el modelo matemático anteriormente
desarrollado, se hizo uso del lenguaje de programación FORTRAN 90, en el Apéndice C se puede
observar el archivo .f90 que contiene el código y algoritmo desarrollado.
Este código calcula e implementa los factores adimensionalizados β, λ y µ para luego con ellos
llenar las dos matrices tridiagonales correspondientes a cada semiciclo del paso en el tiempo , luego
mediante el algoritmo de Thomas (Ver [3]) soluciona el sistema matricial obtenido en las expresiones
61 hasta 66, comenzando el primer semiciclo del paso temporal por la frontera D con la expresion 66 y
avanzando hasta la frontera B con la expresión B 64, teniendo en cuenta los nodos internos regidos por
la expresión 61, y de igual forma realiza el segundo semiciclo empezando por la frontera A (expresión
63) y terminado en la frontera C (expresión 65) pasando por los nodos internos (expresión 62).
Las gráficas de evolución en el tiempo de la temperatura a lo largo de la placa se obtuvieron con
el software GNUPLOT.
25
3.3.
Resultados:
Para la simulación del modelo matemático en este caso de estudio se tomaron como parámetros
iniciales los siguientes datos:
α = 2,0
Tref = 293K
Lref = 1,0
Tiempo de Simulacion = 10 seg
Paso temporal ∆t = 5x10−4 seg
Numero de Nodos = 20
wx = wy = 1
Los resultados obtenidos con estos parámetros se encuentran en el Apéndice D.1 en donde se pueden
observar las gráficas para la evolución de la temperatura a lo largo de la placa en el tiempo.
En la Graficas 11 hasta 14 se pueden apreciar los perfiles de temperaturas en distintos instantes
de tiempo, ademas es evidente como se cumplen las condiciones de frontera en cada paso temporal.
por ejemplo, en las fronteras B y C regidas por las expresiones 39 y 40, las cuales son Condiciones
de Dirichlet, su temperatura no varia a largo del tiempo, es decir, son constante; de igual manera se
cumple para las fronteras C y D cuyas expresiones son 41 y 42 respectivamente, condiciones Nouman
nulas, presentado un perfil de temperaturas en estas fronteras que tiene a ser constante en su respectiva
dirección normal.
Figura 11: Perfil de Temperaturas en t=0.005
seg.
Figura 12: Perfil de Temperaturas en t=0.015
seg.
Figura 13: Perfil de Temperaturas en t=0.1
seg.
Figura 14: Perfil de Temperaturas en t=10
seg.
Para un mayor análisis de estudio, se deicidió variar el parámetro α a valores de α = 4,0 y α = 10,0
y observar el comportamiento de los perfiles de temperaturas a lo largo del tiempo. Estos resultados
se encuentran en los Apéndices D.2 y D.3.
26
La única diferencia que se observar la realizar esta variación fue la velocidad con la que evoluciona
la temperatura a lo largo de la placa, ya que cuando α = 2,0 la placa experimenta un cambio de
temperaturas mas rápido que cuando α = 4,0 y con mayor notoriedad cuando α = 10,0.
3.4.
Conclusiones:
En las diversas situaciones ingenieriles en donde modelos matemáticos se pueden plantear para
solucionar determinado problema, estos resultan tener un alto grado de complejidad que dificultan
encontrar una solución analı́tica, como por ejemplo, los casos con ecuaciones diferenciales parciales con
alto grado de NO linealidad, como se presentó en este caso de estudio. Para ello, se puede recurrir a
soluciones numéricas como el método de diferencias finitas, que aunque no den una solución analı́tica
general del problema, permite obtener comportamientos del sistema en distintas situaciones, lo que
resulta muy útil al momento de toma de decisiones y criterios de diseño.
Referencias
[1] Richard G. Budynas y J. Keith Nisbett, Diseño en Ingenierı́a Mecánica de Shigley, Octava
Edición, McGraw-Hill, Mexico, DF, 2008.
[2] Dr. Carlos A. Duque-Daza y M.Sc. J.A. Ramı́rez, Optimización y Ecuaciones Diferenciales
Parciales, Curso de Modelación Matemática, Facultad de Ingenierı́a, Universidad Nacional de
Colombia, Bogotá DC, Colombia, 2015.
[3] Izar Landeta, Juan Manuel, Elementos de métodos numéricos para ingenierı́a, Cuarta Edición,
Editorial Universitaria Potosina, Universidad Autónoma de San Luis de Potosı́, México, 1998.
[4] CENGEL Yunes y BOLES Michael, Termodinámica Técnica, Séptima edición, McGraw-Hill,
Mexico, DF, 2012.
27
Appendices
A.
Script del Archivo .mod usado para la Optimización en el
NEOS
# resorte.mod OQR2-MN-2-3
# Original AMPL coding by Elena Bobrovnikova (summer 1996 at Bell Labs).
# Ref.: W. Hock and K. Schittkowski, Test Examples for Nonlinear Programming
# Codes. Lecture Notes in Economics and Mathematical Systems, v. 187,
# Springer-Verlag, New York, 1981, p. 38.
# Number of variables: 3
# Number of constraints: 10
# Objective nonseparable
# Objective nonconvex
# Nonlinear constraints
var x{1..3};
minimize Obj:
(x[1]+2)*(x[2]^2)*x[3];
s.t. Ineq1:
1-((P*(x[3]^3)*x[1])/(718750*(x[2]^4))) <= 0;
s.t. Ineq2:
(((8*P*x[3])/(Tao*3.14159*(x[2]^3)))*(((4*x[3]-x[2])/(4*x[3]-4*x[2]))+
((0.615*x[2])/x[3])))-1 <= 0;
s.t. Ineq3:
1-((14054*x[2])/((Omega*x[3]^2)*x[1])) <= 0;
s.t. Ineq4:
((x[3]+x[2])/1.5)-1 <= 0;
s.t. Bound1:
x[1] <= 15;
s.t. Bound2:
x[1] >= 2;
s.t. Bound3:
x[2] <= 0.2;
s.t. Bound4:
x[2] >= 0.05;
s.t. Bound5:
x[3] <= 1.3;
s.t. Bound6:
x[3] >= 0.25;
data;
var x :=
1
3
2
0.2
3
1;
28
B.
Script del Archivo .f90 usado para la solución numérica
del caso de estudio 2
module tiposDatos
! -------------------------------------------------------------------------------! En este modulo solo creamos los tipos de datos, especialmente un tipo de doble
! precision real, independiente de la maquina.
--------------------------------! -------------------------------------------------------------------------------integer(kind=SELECTED_INT_KIND(8)), parameter, public ::
&
ishort = SELECTED_INT_KIND(8),
&
ilong = SELECTED_INT_KIND(8)
integer(kind=SELECTED_INT_KIND(8)), parameter, public ::
&
rshort = KIND(1.0),
&
rlong = SELECTED_REAL_KIND(8),
&
rllong = SELECTED_REAL_KIND(2*precision(1.0_rlong))
integer(kind=SELECTED_INT_KIND(8)), parameter, public :: isp = ishort
integer(kind=SELECTED_INT_KIND(8)), parameter, public :: idp = ilong
integer(kind=SELECTED_INT_KIND(8)), parameter, public :: rsp = rshort
integer(kind=SELECTED_INT_KIND(8)), parameter, public :: rdp = rlong
integer(kind=SELECTED_INT_KIND(8)), parameter, public :: rqp = rllong
! -------------------------------------------------------------------------------end module tiposDatos
! -------------------------------------------------------------------------------! Rutinas para solucionar el sistema de ecuaciones representadas en forma matricial
! tanto explicitamente como implicitamente.
! -------------------------------------------------------------------------------module Programas
use tiposDatos
implicit none
contains
! -------------------------------------------------------------------------------! Rutina para resolver matrices tridiagonales de forma implicita: Ax=d
! donde:
! A -> Matriz de Coeficientes
! x -> Vector de Incognitas
! d -> Vector de Valores Conocidos
! En esta rutina se usa el metodo TDMA o algoritmo de Thomas
! -------------------------------------------------------------------------------subroutine implicit(N, matA, vecD, vecX)
use tiposDatos
implicit none
integer(kind=isp), intent(in) :: N
real(kind=rdp), dimension(N), intent(in) :: vecD
real(kind=rdp), dimension(N,N), intent(in) :: matA
real(kind=rdp), dimension(N), intent(out) :: vecX
integer(kind=isp) :: i
real(kind=rdp), dimension(N) :: vecB, vecG
! -------------------------------------------------------------------------------vecB(1)=matA(1,1)
29
vecG(1)=vecD(1)/vecB(1)
do i=2, N
vecB(i)=matA(i,i)-(matA(i,i-1)*matA(i-1,i)/vecB(i-1))
vecG(i)=(vecD(i)-(matA(i,i-1)*vecG(i-1)))/vecB(i)
enddo
! -------------------------------------------------------------------------------vecX(N)=vecG(N)
do i=N-1,1, -1
vecX(i)=vecG(i)-(matA(i,i+1)*vecX(i+1)/vecB(i))
enddo
! -------------------------------------------------------------------------------return
end subroutine implicit
! -------------------------------------------------------------------------------! Rutina para resolver matrices tridiagonales de forma explicita: Ad=x
! donde:
! A -> Matriz de Coeficientes
! x -> Vector de Incognitas
! d -> Vector de Valores Conocidos
! En esta rutina se usa el metodo de multiplicacion de Matrices Tridiagonales
! -------------------------------------------------------------------------------subroutine explicit(N, matA, vecD, vecX)
use tiposDatos
implicit none
integer(kind=isp), intent(in) :: N
real(kind=rdp), dimension(N), intent(in) :: vecD
real(kind=rdp), dimension(N,N), intent(in) :: matA
real(kind=rdp), dimension(N), intent(out) :: vecX
integer(kind=isp) :: i
! -------------------------------------------------------------------------------vecX(1)=(matA(1,1)*vecD(1))+(matA(1,2)*vecD(2))
do i = 2, N-1
vecX(i)=(matA(i,i-1)*vecD(i-1))+(matA(i,i)*vecD(i))+(matA(i,i+1)*vecD(i+1))
enddo
vecX(N)=(matA(N,N-1)*vecD(N-1))+(matA(N,N)*vecD(N))
! -------------------------------------------------------------------------------return
end subroutine explicit
! -------------------------------------------------------------------------------! -------------------------------------------------------------------------------! -------------------------------------------------------------------------------end module Programas
30
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
-------------------------------------------------------------------------------********************************************************************************
--------------------------------------------------------------------------------------------------------------------------------------------------------------PROGRAMA PRINCIPAL PARA PROBLEMA DE ADVECCION-DIFUSION-REACCION EN UN REACTOR
QUIMICO
-------------------------------------------------------------------------------Programa para resolver numericamente la concentracion de un reactivo a lo largo
de un reactor quimico de seccion transversal constante, usando diferencias
finitas centradas en el espacio y Crank-Nicolson en el tiempo, resultanto una
ecuacion matricial de la forma: Ax=By+BC
Donde:
A -> Matriz de Coeficientes para los nodos en el tiempo n+1 (Implicito)
X -> Vector de Incognitas de nodos en el tiempo n+1
B -> Matriz de Coeficientes para el tiempo n (Explicito)
y -> Vector de Valores conocidos de nodos en el tiempo n
BC -> Vector de Condiciones de Frontera
--------------------------------------------------------------------------------
program Reactor
use tiposDatos
use Programas
implicit none
real(kind=rdp)
real(kind=rdp)
real(kind=rdp)
real(kind=rdp)
real(kind=rdp)
::
::
::
::
::
D
L
U
cref
k
! Coeficiente de Difusion
! Distancia Longitudinal
! Velocidad Promedio de flujo de reactivo
! Valor de Referencia de Concentracion
! Velocidad de reaccion del reactivo
real(kind=rdp) :: tiempo
real(kind=rdp) :: dt
integer(kind=isp) :: N
! Tiempo de Simulacion
! Saltos en el tiempo
! Cantidad de Nodos en dividir la Longitud
real(kind=rdp), dimension(:), allocatable :: vecX, vecY, vecBC, vecT
real(kind=rdp), dimension(:,:), allocatable :: matA, matB, matResultados
real(kind=rdp) :: beta, alfa, phi, mi, theta, eta, gama, rho, psi
integer(kind=isp) :: i, j, pasos
real(kind=rdp) :: dx
character(len=20)
::
formatoResultados
! -------------------------------------------------------------------------------! Se leen los datos de entrada del problema
! -------------------------------------------------------------------------------open(unit=35, file=’datosReactor.txt’, action=’read’)
read(35,*) D, L, U, cref, k
read(35,*) tiempo, dt
read(35,*) N
31
! -------------------------------------------------------------------------------! Se calcula el tama~
no de grilla espacial y el numero de pasos en el tiempo
! -------------------------------------------------------------------------------dx = L/N
pasos = floor(tiempo/dt)
! -------------------------------------------------------------------------------! Se adimencionalizan el tama~
no de grilla y los saltos temporales
! -------------------------------------------------------------------------------dx = dx/L
dt = dt*U/L
! -------------------------------------------------------------------------------! Se calcula el dt apropiado para cumplir el criterio de estabilidad
! -------------------------------------------------------------------------------print*," "
print*,"-----------------------------------------------------------"
print*,"Para que el sistema sea estable, el DT debe ser menor a", &
& 1.0D0/(((2.0D0*D)/(U*L*dx**2.0D0))+((L*k)/(2.0D0*U)))
print*,’El numero de puntos en X es: ’, N
print*,’El numero de puntos en T es: ’, pasos
print*,’El tamanho de grilla en X es: ’, dx
print*,’El tamanho de grilla en T es: ’, dt
print*,"-----------------------------------------------------------"
print*,"
"
! -------------------------------------------------------------------------------! Se calculan los valores de Beta y Alfa resultantes de la adimensionalizacion de
! la ecuacion diferencial parcial
! -------------------------------------------------------------------------------beta = D/(U*L)
alfa = (L*k)/U
! -------------------------------------------------------------------------------! Se calculan los valores de Phi, Mi y Theta resultantes del Planteamiento
! discreto en diferencias finitas centradas en el espacio y Crank-Nicolson en el
! tiempo
! -------------------------------------------------------------------------------phi = beta*dt/(2.0D0*(dx**2.0D0))
mi = dt/(4.0D0*dx)
theta = dt*alfa/2.0D0
! -------------------------------------------------------------------------------! Se calculan los valores de Eta, Gama y Rho resultantes del reordenamiento y
! agrupacion de terminos en la ecuaciones discreta
! -------------------------------------------------------------------------------eta = (2.0D0*phi) + theta
gama = phi - mi
rho = phi + mi
! -------------------------------------------------------------------------------! Se calcula en valor Psi resultante de las condiciones de frontera
! -------------------------------------------------------------------------------psi = rho*dx/beta
32
! -------------------------------------------------------------------------------! Se procede a llenar la Matriz Tridiagonal A (Implicita)
! -------------------------------------------------------------------------------allocate(matA(N,N))
matA = 0.0D0
matA(1,1) = (2.0D0*psi) + 1.0D0 + eta
matA(1,2) = -(rho + gama)
do i=2, N-1
matA(i,i-1) = -rho
matA(i,i) = (1.0D0 + eta)
matA(i,i+1) = -gama
enddo
matA(N,N-1) = -(rho + gama)
matA(N,N) = (1.0D0 + eta)
! -------------------------------------------------------------------------------! Se procede a llenar la Matriz Tridiagonal B (Explicita)
! -------------------------------------------------------------------------------allocate(matB(N,N))
matB=0.0D0
matB(1,1) = -(2.0D0*psi) + 1.0D0 - eta
matB(1,2) = (rho + gama)
do i=2, N-1
matB(i,i-1) = rho
matB(i,i) = (1.0D0 - eta)
matB(i,i+1) = gama
enddo
matB(N,N-1) = (rho + gama)
matB(N,N) = (1.0D0 - eta)
! -------------------------------------------------------------------------------! Se procede a llenar el Vector de Condicones de Frotenra
! -------------------------------------------------------------------------------allocate(vecBC(N))
vecBC = 0.0D0
vecBC(1) = 4.0D0*psi
! -------------------------------------------------------------------------------! Se procede a llenar el Vector de Valores Conocidos
! -------------------------------------------------------------------------------allocate(vecY(N))
vecY = 0.0D0
! -------------------------------------------------------------------------------! Se procede a crear la matriz de resultados y escribir en la primera columna los
! Nodos y en la segunda las Condiciones Iniciales
! -------------------------------------------------------------------------------allocate(matResultados(N, pasos+2))
33
do i=1,N
matResultados(i,1) = dx*dble(i)
enddo
do i=1,N
matResultados(i,2) = vecY(i)
enddo
! -------------------------------------------------------------------------------! Se da inicio a la solucion numerica del problema
! -------------------------------------------------------------------------------allocate(vecX(N))
allocate(vecT(N))
do j=1,pasos
! -------------------------------------------------------------------------------! Se procede a Realizar la multiplicacion de la matriz A y el Vector Y (lado
! derecho de la ecuacion) para conocer el vector de valores conocidos.
! -------------------------------------------------------------------------------call explicit(N, matB, vecY, vecT)
vecY = vecT+vecBC
! -------------------------------------------------------------------------------! Se procede a resolver el sistema matricial del lado izquierdo de la ecuacion
! (Implicito) por medio de LTDM
! -------------------------------------------------------------------------------call implicit(N, matA, vecY, vecX)
vecY = vecX
! -------------------------------------------------------------------------------! Se escriben el vector Solucion X en la matriz de Resultados
! -------------------------------------------------------------------------------do i=1, N
matResultados(i,j+2)=vecY(i)
enddo
enddo
! -------------------------------------------------------------------------------! Se crea el archivo de Salida de Resultados
! -------------------------------------------------------------------------------open(unit=99, file=’Resultados.dat’, action=’write’, status=’unknown’)
!
!
!
!
!
!
-------------------------------------------------------------------------------Se copian la matriz de resultados en el archivo de salida
-------------------------------------------------------------------------------Aca vamos a crear el formato de escritura. La razon de esto es que el numero
de pasos de tiempo no es conocido de antemano, y necesitamos definir el
formato adecuadamente.
if (pasos+2 < 10) then
write(formatoResultados,’(A1,I1,A12)’) ’(’,pasos+2,’(ES14.7,3X))’
else if (pasos+2 < 100 ) then
34
write(formatoResultados,’(A1,I2,A12)’) ’(’,pasos+2,’(ES14.7,3X))’
else if (pasos+2 < 1000 ) then
write(formatoResultados,’(A1,I3,A12)’) ’(’,pasos+2,’(ES14.7,3X))’
else if (pasos+2 < 10000 ) then
write(formatoResultados,’(A1,I4,A12)’) ’(’,pasos+2,’(ES14.7,3X))’
else if (pasos+2 < 100000 ) then
write(formatoResultados,’(A1,I5,A12)’) ’(’,pasos+2,’(ES14.7,3X))’
else
print*, ’Error con la definicion de formato para la escritura de resultados...’
print*, ’Mire el archivo fuente en la linea 197’
stop
endif
print*, ’Formato de escritura es: ’, formatoResultados
! -------------------------------------------------------------------------------do i=1,N
write(99,formatoResultados) matResultados(i,1)*L, (matResultados(i,j)*cref, j=2,pasos+2)
enddo
! --------------------------------------------------------------------------------
close(99)
stop
contains
end program Reactor
C.
Script del Archivo .f90 usado para la solución numérica
del caso de estudio 3
module tiposDatos
! -------------------------------------------------------------------------------! En este modulo solo creamos los tipos de datos, especialmente un tipo de doble
! precision real, independiente de la maquina.
--------------------------------! -------------------------------------------------------------------------------integer(kind=SELECTED_INT_KIND(8)), parameter, public ::
&
ishort = SELECTED_INT_KIND(8),
&
ilong = SELECTED_INT_KIND(8)
integer(kind=SELECTED_INT_KIND(8)), parameter, public ::
&
rshort = KIND(1.0),
&
rlong = SELECTED_REAL_KIND(8),
&
rllong = SELECTED_REAL_KIND(2*precision(1.0_rlong))
integer(kind=SELECTED_INT_KIND(8)), parameter, public :: isp = ishort
integer(kind=SELECTED_INT_KIND(8)), parameter, public :: idp = ilong
integer(kind=SELECTED_INT_KIND(8)), parameter, public :: rsp = rshort
integer(kind=SELECTED_INT_KIND(8)), parameter, public :: rdp = rlong
integer(kind=SELECTED_INT_KIND(8)), parameter, public :: rqp = rllong
! -------------------------------------------------------------------------------end module tiposDatos
!
!
!
!
-------------------------------------------------------------------------------Rutinas para solucionar el sistema de ecuaciones representadas en forma matricial
tanto explicitamente como implicitamente.
--------------------------------------------------------------------------------
35
module Programas
use tiposDatos
implicit none
contains
! -------------------------------------------------------------------------------! Rutina para resolver matrices tridiagonales de forma implicita: Ax=d
! donde:
! A -> Matriz de Coeficientes
! x -> Vector de Incognitas
! d -> Vector de Valores Conocidos
! En esta rutina se usa el metodo TDMA o algoritmo de Thomas
! -------------------------------------------------------------------------------subroutine implicit(N, matA, vecD, vecX)
use tiposDatos
implicit none
integer(kind=isp), intent(in) :: N
real(kind=rdp), dimension(N), intent(in) :: vecD
real(kind=rdp), dimension(N,N), intent(in) :: matA
real(kind=rdp), dimension(N), intent(out) :: vecX
integer(kind=isp) :: i
real(kind=rdp), dimension(N) :: vecB, vecG
! -------------------------------------------------------------------------------vecB(1)=matA(1,1)
vecG(1)=vecD(1)/vecB(1)
do i=2, N
vecB(i)=matA(i,i)-(matA(i,i-1)*matA(i-1,i)/vecB(i-1))
vecG(i)=(vecD(i)-(matA(i,i-1)*vecG(i-1)))/vecB(i)
enddo
! -------------------------------------------------------------------------------vecX(N)=vecG(N)
do i=N-1,1, -1
vecX(i)=vecG(i)-(matA(i,i+1)*vecX(i+1)/vecB(i))
enddo
! -------------------------------------------------------------------------------return
end subroutine implicit
! -------------------------------------------------------------------------------! Rutina para resolver matrices tridiagonales de forma explicita: Ad=x
! donde:
! A -> Matriz de Coeficientes
! x -> Vector de Incognitas
! d -> Vector de Valores Conocidos
! En esta rutina se usa el metodo de multiplicacion de Matrices Tridiagonales
! -------------------------------------------------------------------------------subroutine explicit(N, matA, vecD, vecX)
use tiposDatos
implicit none
36
integer(kind=isp), intent(in) :: N
real(kind=rdp), dimension(N), intent(in) :: vecD
real(kind=rdp), dimension(N,N), intent(in) :: matA
real(kind=rdp), dimension(N), intent(out) :: vecX
integer(kind=isp) :: i
! -------------------------------------------------------------------------------vecX(1)=(matA(1,1)*vecD(1))+(matA(1,2)*vecD(2))
do i = 2, N-1
vecX(i)=(matA(i,i-1)*vecD(i-1))+(matA(i,i)*vecD(i))+(matA(i,i+1)*vecD(i+1))
enddo
vecX(N)=(matA(N,N-1)*vecD(N-1))+(matA(N,N)*vecD(N))
! -------------------------------------------------------------------------------return
end subroutine explicit
! -------------------------------------------------------------------------------! Funcion que modela el factor de fuente de calor
! -------------------------------------------------------------------------------real*8 function fuente(t, x, y, wx, wy)
real*8 :: t, x, y, wx, wy
fuente= ((6.0D0/(1+exp(-t)))-3.0D0)*exp(-(((x-0.5D0)/wx)**2.0D0)-(((y-0.5D0)/wy)**2.0D0))
end function fuente
! -------------------------------------------------------------------------------! -------------------------------------------------------------------------------! -------------------------------------------------------------------------------end module Programas
program Placa
use tiposDatos
use Programas
implicit none
real(kind=rdp) ::
real(kind=rdp) ::
real(kind=rdp) ::
real(kind=rdp) ::
integer(kind=isp)
real(kind=rdp) ::
real(kind=rdp) ::
alfa
Tref
L
dh, dt
:: N
TA, TB
wx, wy
!Coeficiente de Difusividad
!Temperatura de Referencia
!Longitud de la placa en "x" y "y"
!Saltos espaciales en "x" y "y" y saltos temporales
!Numero de nodos que se dividiran la placa
!Temperatura en las Fronteras A y B de la placa
!rangos de la funcion de generacion de calor
real(kind=rdp), DIMENSION(:,:), allocatable :: matA, matB, matResultados, matTemp
real(kind=rdp), DIMENSION(:), allocatable :: vecGen, vecFA, vecFB, vecX, vecY
real(kind=rdp) :: tiempo
37
real(kind=rdp) :: theta, beta, lambda, miu, thetaA, thetaB
integer(kind=isp) :: pasos, i, j, k, t
character(len=20)
::
formatoResultados
! -------------------------------------------------------------------------------! Se leen los datos de entrada del problema
! -------------------------------------------------------------------------------open(unit=35, file=’datosPlaca.txt’, action=’read’)
read(35,*)
read(35,*)
read(35,*)
read(35,*)
read(35,*)
alfa, TA, TB, Tref
L
tiempo, dt
N
wx, wy
! -------------------------------------------------------------------------------! Se calcula en tama~
no de la grilla espacial y el numero de pasos en el tiempo
! -------------------------------------------------------------------------------dh = L/N
print*, "El tama~
no de grilla es de: ", dh
pasos = floor(tiempo/dt)
print*, "El numero de pasos en el tiempo es de: ", pasos
! -------------------------------------------------------------------------------! Se calcula el factor beta que adimencionaliza el coeficiente de la fuente
! -------------------------------------------------------------------------------beta = (L**2.0D0)/(alfa*Tref)
print*, "El factor beta es de: ", beta
! -------------------------------------------------------------------------------! Se calcula el factor lambda y miu resultante de la discretizacion de las
! ecuaciones
! -------------------------------------------------------------------------------lambda = dt/(2.0D0*dh*dh)
miu = dt*beta/2.0D0
print*, "el factor lambda es de: ", lambda
print*, "el factor miu es de: ", miu
! -------------------------------------------------------------------------------! Se calcula el beta adimensional en las forteras A y B por C. Dirichlet
! -------------------------------------------------------------------------------thetaA = (TA-Tref)/Tref
thetaB = (TB-Tref)/Tref
print*, "el factor ThetaA es de: ", ThetaA
print*, "el factor ThetaB es de: ", ThetaB
! -------------------------------------------------------------------------------! Se proceden a llenar las matrices A y B resultantes del analisis para cada
! nodo en el tiempo n y n+1
! -------------------------------------------------------------------------------allocate(matA(N-1,N-1))
matA = 0.0D0
matA(1,1) = 1.0D0 + 2.0D0*lambda
38
matA(1,2) = -lambda
do i=2, N-2
matA(i,i-1) = -lambda
matA(i,i) = 1.0D0 + 2.0D0*lambda
matA(i,i+1) = -lambda
enddo
matA(N-1,N-2) = -2.0D0*lambda
matA(N-1,N-1) = 1.0D0 + 2.0D0*lambda
! -------------------------------------------------------------------------------allocate(matB(N-1,N-1))
matB = 0.0D0
matB(1,1) = 1.0D0 + 2.0D0*lambda
matB(1,2) = -2.0D0*lambda
do i=2, N-2
matB(i,i-1) = -lambda
matB(i,i) = 1.0D0 + 2.0D0*lambda
matB(i,i+1) = -lambda
enddo
matB(N-1,N-2) = -lambda
matB(N-1,N-1) = 1.0D0 + 2.0D0*lambda
! -------------------------------------------------------------------------------! Se procede a llenar los vectores de condiciones de Frontera
! -------------------------------------------------------------------------------allocate(vecFA(N-1),vecFB(N-1))
vecFA = 0.0D0
vecFA(1) = lambda*thetaA
vecFB = 0.0D0
vecFB(N-1) = lambda*thetaB
! -------------------------------------------------------------------------------! Se procede a llenar la matriz temporal solucion con los valores iniciales
! -------------------------------------------------------------------------------allocate(matTemp(N,N))
matTemp=0.0D0
do i=1,N
matTemp(i,1) = thetaA
enddo
do j=1,N
matTemp(N,j) = thetaB
enddo
! --------------------------------------------------------------------------------
39
! Se procede a llenar la matriz de resultados con las condiciones inciales del
! problema
! -------------------------------------------------------------------------------allocate(matResultados(N*N,pasos+3))
do i=1,N
do j=1,N
matResultados(j+(i-1)*N,1) = i
matResultados(j+(i-1)*N,2) = j
matResultados(j+(i-1)*N,3) = matTemp(i,j)
enddo
enddo
! -------------------------------------------------------------------------------! Se procede a dar comienzo a la solucion numerica por el metodo de ADI al
! caso de estudio
! -------------------------------------------------------------------------------allocate(vecX(N-1),vecY(N-1), vecGen(N-1))
do t=1,pasos
! -------------------------------------------------------------------------------! Se realiza la implemetacion numerica para cuando x->explicito, y->implicito
! -------------------------------------------------------------------------------do i=1,N-1
! -------------------------------------------------------------------------------! Primero se realiza la implementacion numerica a la frontera D (Lado izquierdo
! de la placa)
if (i==1) then
do j=2,N
vecX(j-1) = (1.0D0 - 2.0D0*lambda)*matTemp(i,j) + 2.0D0*lambda*matTemp(i+1,j)
vecGen(j-1) = miu*fuente(dble(t)*dt, dble(i)*dh, dble(j)*dh, wx, wy)
enddo
vecX = vecX + vecGen + vecFA
call implicit(N-1, matA, vecX, vecY)
do j=2,N
matTemp(i,j)=vecY(j-1)
enddo
! -------------------------------------------------------------------------------! Primero se realiza la implementacion numerica a la frontera B (Lado derecho
! de la placa)
else if (i==N-1) then
do j=2,N
vecX(j-1) = lambda*matTemp(i-1,j) + (1.0D0 - 2.0D0*lambda)*matTemp(i,j) + lambda
vecGen(j-1) = miu*fuente(dble(t)*dt, dble(i)*dh, dble(j)*dh, wx, wy)
enddo
40
vecX = vecX + vecGen + vecFA
call implicit(N-1, matA, vecX, vecY)
do j=2,N
matTemp(i,j)=vecY(j-1)
enddo
! -------------------------------------------------------------------------------! Primero se realiza la implementacion numerica a los columnas internas de la
! placa
else
do j=2,N
vecX(j-1) = lambda*matTemp(i-1,j) + (1.0D0 - 2.0D0*lambda)*matTemp(i,j) + lambda
vecGen(j-1) = miu*fuente(dble(t)*dt, dble(i)*dh, dble(j)*dh, wx, wy)
enddo
vecX = vecX + vecGen + vecFA
call implicit(N-1, matA, vecX, vecY)
do j=2,N
matTemp(i,j)=vecY(j-1)
enddo
endif
enddo
! -------------------------------------------------------------------------------! Se realiza la implemetacion numerica para cuando y->explicito, x->implicito
! -------------------------------------------------------------------------------do j=2,N
! -------------------------------------------------------------------------------! Se realiza la implementacion numerica a la frontera A (Lado inferior de la
! placa)
if (j==2)
then
do i=1,N-1
vecX(i) = lambda*thetaA + (1.0D0 - 2.0D0*lambda)*matTemp(i,j) + lambda*matTemp(i
vecGen(i) = miu*fuente((dble(t)+0.5D0)*dt, dble(i)*dh, dble(j)*dh, wx, wy)
enddo
vecX = vecX + vecGen + vecFB
call implicit(N-1, matB, vecX, vecY)
41
do i=1,N-1
matTemp(i,j)=vecY(i)
enddo
! -------------------------------------------------------------------------------! Se realiza la implementacion numerica a la frontera C (Lado superior de la
! placa)
else if (j==N) then
do i=1,N-1
vecX(i) = 2.0D0*lambda*matTemp(i,j-1) + (1.0D0 - 2.0D0*lambda)*matTemp(i,j)
vecGen(i) = miu*fuente(dble(t)*dt, dble(i)*dh, dble(j)*dh, wx, wy)
enddo
vecX = vecX + vecGen + vecFB
call implicit(N-1, matB, vecX, vecY)
do i=1,N-1
matTemp(i,j)=vecY(i)
enddo
! -------------------------------------------------------------------------------! Se realiza la implementacion numerica a las filas internas de la placa
else
do i=1,N-1
vecX(i) = lambda*matTemp(i,j-1) + (1.0D0 - 2.0D0*lambda)*matTemp(i,j) + lambda*m
vecGen(i) = miu*fuente(dble(t)*dt, dble(i)*dh, dble(j)*dh, wx, wy)
enddo
vecX = vecX + vecGen + vecFB
call implicit(N-1, matB, vecX, vecY)
do i=1,N-1
matTemp(i,j)=vecY(i)
enddo
endif
enddo
! -------------------------------------------------------------------------------! Se imprimen los datos de la matTemp en la matriz de Resultados
do i=1,N
do j=1,N
matResultados(j+(i-1)*N,t+3) = matTemp(i,j)
enddo
enddo
enddo
42
! -------------------------------------------------------------------------------! Se crea el archivo de Salida de Resultados
! -------------------------------------------------------------------------------open(unit=99, file=’Resultados.dat’, action=’write’, status=’unknown’)
!
!
!
!
!
!
-------------------------------------------------------------------------------Se copian la matriz de resultados en el archivo de salida
-------------------------------------------------------------------------------Aca vamos a crear el formato de escritura. La razon de esto es que el numero
de pasos de tiempo no es conocido de antemano, y necesitamos definir el
formato adecuadamente.
if (pasos+3 < 10) then
write(formatoResultados,’(A1,I1,A12)’) ’(’,pasos+2,’(ES14.7,3X))’
else if (pasos+3 < 100 ) then
write(formatoResultados,’(A1,I2,A12)’) ’(’,pasos+2,’(ES14.7,3X))’
else if (pasos+3 < 1000 ) then
write(formatoResultados,’(A1,I3,A12)’) ’(’,pasos+2,’(ES14.7,3X))’
else if (pasos+3 < 10000 ) then
write(formatoResultados,’(A1,I4,A12)’) ’(’,pasos+2,’(ES14.7,3X))’
else if (pasos+3 < 100000 ) then
write(formatoResultados,’(A1,I5,A12)’) ’(’,pasos+2,’(ES14.7,3X))’
else
print*, ’Error con la definicion de formato para la escritura de resultados...’
print*, ’Mire el archivo fuente en la linea 197’
stop
endif
print*, ’Formato de escritura es: ’, formatoResultados
! -------------------------------------------------------------------------------do i=1,N*N
write(99,formatoResultados) matResultados(i,1)*dh, matResultados(i,2)*dh, ((matResultados(i,
enddo
! --------------------------------------------------------------------------------
close(99)
stop
contains
43
D.
D.1.
Resultados Gráficos de la implementación computacional
del modelo matemático para el caso de estudio 3
Gráficas de evolución en el tiempo de la temperatura a lo largo de
placa para α = 2,0
Figura 15
Figura 16
Figura 17
Figura 18
Figura 19
Figura 20
44
D.2.
D.3.
Gráficas de evolución en el tiempo de la temperatura a lo largo de
placa para α = 4,0
Figura 21
Figura 22
Figura 23
Figura 24
Figura 25
Figura 26
Gráficas de evolución en el tiempo de la temperatura a lo largo de
placa para α = 10,0
Figura 27
Figura 28
45
Figura 29
Figura 30
Figura 31
Figura 32
46
Download