R-package
library(deSolve) #PVI,ESD,EDP y EDO
library(ReacTran) #EDP
library(bvpSolve) #PVI
library(rootSolve) #EDO
library(PBSddesolve) #DDE
Ecuación Diferencial Algebraica(EDA)
Una ecuación diferencial algebraica esta conformada para una ecuación
diferencial acompañada de una ecuación algebraica. \[
\begin{eqnarray}
y'&=& f(t,y,p) \\
0&=& g(t,y,p)
\end{eqnarray}
\] El índice de un EDA es el número de diferenciaciones
necesarias hasta obtener un sistema compuesto únicamente por EDO. La
función daspk
del paquete deSolve
resuelve
(relativamente simple) EDA de índice como máximo 1, mientras que la
función radau
resuelve EDA de índice hasta 3.
Ejemplo:
El llamado “problema de Rober” describe una reacción autocatalítica entre tres especies químicas, \(y1\), \(y2\) e \(y3\). El problema puede ser formulado ya sea como una EDO o como la siguiente EDA: \[ \begin{eqnarray} y_1'&=& -0.04y_1+10^4y_2y_3 \\ y_2'&=& 0.04y_1-10^4y_2y_3 -310^7y_2^2\\ 1&=& y_1+y_2+y_3 \end{eqnarray} \]
donde las dos primeras ecuaciones son diferenciales ecuaciones que especifican la dinámica de la química especies y1 e y2, mientras que la tercera ecuación algebraica asegura que la concentración suma de los tres la especie permanece 1.
El DAE tiene que ser especificado por la función residual en lugar de las tasas de cambio.(Como en EDO).
\[ \begin{eqnarray} r_1'&=& -y_1'-0.04y_1+10^4y_2y_3 \\ r_2'&=& -y_2'+0.04y_1-10^4y_2y_3 -310^7y_2^2\\ r_3&=& -1+y_1+y_2+y_3 \end{eqnarray} \] Implementación en R:
<-function(t, y, dy, parms) {
edafun<- - dy[1]-0.04*y[1]+1e4*y[2]*y[3]
res1 <- - dy[2]+0.04*y[1]-1e4*y[2]*y[3]-3e7*y[2]^2
res2 <- y[1]+y[2]+y[3]-1
res3 list(c(res1, res2, res3),
error = as.vector(y[1]+y[2]+y[3])- 1)
}<- c(y1 = 1, y2 = 0, y3 = 0)
yini <- c(-0.04, 0.04, 0)
dyini <- 10 ^ seq(-6,6,0.1) times
Los argumentos de entrada de la función daefun
son los
tiempo actual(t), los valores de las variables de estado y sus derivadas
(y, dy) y los parámetros (parms).Devuelve los residuales, concatenados y
una salida. variable, el error en la ecuación algebraica. Este último se
añade para comprobar la exactitud de los resultados. Para DAE resueltos
con daspk
, tanto las variables de estado como sus derivados
deben inicializarse. Aquí nos aseguramos de que las condiciones
iniciales para y obedezcan la restricción algebraica, mientras que
también la condición inicial de las derivadas es consistente con la
dinámica.
library(deSolve)
print(system.time(out <-daspk(y = yini,dy = dyini,times = times,res = edafun,
parms = NULL)))
user system elapsed
0.08 0.01 0.10
Se puede utilizar un método de trazado S3 para trazar todas las variables a la vez:
plot(out, ylab = "conc.", xlab = "time",
type = "l", lwd = 2, log = "x")
mtext("IVP DAE", side = 3, outer = TRUE,line = -1)
Hay un cambio inicial muy rápido en las concentraciones, principalmente debido a la rápida reacción entre y1 y y2 y entre y2. Después de eso, la reacción lenta de y1 con y2 hace que el sistema cambie mucho más suavemente. Esto es típico de los problemas rígidos.
Solución del problema DAE para las sustancias y1,y2,y3; error de balance de masa: desviación de la suma total de uno.