Estos apuntes son una síntesis personal de las clases impartidas por Albert Oliver Serra. Cualquier error u omisión son mi responsabilidad y no reflejan necesariamente el contenido oficial del curso.
El ejemplo por excelencia de un problema elíptico es la Ecuación de Poisson con condiciones de contorno de Dirichlet homogéneas:
Enunciado: encuentra \(u : \mathbb R^n \to \mathbb R\) que satisfaga: \[ \begin{cases} -\nabla^2 u = f(\vec x) & \forall \vec x \in\Omega \subseteq \mathbb{R}^n \\ u(\vec x) = 0 & \forall \vec x \in \Gamma = \partial \Omega \\ \end{cases} \]
Resolvamos el caso particular cuando \(\Omega = [0, 1]\), en el que \(u\in C^2([0, 1])\), y: \[ \begin{cases} -u'' = f(x) & \forall x\in[0, 1] \\ u(0) = u(1) = 0 \end{cases} \]
Si integramos y definimos \(F(x)\) tal que \(F'(x) = f(x)\): \[ u' = -F(x) + C_1 \]
Como F(x) no es única, forzamos que \(F(x) = \int_0^x f(s)ds\), luego \(F(0) = 0\). Si volvemos a integrar: \[ u(x) = -\left(\int_0^x F(s)\,ds - C_1 x + C_2 \right)\] con \(C_1, C_2\in\mathbb{R}\).
Aplicando las condiciones de contorno: \[ \begin{cases} C_1 = \int_0^1 F(s)\,ds \\ C_2 = 0 \end{cases} \]
Reuniendo estas condiciones nos queda: \[u(x) = -\int_0^x F(s)\,ds + x\int_0^1 F(s)\,ds\]
Considerando la definición de \(F(s)\), podemos reescribir la expresión anterior: \[u(x) = \int_0^x s(1-x)f(s)\,ds + \int_x^1 x(1-s) f(s)\,ds\]
Y si definimos la función de Green: \[ G(x, s) = \min(x, s)[1-\max(x,s)] = \begin{cases} s(1-x) & \text{si } 0\le s\le x \\ x(1-s) & \text{si } x\le s\le 1 \end{cases} \]
Podemos finalmente escribir la solución como: \[ u(x) = \int_0^1 G(x, s) f(s)\,ds \]
: Propiedades de la solución:
Veamos la demostración de esta última propiedad: \[ |u| \le \int_0^1 G(x,s) |f(s)|\,ds \le ||f||_\infty \int_0^1 G(x,s)\,ds = \frac12 x(1-x) ||f||_\infty \]
y como el máximo de \(x(1-x)\) está en \(x=\frac12 \implies x(1-x)=\frac14\), se demuestra lo propuesto. □
Sea una EDP definida en el dominio continuo \(x\in\Omega=[0,1]\). Definimos el dominio discreto \(\Omega_h\) de \(N+1\) puntos y \(N\) intervalos, caracterizado por el parámetro \(h=\frac1N\) que representa la longitud de un intervalo.
Así, los puntos de la discretización son los siguientes: \[ \Omega_h = \{x_i=ih\::\:i=0,1,\dots,N\in\mathbb{N} \} \]
: En \(\Omega_h\) tenemos que aproximar \(u''\) con diferencias finitas, por ejemplo usando un esquema centrado: \[ u''(x)\approx \frac{u(x-h)-2u(x)+u(x+h)}{h^2} := \Delta_h u(x) \] donde \(\Delta_h\) es el operador de segunda diferencia finita.
: Sea \(v\in C^4([0, 1])\), entonces para todo \(x\in[h, 1-h]\) se tiene que: \[ \boxed{ |v''-\Delta_h v|| \le \frac{h^2}{12}||v^{(iv)}||_\infty } \]
Demostración del lema: aplicando el Teorema de Taylor a \(v(x+h)\) y \(v(x-h)\) obtenemos: \[ \begin{align*} v(x+h) = v(x) + hv'(x) + \frac1{2!} h^2 v''(x) + \frac1{3!} h^3 v'''(x) + \frac1{4!} h^4 v^{(iv)}(\xi_{+}) \\ v(x-h) = v(x) - hv'(x) + \frac1{2!} h^2 v''(x) - \frac1{3!} h^3 v'''(x) + \frac1{4!} h^4 v^{(iv)}(\xi_{-}) \end{align*} \] donde \(\xi_{+}\in[x, x+h]\) y \(\xi_{-}\in[x-h, x]\).
Si sumamos ambas expresiones, nos queda: \[ v(x-h)+v(x+h) = 2v(x)+h^2v''(x)+\frac1{4!}\left( v^{(iv)}(\xi_+) + v^{(iv)} (\xi_-)\right) \]
Podemos reorganizar la ecuación de forma que identifiquemos el operador de segunda diferencia finita: \[ \Delta_h v(x) = \frac{v(x-h)-2v(x)+v(x+h)}{h^2} = v''(x)+\frac{1}{4!}h^2\left( v^{(iv)}(\xi_+) + v^{(iv)}(\xi_-) \right) \]
Reorganizando términos, tomando valor absoluto y aplicando desigualdad triangular, llegamos a: \[ |v''(x) - \Delta_h v(x)| \le \frac1{4!}h^2\left( |v^{(iv)}(\xi_+)| + |v^{(iv)}(\xi_-)| \right) \]
Sea \(\xi\in\{\xi_+, \xi_-\}\) tal que \(v^{(iv)}(\xi) = \max\left(v^{(iv)}(\xi_+), v^{(iv)}(\xi_-)\right)\), entonces: \[ |v''(x) - \Delta_h v(x)| \le \frac{2}{4!}h^2|v^{(iv)}(\xi)|\le \frac{h^2}{12}||v^{(iv)}(x)||_\infty \] Quedando demostrado nuestro lema. □
Sea la siguiente EDP con condiciones de contorno: \[ \begin{cases} -u''= f(x) & x\in[0, 1] \\ u(0) = u(1) = 0 \end{cases} \]
Si discretizamos el dominio a \(\Omega_h\) con \(N\) intervalos: \[ \begin{cases} -\Delta_h u(x) = f(x) \\ u(0)=u(1)=0 \end{cases} \]
Lo que se traduce en el siguiente sistema de ecuaciones: \[ \left\{ \begin{align*} &-\frac{ u_{i-1} - 2u_i + u_{i+1}}{h^2} = f_i & i=1,\dots, N-1 \\ &u_0 = u_N = 0 \end{align*} \right. \]
El problema se reduce a resolver este sistema, que en forma matricial es un sistema con matriz tridiagonal simétrica: \[ \frac1{h^2} \begin{pmatrix} 2 & -1 & 0 & \cdots & 0 & 0 & 0 \\ -1 & 2 & -1 & \cdots & 0 & 0 & 0 \\ 0 & -1 & 2 & \cdots & 0 & 0 & 0 \\ \vdots & \vdots &\vdots &\ddots & \vdots & \vdots &\vdots \\ 0 & 0 & 0 & \cdots & 2 & -1 & 0 \\ 0 & 0 & 0 & \cdots & -1 & 2 & -1 \\ 0 & 0 & 0 & \cdots & 0 & -1 & 2 \end{pmatrix} \begin{pmatrix} u_1 \\ u_2 \\ u_3 \\ \vdots \\ u_{N-3} \\ u_{N-2} \\ u_{N-1} \end{pmatrix} = \begin{pmatrix} f_1 \\ f_2 \\ f_3 \\ \vdots \\ f_{N-3} \\ f_{N-2} \\ f_{N-1} \end{pmatrix} \]
: Llamamos función grid a una función \(\omega_h\) cuyo dominio es el espacio discreto \(\Omega_h\), i.e., \(\omega_h: \Omega_h \to \mathbb R\). El conjunto de todas las funciones grid lo denotamos \(V_h\), y definimos el siguiente subespacio: \[ V_h^0 = \{ \omega_h\in V_h : \omega_h(0) = \omega_h(1) = 0 \} \]
: Definimos el operador lineal discreto \(\mathcal{L}_h : V_h^0 \to V_h^0\) tal que, para todo \(\omega\in V_h^0\): \[ \left\{ \begin{align*} &\mathcal{L}_h[\omega_h](x_i) = -\Delta_h \omega_h(x_i) & i=1,\dots, N-1 \\ &\mathcal{L}_h[\omega_h](x_0) = \mathcal{L}_h[\omega_h](x_N) = 0 \end{align*} \right. \]
Por lo tanto, podemos definir el problema como encontrar \(u_h\in V_h^0\) tal que: \[\boxed{\mathcal L_h u_h = f_h}\] con \(f_h = \left. f \right|_{\Omega_h}\).
: Definimos la función discreta de Green \(G^k\in V_h^0\), para \(k=1,\dots, N-1\), como la solución de: \[ \mathcal L_h G^k = \delta^k \hspace{1cm} k=1, \dots, N-1 \\ \] donde \(\delta^k\in V_h^0\) tal que: \[\delta^k(x_i) = \delta(k-i) = \begin{cases} 0 & \text{si } i\neq k \\ 1 & \text{si } i=k\end{cases}\]
: Se cumple la siguiente relación entre las funciones de Green discreta y continua. \[ G^k(x_i) = h G(x_i, x_k)\] para \(i=1,\dots, N-1\).
Demostración del lema: Sea \(x_k \in \Omega_h\).
El primer paso será mostrar que \(\mathcal L_h G(\,\cdot\,, x_k)(x_i) = \frac1h \delta^k(x_i)\). Distingamos dos casos:
Si \(i\neq k\):
Apliquemos \(\mathcal L_h\) a \(G(\,\cdot\,, x_k)\): \[ \mathcal L_h G(\,\cdot\,, x_k)(x_i) = -\frac{G(x_i-h, x_k) - 2G(x_i, x_k) + G(x_i+h, x_k)}{h^2} \]
Supongamos, sin pérdida de generalidad, que \(i < k\). Entonces:
\[ \begin{align*} \mathcal L_h G(\,\cdot\,, x_k)(x_i) &= -\frac{(x_i-h)(1-x_k) - 2x_i(1-x_k) + (x_i+h)(1-x_k)}{h^2} = \\ &=-\frac{[(x_i-h) - 2x_i + (x_i+h)](1-x_k)}{h^2} = 0 \end{align*} \]
Si \(i = k\):
Apliquemos \(\mathcal L_h\) a \(G(\,\cdot\,, x_k)\): \[ \begin{align*} \mathcal L_h G(\,\cdot\,, x_k)(x_k) & = -\frac{G(x_k-h, x_k) - 2G(x_k, x_k) + G(x_k+h, x_k)}{h^2} = \\ & =-\frac{(x_k-h)(1-x_k)-2x_k(1-x_k)+x_k[1-(x_k+h)]}{h^2} \end{align*} \]
Como \(x_k=hk\:\), y \(\:x_N=Nh=1\), tenemos que: \[ \begin{align*} \mathcal L_h G(\,\cdot\,, x_k)(x_k) &= -\frac1{h^2}[(k-1)(N-k)h^2 - 2k(N-k)h^2 + k(N-k-1)h^2] \\ &= -[(N-k)(k-1-2k+k)-k] = (N-k)+k = N = \frac1h \end{align*} \]
Hemos visto que \(\mathcal L_h G(\,\cdot\,, x_k)(x_i) = \frac1h \delta^k(x_i)\), luego: \[ \delta^k = \mathcal L_h (hG(\,\cdot\,, x_k)) = \mathcal L_h G^k \] Como la matriz asociada al operador es definida positiva, entonces el operador es invertible, y en consecuencia inyectiva. Esto prueba nuestro lema.□
: Definimos el producto interno en el espacio \(V_h^0\) de dos vectores \(v_h, w_h \in V_h^0\) como: \[ (v_h, w_h)_h = h\sum_{i=1}^{N-1} v_i w_i \] donde \(v_i = v_h(x_i)\) y \(w_i = w_h(x_i)\).
: Definimos la norma infinito de un vector \(v_h\in V_h^0\) como: \[ ||v_h||_{h,\infty} = \max_{0\le i\le N}|v_h(x_i)| \]
A continuación se presenta un lema de propiedades del operador \(\mathcal L_h\):
: Se cumplen las siguiente propiedades:
Simetría: El operador \(\mathcal L_h\) es simétrico para todo \(v_h, w_h\in V_h^0\), i.e.: \[ (\mathcal L_h v_h, w_h)_h = (v_h, \mathcal L_h w_h)_h \]
Definido positivo: El operador \(\mathcal L_h\) es definidio positivo, i.e., para todo \(v_h\in V_h^0\), se tiene que: \[ \left\{ \begin{align*} &(\mathcal L_h v_h, v_h)_h \ge 0 \\ &(\mathcal L_h v_h, v_h)_h = 0 \Leftrightarrow v_h = 0 \end{align*} \right. \]
Estabilidad: Si \(\mathcal L_h u_h = f_h\), entonces: \[\boxed{||u_h||_{h,\infty} \le \frac18 ||f_h||_{h,\infty}}\]
Acotación: El operador \(\mathcal L_h\) está acotado, i.e., para todo \(v_h, w_h\in V_h^0\), se tiene que: \[ (\mathcal L_h v_h, w_h)_h \le \frac4{h^2} ||v_h||_h \: ||w_h||_h \]
Espectro: Los autovalores de \(\mathcal L_h\) están definidos, para cada \(k=1,\cdots,N-1\), como: \[ \lambda_k = \frac{4}{h^2} \sin^2\left(\frac{kh\pi}2\right) \] Y sus respectivos autovectores son \(\vec z_h^k\), cuya componente \(j\)-ésima es: \[ z_j^k = \sqrt{2h} \sin(jkh\pi) \]
El apartado (a) de este lema implica que la matriz relacionada con \(\mathcal L_h\) es simétrica, y el apartado (b) implica que la matriz es definida positiva, luegos sus autovalores son positivos, existiendo solución y siendo única. Luego, el apartado (c) es la condición de estabilidad de la solución, y para problemas elípticos no depende de la discretización. El apartado (d) nos da una cota para \(\mathcal L_h\) y el apartado (e) nos da el espectro del operador.
Veamos una propiedad interesante que usaremos en varias demostraciones.
: Bajo las condiciones habituales con las que estamos trabajando, \[ u_h(x_k) = \sum_{i=1}^{N-1} f_h(x_i) G^i(x_k) \]
Es fácil ver que \(\left\{ \delta^k \right\}_{k=1}^{N-1}\) es base de \(V_h^0\). Por tanto, podemos expresar en esta base la función \(f_h\): \[ f_h = \sum_{i=1}^{N-1} f_h(x_i) \delta^i \] Por definición tenemos que \(\mathcal L_h u_h = f_h\) y que \(\mathcal L_h G^k = \delta^k\), luego: \[ \mathcal L_h u_h = \sum_{i=1}^{N-1} f_h(x_i)\left(\mathcal L_h G^i \right) \]
Y por linealidad del operador \(\mathcal L_h\): \[ \mathcal L_h u_h = \mathcal L_h \sum_{i=1}^{N-1} f_h(x_i) G^i \]
Demostraremos más adelante, en el apartado (b) del Lema 4, que \(\mathcal L_h\) es definido positivo, por consiguiente es invertible, y por tanto inyectivo. No incurrimos en lógica circular. Esto cierra la demostración.□
a. Demostración simetría:
La demostración se basa en ajustar los límites de las sumas para reordenarlas como nos interesa. Usaremos el hecho de que \(v_h,w_h\in V_h^0\), luego \(v_0=w_0=v_N=w_N=0\), y el desarrollo es el que sigue: \[ \begin{align*} (\mathcal L_h v_h, w_h)_h &= h\sum_{i=1}^{N-1} \frac1{h^2} (-v_{i-1}+2v_i-v_{i+1})w_i = \\ &= -\frac1h \sum_{i=1}^{N-1}[(v_{i+1}-v_i)-(v_i-v_{i-1})]w_i = \\ &= -\frac1h \left[\sum_{i=1}^{N-1} (v_{i+1}-v_i)w_i - \sum_{i=0}^{N-2}(v_{i+1}-v_i)w_{i+1}\right] = \\ &= -\frac1h \left[\sum_{i=0}^{N-1} (v_{i+1}-v_i)w_i - \sum_{i=0}^{N-1}(v_{i+1}-v_i)w_{i+1} \right]= \\ &= \frac1h \left[\sum_{i=0}^{N-1} (v_{i+1}-v_i)(w_{i+1}-w_i)\right] = \\ &= \frac1h \left[\sum_{i=0}^{N-1} v_{i+1}(w_{i+1}-w_i) - \sum_{i=0}^{N-1}v_i(w_{i+1}-w_i)\right] = \\ &= \frac1h \left[\sum_{i=1}^N v_i(w_i-w_{i-1}) - \sum_{i=0}^{N-1}v_i (w_{i+1}-w_i)\right] = \\ &= -\frac1h \sum_{i=1}^{N-1} v_i[(w_{i+1}-w_i)-(w_i-w_{i-1})] = \\ &= h\sum_{i=1}^{N-1} v_i \frac1{h^2}(-w_{i+1}+2w_i-w_{i-1}) = (v_h, \mathcal L_h w_h)_h \end{align*} \] Que es lo que queríamos demostrar. □
b. Demostración definido positivo:
Del desarrollo de la demostración de (a), para todo \(v_h\in V_h^0\), se tiene que: \[ (\mathcal L_h v_h, v_h)_h = \frac1h \left[\sum_{i=1}^{N-1} (v_{i+1}-v_i)^2 + v_i^2 \right] \ge 0 \] Además, si \((\mathcal L_h v_h, v_h) = 0\), entonces \(v_{i+1}=v_i\), y como \(v_0=0\), por inducción \(v_i=0\) para \(i=1,\cdots,N-1\). El recíproco también es cierto, ya que \(v_i=0\) para \(i=1,\cdots,N-1\) implica que \((\mathcal L_h v_h, v_h) = 0\). □
c. Demostración estabilidad:
Como vimos en el Lema 5, podemos expresar la solución discreta de la siguiente manera: \[ u_h(x_k) = \sum_{i=1}^{N-1} f_h(x_i) G^i(x_k) \]
Sabiendo que \(G(x, y) \ge 0\), si tomamos valor absoluto y aplicamos desigualdad triangular: \[ |u(x_k)| \le \sum_{i=1}^{N-1} |f(x_i)| G^i(x_k) \le ||f||_{h,\infty}\: h \sum_{i=1}^{N-1} G(x_k, x_i) \overset{(*)}{=} ||f||_{h,\infty} \left(\frac12 x_k (1-x_k) \right) \]
El máximo de la expresión \(\frac12 x_k(1-x_k)\) se encuentra en \(x_k=\frac12\), luego \(\frac12 x_k(1-x_k)\le\frac18\), lo que conduce a nuestro resultado.
\((*)\) Consideremos el problema discreto \(\mathcal L_h w_h = 1\). Su solución en cada punto \(x_k\) es: \[ w_k = \sum_{i=1}^{N-1} G^k(x_i)\cdot1 = \sum_{i=1}^{N-1} h G(x_k, x_i) \] Por otro lado, el problema continuo equivalente es: \[ \begin{cases} -w''(x)=1 &x\in[0,1] \\ w(0)=w(1)=0 \end{cases} \] Cuya solución es sencillamente: \[ w(x) = \frac12 x(1-x) \] Se puede demostrar que el esquema de diferencias finitas centrales \(\Delta_h\) es exacto para polinomio de grado menor o igual a 3, de donde sale la expresión que hemos empleado.
d. Demostración acotación:
Partiendo de la definición de producto interno y del operador \(L_h\), y usando un resultado intermedio de la demostración de (a), tenemos: \[ (\mathcal L_h v_h, w_h)_h = h \sum_{i=1}^{N-1}\left(-\frac{v_{i-1}-2v_i+v_{i+1}}{h^2}\right)w_i = \frac1h \sum_{i=0}^{N-1} (v_{i+1}-v_i)(w_{i+1}-w_i) \]
Aplicamos la desigualdad de Cauchy-Schwarz: \[ (\mathcal L_h v_h, w_h)_h \le \sqrt{(\mathcal L_h v_h, v_h)_h} \sqrt{(\mathcal L_h w_h, w_h)} = \frac1h \left( \sum_{i=0}^{N-1} (v_{i+1}-v_i)^2 \sum_{i=0}^{N-1} (w_{i+1}-w_i)^2 \right)^\frac12 \]
Observemos que \((a-b)^2\le(a-b)^2+(a+b)^2 = 2a^2+2b^2\), luego: \[ \begin{align*} (\mathcal L_h v_h, w_h)_h &\le \frac2h \left( \sum_{i=0}^{N-1} \left(v_{i+1}^2+v_i^2\right) \sum_{i=0}^{N-1} \left(w_{i+1}^2+w_i^2\right) \right)^\frac12 = \frac4h \left( \sum_{i=1}^{N-1} v_i^2 \sum_{i=1}^{N-1} w_i^2 \right)^\frac12 =\\&= \frac4{h^2} \left( h\sum_{i=1}^{N-1} v_i^2 \right)^\frac12\left( h\sum_{i=1}^{N-1} w_i^2 \right)^\frac12 = \frac4{h^2} ||v_h||_h \: ||w_h||_h \end{align*} \] Que es el resultado que buscábamos demostrar □
e. Demostración espectro:
Vamos a comprobar que los autovalores y autovectores propuestos satisfacen la ecuación de autovales en todo nodo \(1\le j\le N-1\): \[ \mathcal L_h z_j^k = \lambda_k z_j^k \] Sabiendo que \(z_j^k = \sqrt{2h}\sin(jkh\pi)\), el primer término queda: \[ \begin{align*} \mathcal L_h z_j^k &= -\frac{\sqrt{2h}}{h^2} \left[\sin((j-1)kh\pi)-2\sin(jkh\pi)+\sin((j+1)kh\pi)\right]= \\ &= \frac{\sqrt{2h}}{h^2} \left[2\sin(jkh\pi)-\sin(jkh\pi-kh\pi)-\sin(jkh\pi+kh\pi)\right] \end{align*} \]
Una identidad trigonométrica fácilmente deducible es que \(\sin(a+b)+\sin(a-b) = 2\sin a \cos b\), luego:
\[ \mathcal L_h z_j^k =\frac{\sqrt{2h}}{h^2} \left[2\sin(jkh\pi)-2\sin(jkh\pi)\cos(kh\pi)\right] = \frac{2\sqrt{2h}}{h^2} \sin(jkh\pi)(1-cos(kh\pi)) \]
Y ahora usamos la identidad trigonométrica \(1-cos(a) = 2\sin^2\left(\frac a2\right)\): \[ \mathcal L_h z_j^k = \frac{4\sqrt{2h}}{h^2} \sin(jkh\pi) \sin^2\left(\frac{kh\pi}2\right) = \frac{4}{h^2} \sin^2\left(\frac{kh\pi}2\right) \sqrt{2h} \sin(jkh\pi) = \lambda_k z_j^k \] donde hemos identificado \(\lambda_k = \frac4{h^2}\sin^2\left(\frac{kh\pi}2\right)\), concluyendo la demostración. □
(positividad discreta): Sea \(f\in C([0,1])\). Si para todo \(x\in[0,1]\) se tiene que \(f(x)\ge0\) y existe \(u_h\in V_h^0\) tal que \(\mathcal L_h u_h = \left. f \right|_{\Omega_h}=f_h\), entonces \(u_i\ge0\) para \(i=0,1,\cdots,N\).
Demostración del teorema de positividad discreta:
Empezamos expresando \(\left.f \right|_{\Omega_h}=f_h\) en la base \(\left\{ \delta^k \right\}_{k=1}^{N-1}\) de \(V_h^0\): \[ f_h = \sum_{i=1}^{N-1} f_h(x_i)\delta^i \]
Luego: \[ \mathcal L_h u_h = \sum_{k=1}^{N-1} f_h(x_k) (\mathcal L_h G^k) \]
Por linealidad del operador \(\mathcal L_h\), y sabiendo que es inyectivo por ser definido positivo: \[ u_h = \sum_{k=1}^{N-1} f_k G^k \]
Como \(f_k\ge0\) y \(G^k=hG(\:\cdot\:, x_k)\ge0\) para cada \(k=1,\cdots,N-1\), se llega que \(u_k\ge0\), y como \(u_0=u_N=0\), queda demostrado el teorema. □
Ahora fijémonos en que si \(u_h, f_h\in V_h^0\) y definimos el operador \(\mathcal L_h\) tal que \(\mathcal L_h u_h = f_h\), entonces \(u_h = \mathcal L_h^{-1} f_h\), y aplicando el Lema 4c llegamos a: \[ ||\mathcal L_h^{-1} f_h||_{h,\infty} \le \frac18 ||f_h||_{h,\infty} \] Entonces, para puntos donde \(f_k \neq 0\), tenemos que \[ \frac{||\mathcal L_h^{-1} f_h||_{h,\infty}}{||f_h||_{h,\infty}} \le \frac18 \]
Este hecho nos inspira a definir el siguiente concepto:
(norma de un operador): la norma del operador \(\mathcal L_h : V_h^0 \to V_h^0\) se define como: \[ ||\mathcal L_h||_{h, \infty} = \sup_{\substack{f_h \in V_h^0 \\ f_h\neq0}}\frac{||\mathcal L_h f_h||_{h,\infty}}{||f_h||_{h,\infty}} \]
Según esta definición, para el caso \(\mathcal L_h = -\Delta_h\), tendríamos \[ ||\mathcal L_h^{-1}||_{h, \infty} \le \frac18 \]
En la práctica queremos resolver \(u_h = \mathcal L^{-1} f_h\). El hecho de que el operador \(L_h^{-1}\) no mande funciones al infinito, i.e., mantiene a la función de entrada finita y controlada, nos garantiza la estabilidad del método.
Introduzcamos para el operador \(\mathcal L_h\) y el producto interno que hemos estado usando, la siguiente forma bilineal: \[ a_h (v_h, w_h) = (\mathcal L_h v_h, w_h)_h \]
Con este concepto vamos a definir la coercitividad:
(coercitividad): Se dice que un operador discreto \(\mathcal L_h : V_h^0 \to V_h^0\) es coercitivo si existe una constante \(\alpha > 0\), independiente del paso de malla \(h\), tal que: \[ a_h(v_h, v_h) \ge \alpha ||v_h||_{h, \infty}^2 \]
La importancia de la coercitividad es que nos regala el siguiente resultado:
: Si un operador lineal \(\mathcal L_h : V_h^0 \to V_h^0\) es coercitivo con constante \(\alpha > 0\), entonces el sistema \(\mathcal L_h u_h = f_h\) tiene solución única para cualquier \(f_h\in V_h^0\), el esquema es estable y la norma de su inversa está acotada por: \[ ||\mathcal L_h^{-1}||_{h, \infty} \le \frac1\alpha \]
Demostración: Sea \(\mathcal L_h u_h = f_h\). Aplicando la definición de coercitividad y posteriormente la desigualdad de Cauchy-Schwarz al producto interno, obtenemos: \[ \alpha ||u_h||_{h, \infty}^2 \le a_h(u_h, u_h) = (\mathcal L_h u_h, u_h)_h \le ||\mathcal L_h u_h||_{h, \infty} \: ||\mathcal u_h||_{h, \infty} \] Si \(u_h \neq 0\), podemos dividir ambos lados por \(||u_h||_h\), llegando a: \[ \alpha ||u_h||_{h,\infty} \le ||\mathcal L_h u_h||_{h,\infty} \implies ||u_h||_h \le \frac1\alpha ||f_h||_h \] Esto demuestra que el operador es estable con constante \(C=\frac1\alpha\). Además, si \(f_h = 0\), la desigualdad obliga a que \(u_h\). Al tener un núcleo trivial en un espacio de dimensión finita el operador es biyectivo, garantizando la unicidad de la solución. □
: Sean \(f\in C([0, 1])\) y \(u\in C^2([0, 1])\) tales que \(\mathcal L u = f\) y \(u(0)=u(1)=0\). Entonces el error local de truncamiento (LTE), \(\tau_h\), se define como: \[ \tau_h = (\mathcal L_h - \mathcal L) u \] Es decir, \[ \tau_h(x_i) = \left(\mathcal L_h u(x_i) - f(x_i) \right) \] para cada \(i=1,\cdots,N-1\).
: Bajo las mismas premisas que en la definición anterior, el error de la discretización de define como: \[ e_h = u-u_h \]
Apreciemos que es posible relacionar de forma sencilla \(\tau_h\) con \(e_h\) de la siguiente forma: \[ \mathcal L_h e_h = L_h (u-u_h) = L_h u - L_h u_h = L_h u - f_h = \tau_h \] quedando que: \[ \boxed{ \mathcal L_h e_h = \tau_h} \]
: Sea una familia \(\left\{\mathcal L_h\right\}_{h>0}\) de operadores discretos \(\mathcal L_h : V_h^0 \to V_h^0\). Se define el orden de consistencia, \(p\in\mathbb N\), como: \[ ||\tau_h||_{h,\infty} = O(h^p) \:\:\text{ cuando }\:\: h\to0 \] Es decir, existen constantes \(C>0\) y \(h_0>0\) tales que, para todo \(h<h_0\): \[ ||\tau_h||_h{h,\infty} \le C h^p \]
(orden de consistencia): Para el operador \(\mathcal L_h = -\Delta_h\), sean \(u\in C^4([0,1])\) y \(f\in C^2([0,1])\) tales que \(L_h u_h = f_h\), se tiene que: \[ ||\tau_h||_{h,\infty} \le \frac{h^2}{12}||f''||_\infty \] es decir, que el orden de consistencia es \(p=2\).
Demostración del lema:
Aplicamos la norma infinito a la definición del error local de truncamiento: \[ ||\tau_h||_{h,\infty} = \max_{0\le i\le N}\left| \mathcal L_h u(x_i) - f(x_i)\right| = \max_{0\le i\le N} \left|u''(x_i)-\Delta_h(x_i)\right| \]
Usando el resultado que demostramos previamente en el Lema 2: \[ |||\tau_h||_{h,\infty} \le \frac{h^2}{12}||u^{(iv)}||_\infty \]
Y fijándonos en que \(-u'' = f\) implica que \(-u^{(iv)} = f''\), se sigue que \(||u^{(iv)}||_\infty = ||f''||_\infty\), de donde se demuestra el lema. □
(equivalencia de Lax): Un esquema numérico lineal converge si y solo si es consistente y estable.
(convergencia del error): Para el operador \(\mathcal L_h = -\Delta_h\), sean \(u\in C^4([0,1])\) y \(f\in C^2([0,1])\) tales que \(L_h u_h = f_h\), se tiene que: \[ ||e_h||_{h,\infty} = ||u-u_h||_{h,\infty} \le \frac{h^2}{96} ||f''||_\infty \] es decir, que el orden de convergencia es \(2\).
Aplicando el Lema 4c para \(L_h e_h = \tau_h\), tenemos que\[ ||e_h||_{h,\infty} \le \frac18 ||\tau_h||_{h,\infty} \]
Aplicando el anterior Lema 5 a esta expresión: \[ ||e_h||_{h,\infty} \le \frac18 \frac{h^2}{12}||f''||_{h,\infty} = \frac{h^2}{96}||f''||_{h,\infty} \] Como queríamos demostrar. □
Para ilustrar los resultados teóricos obtenidos, en particular la resolución del sistema tridiagonal y el orden de convergencia \(p=2\), podemos implementar el operador \(-\Delta_h\) numéricamente.
El siguiente código en Python (utilizando numpy)
construye la matriz del sistema \(\mathcal L_h
u_h = f_h\) y resuelve el problema elíptico en 1D para un caso
donde conocemos la solución analítica exacta: \(u(x) = \sin(2\pi x)\). Esta función
satisface las condiciones de Dirichlet homogéneas \(u(0)=u(1)=0\), y su término fuente asociado
es \(f(x) = -u''(x) = 4\pi^2\sin(2\pi
x)\).
Código para diferencias finitas para problemas elípticos unidimensionales con condiciones de contorno homogéneas (descargar):
import numpy as np
import matplotlib.pyplot as plt
def finite_difference_elliptic_homogeneous_1D(f, N):
h = 1/N
x = np.linspace(0, 1, N+1)
A = 2*np.diag(np.ones(N-1)) - np.diag(np.ones(N-2), 1) - np.diag(np.ones(N-2), -1)
b = f(x[1:-1])
u_num = np.zeros(N+1)
u_num[1:-1] = h**2 * np.linalg.solve(A, b)
return x, u_num
def finite_difference_elliptic_1D(f, a, b, N):
h = 1/N
def fh(x):
fx = f(x)
fx[0] += a/h**2
fx[-1] += b/h**2
return fx
x, u_num = finite_difference_elliptic_homogeneous_1D(fh, N)
u_num[0] = a
u_num[-1] = b
return x, u_num
if __name__ == "__main__":
u = lambda x: np.sin(2*np.pi*x)
f = lambda x: 4*np.pi**2*np.sin(2*np.pi*x)
Ns = 2**np.arange(2, 10)
hs = 1/Ns
errors = np.empty_like(Ns, dtype=float)
for i, N in enumerate(Ns):
x, u_num = finite_difference_elliptic_1D(f, 1, 1, N)
errors[i] = np.max(np.abs(u_num-u(x)))
fig, ax = plt.subplots()
ax.loglog(hs, errors, "or")
ax.plot(hs, errors, "-r")
ax.set_title("Error de discretización en función de la malla")
ax.set_xlabel("h")
ax.set_ylabel(r"$||e_h||_{h, \infty}$")
p, logC = np.polyfit(np.log(hs), np.log(errors), 1)
C = np.exp(logC)
ax.text(0.87, 0.10, f" Pendiente: {p:0.2f}", transform=ax.transAxes, verticalalignment='top')
ax.text(0.87, 0.05, r"$||e_h||_{h, \infty} \leq$" + f"{C:0.2f}" + r"$h^2$",
transform=ax.transAxes, verticalalignment='top')
plt.show()Al ejecutar este script obtenemos la solución numérica, pero más
valioso aún es que evaluamos empíricamente la cota del erro de
discretización \(||e_h||_{h, \infty} \le
Ch^2\). En una gráfica \(log-log\), la relación \(\text{Error} = Ch^p\) se transforma en la
recta \(\log(\text{Error}) = p\log h + \log
C\). El script hace un ajuste lineal con el método
polyfit de numpy. La gráfica que nos devuelve
el script es la siguiente:
Como vemos que la pendiente ajustada es \(2.02\), el código constata computacionalmente la convergencia cuadrática que demostramos de forma analítica en el Teorema 3.
Hemos visto en el Apartado 1.3 la forma matricial del problema elíptico con condiciones de contorno homogéneas, en el que hemos usado el hecho de que \(u_0 = u_N = 0\) para reducir la matriz, pero en el fondo el sistema es: \[ \frac1{h^2} \begin{pmatrix} 1 & 0 & 0 & 0 & \cdots & 0 & 0 & 0 & 0 \\ -1 & 2 & -1 & 0 & \cdots & 0 & 0 & 0 & 0 \\ 0 & -1 & 2 & -1 & \cdots & 0 & 0 & 0 & 0 \\ 0 & 0 & -1 & 2 & \cdots & 0 & 0 & 0 & 0 \\ \vdots & \vdots & \vdots & \vdots &\ddots & \vdots & \vdots &\vdots & \vdots \\ 0 & 0 & 0 & 0 & \cdots & 2 & -1 & 0 & 0 \\ 0 & 0 & 0 & 0 & \cdots & -1 & 2 & -1 & 0 \\ 0 & 0 & 0 & 0 & \cdots & 0 & -1 & 2 & -1 \\ 0 & 0 & 0 & 0 & \cdots & 0 & 0 & 0 & 1 \\ \end{pmatrix} \begin{pmatrix} u_ 0 \\ u_1 \\ u_2 \\ u_3 \\ \vdots \\ u_{N-3} \\ u_{N-2} \\ u_{N-1} \\ u_N \end{pmatrix} = \begin{pmatrix} 0 \\ f_1 \\ f_2 \\ f_3 \\ \vdots \\ f_{N-3} \\ f_{N-2} \\ f_{N-1} \\ 0 \end{pmatrix} \]
Sea ahora el problema de Dirichlet no homogéneo: Encontremos \(u:\mathbb R \to \mathbb R\) tal que: \[ \begin{cases} -u''(x) = f & x\in [0, 1] \\ u(0) = a \\ u(1) = b \end{cases} \]
Si discretizamos nos queda resolver el siguiente sistema: \[ \frac1{h^2} \begin{pmatrix} 1 & 0 & 0 & 0 & \cdots & 0 & 0 & 0 & 0 \\ -1 & 2 & -1 & 0 & \cdots & 0 & 0 & 0 & 0 &\\ 0 & -1 & 2 & -1 & \cdots & 0 & 0 & 0 & 0\\ 0 & 0 & -1 & 2 & \cdots & 0 & 0 & 0 & 0\\ \vdots & \vdots & \vdots &\vdots &\ddots & \vdots & \vdots & \vdots &\vdots \\ 0 & 0 & 0 & 0 & \cdots & 2 & -1 & 0 & 0 \\ 0 & 0 & 0 & 0 & \cdots & -1 & 2 & -1 & 0 \\ 0 & 0 & 0 & 0 & \cdots & 0 & -1 & 2 & -1 \\ 0 & 0 & 0 & 0 & \cdots & 0 & 0 & 0 & 1 \\ \end{pmatrix} \begin{pmatrix} u_ 0 \\ u_1 \\ u_2 \\ u_3 \\ \vdots \\ u_{N-3} \\ u_{N-2} \\ u_{N-1} \\ u_N \end{pmatrix} = \begin{pmatrix} \frac{a}{h^2} \\ f_1 \\ f_2 \\ f_3 \\ \vdots \\ f_{N-3} \\ f_{N-2} \\ f_{N-1} \\ \frac{b}{h^2} \end{pmatrix} \]
El problema elíptico con condiciones de contorno de Dirichlet no homogéneas se reduce dado que conocemos \(u_0 = a\) y \(u_N = b\), quedando un sistema con una matriz tridiagonal simétrica: \[ \frac1{h^2} \begin{pmatrix} 2 & -1 & 0 & 0 & \cdots & 0 & 0 & 0 & 0 \\ -1 & 2 & -1 & 0 & \cdots & 0 & 0 & 0 & 0 \\ 0 & -1 & 2 & -1 & \cdots & 0 & 0 & 0 & 0 \\ \vdots & \vdots & \vdots &\vdots &\ddots & \vdots & \vdots & \vdots &\vdots \\ 0 & 0 & 0 & 0 & \cdots & -1 & 2 & -1 & 0 \\ 0 & 0 & 0 & 0 & \cdots & 0 & -1 & 2 & -1 \\ 0 & 0 & 0 & 0 & \cdots & 0 & 0 & -1 & 2 \end{pmatrix} \begin{pmatrix} u_1 \\ u_2 \\ u_3 \\ \vdots \\ u_{N-3} \\ u_{N-2} \\ u_{N-1} \end{pmatrix} = \begin{pmatrix} f_1+\frac{a}{h^2} \\ f_2 \\ f_3 \\ \vdots \\ f_{N-3} \\ f_{N-2} \\ f_{N-1}+\frac{b}{h^2} \end{pmatrix} \]
Una implementación en python que reutiliza la
implimentación anterior (Apartado
1.6) es la siguiente:
Código de diferencias finitas para problemas elípticos unidimensionales con condiciones de contorno tipo Dirichlet (descargar):
import diferencias_finitas_eliptica_homogenea_1D as df_h
import numpy as np
import matplotlib.pyplot as plt
def finite_difference_elliptic_1D(f, a, b, N):
h = 1/N
def fh(x):
fx = f(x)
fx[0] += a/h**2
fx[-1] += b/h**2
return fx
x, u_num = df_h.finite_difference_elliptic_homogeneous_1D(fh, N)
u_num[0] = a
u_num[-1] = b
return x, u_num
if __name__ == "__main__":
f = lambda x: 4*np.pi**2*np.sin(2*np.pi*x)
N = 100
x_nh, u_nh = finite_difference_elliptic_1D(f, -1, 1, N)
x_h, u_h = df_h.finite_difference_elliptic_homogeneous_1D(f, N)
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot(x_h, u_h)
ax1.set_title("Solución al problema homogéneo")
ax1.set_xlabel("x")
ax1.set_ylabel("u")
ax2.plot(x_nh, u_nh)
ax2.set_title("Solución al problema no homogéneo")
ax2.set_xlabel("x")
ax2.set_ylabel("u")
plt.show()
Enunciado: Encontrar \(u:\mathbb R \to \mathbb R\) tal que: \[ \begin{cases} -u''(x) = f & x\in[0, 1] \\ u'(0) = a &u(1) = b \end{cases} \]
Para abordar este caso no hacemos diferencias finitas hacia adelante para la condición de Neumann, ya que esto haría de nuestro esquema de orden \(O(h^2)\) un esquema de orden \(O(h)\). Para solucionar esto usaremos diferencias finitas centradas con un ‘nodo fantasma’: \[ \frac{u_1-u_{-1}}{2h} = a \implies u_{-1} = u_1 -2ah \]
Ahora podemos evaluar el operador discreto en el punto \(x_0\), que es un esquema de diferencias finitas centradas \(O(h^2)\), y sustituir por el resultado anterior: \[ \frac1{h^2}(-u_{-1}+2u_0-u_1) = f_0 \implies \frac1{h^2}(u_0-u_1) = \frac12f_0 - \frac ah \]
El problema elíptico con condiciones de contorno mixtas nos deja, sabiendo que \(u_N = 0\), el siguiente sistema: \[ \frac1{h^2} \begin{pmatrix} 1 & -1 & 0 & 0 & \cdots & 0 & 0 & 0\\ -1 & 2 & -1 & 0 & \cdots & 0 & 0 & 0\\ 0 & -1 & 2 & -1 & \cdots & 0 & 0 & 0\\ 0 & 0 & -1 & 2 & \cdots & 0 & 0 & 0\\ \vdots & \vdots & \vdots &\vdots &\ddots & \vdots & \vdots &\vdots \\ 0 & 0 & 0 & 0 & \cdots & 2 & -1 & 0 \\ 0 & 0 & 0 & 0 & \cdots & -1 & 2 & -1 \\ 0 & 0 & 0 & 0 & \cdots & 0 & -1 & 2 \end{pmatrix} \begin{pmatrix} u_ 0 \\ u_1 \\ u_2 \\ u_3 \\ \vdots \\ u_{N-3} \\ u_{N-2} \\ u_{N-1} \end{pmatrix} = \begin{pmatrix} \frac12f_0 - \frac ah \\ f_1 \\ f_2 \\ f_3 \\ \vdots \\ f_{N-3} \\ f_{N-2} \\ f_{N-1} +\frac{b}{h^2} \end{pmatrix} \]
Código para diferencias finitas para problemas elípticos unidimensionales con condiciones de contorno mixtas (descargar):
import diferencias_finitas_eliptica_homogenea_1D as df_h
import numpy as np
import matplotlib.pyplot as plt
def finite_difference_elliptic_neumann_1D(f, a, b, N):
h = 1/N
x = np.linspace(0, 1, N+1)
A = 2*np.diag(np.ones(N)) - np.diag(np.ones(N-1), 1) - np.diag(np.ones(N-1), -1)
B = f(x[0:-1])
# Condición Neumann
A[0, 0] = 1
B[0] = B[0]/2 - a/h
# Condición Dirichlet
B[-1] += b/(h**2)
u_num = np.zeros(N+1)
u_num[0:-1] = h**2 * np.linalg.solve(A, B)
u_num[-1] = b
return x, u_num
if __name__ == "__main__":
f = lambda x: 4*np.pi**2*np.sin(2*np.pi*x)
x, u = finite_difference_elliptic_neumann_1D(f, 0, 1, 100)
fig, ax = plt.subplots()
ax.plot(x, u)
ax.set_title("Solución al problema de contorno Neumann")
ax.set_xlabel("x")
ax.set_ylabel("u")
plt.show()
Es muy importante resaltar que siempre debe haber una condición de Dirichlet. Supongamos el problema elíptico unidimensional \(-u''(x)=f\) con las condiciones de Neumann \(u'(0) = a\) y \(u'(1) = b\), entonces la función \(v(x)=u(x)+C\) también es solución de la misma EDP. Es decir, perdemos la unicidad de la solución, y obtenemos una familia de soluciones paralelas. De hecho, si integramos la EDP: \[ -\int_0^1 u''(x)dx = \int_0^1 f(x)dx \implies -(u'(1)-u'(0)) = \int_0^1 f(x)dx \implies \boxed{a-b = \int_0^1 f(x)dx} \] Si las condiciones de contorno no cumplen la condición anterior con la función fuente, perdemos la existencia de la solución.
Enunciado: Encontrar \(u: \mathbb R^2 \to \mathbb R\) tal que: \[ \begin{cases} -\nabla^2 u(x, y) = 1 &(x, y) \in [0, 1]\times [0, 1] \\ u(0, y) = u(1, y) = 0 \\ u(x, 0) = u(x, 1) = 0 \end{cases} \]
Discretizamos el espacio de forma que \(x_i = ih\) e \(y_j = jh\), de modo que: \[ u_{i,j} = u(x_i, y_i) = u(ih, jh) \]
Usaremos el resultado unidimensional para definir el operador bidimensional: \[ \begin{align} \nabla^2 u = \frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} &\approx \frac{u_{i-1, j} - 2u_{i,j} + u_{i+1, j}}{h^2} + \frac{u_{i, j-1} - 2u_{i,j} + u_{i, j+1}}{h^2} \\ &= \frac{u_{i-1, j} + u_{i+1, j} + u_{i, j-1} + u_{i, j+1} - 4u_{i,j}}{h^2} \end{align} \]
: Definimos el operador discreto asociado a la EDP con diferencias finitas centradas de cinco nodos: \[ \mathcal L_h \equiv [-\nabla^2 u]_h = -\frac{u_{i-1, j} + u_{i+1, j} + u_{i, j-1} + u_{i, j+1} - 4u_{i,j}}{h^2} \]
Para poder representar el sistema de ecuaciones asociado a la discretización, primero debemos idear una forma de ‘aplanar’ la matriz, i.e, definir una \(k\) tal que \(u_{i, j} = u_k\).
(diagrama)
Por observación podemos identificar que \(k=(j-1)(N-1)+i\), pero necesitamos la relación inversa. Esta la obtenemos observando que: \[ \begin{align} j = 1 \implies &k \in \{1,\:2,\:\cdots,\:N-1\} \\ j = 2 \implies &k \in \left\{(N-1)+1,\:(N-1)+2,\:\cdots,\:2(N-1)\right\}\\ j = 3 \implies &k \in \{2(N-1)+1,\:2(N-1)+2,\:\cdots,\:3(N-1)\} \end{align} \]
Donde podemos identificar que: \[ \frac{k}{N-1} \in \left(\: j-1,\:j\:\right] \implies \boxed{ j = \left\lceil \frac{k}{N-1} \right\rceil } \]
Y a partir de \(j\) podemos despejar \(i\): \[ k=(j-1)(N-1)+i \implies \boxed{i = k - (j-1)(N-1)} \]
Fijémonos en que hemos ‘aplanado’ la solución discreta, pasando de una matriz \((N-1)\times (N-1)\) a un vector columna de \((N-1)^2\) elementos. Por tanto, la matriz asociada al sistema lineal será una matriz \((N-1)^2\times(N-1)^2\). Para construir el sistema lineal que resuelva la discretización, tomaremos una filosofía de bloques. Fijémonos de qué forma se relacionan los elementos de una fila con los otros elementos de la misma fila: \[ A = \begin{pmatrix} 4 & -1 & 0 & \cdots & 0 & 0 & 0 \\ -1 & 4 & -1 & \cdots & 0 & 0 & 0 \\ 0 & -1 & 4 & \cdots & 0 & 0 & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots & \vdots \\ 0 & 0 & 0 & \cdots & 4 & -1 & 0 \\ 0 & 0 & 0 & \cdots & -1 & 4 & -1 \\ 0 & 0 & 0 & \cdots & 0 & -1 & 4 \end{pmatrix}_{(N-1)\times(N-1)} \]
Y ahora de qué forma se relacionan los elementos de una fila con los elementos de la fila contigua (siguiente u anterior): \[ B = \begin{pmatrix} -1 & 0 & 0 & \cdots & 0 & 0 & 0 \\ 0 & -1 & 0 & \cdots & 0 & 0 & 0 \\ 0 & 0 & -1 & \cdots & 0 & 0 & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots & \vdots \\ 0 & 0 & 0 & \cdots & -1 & 0 & 0 \\ 0 & 0 & 0 & \cdots & 0 & -1 & 0 \\ 0 & 0 & 0 & \cdots & 0 & 0 & -1 \end{pmatrix}_{(N-1)\times(N-1)} \] Finalmente la matriz del sistema será la matriz compuesta por estos bloques: \[ M = \begin{pmatrix} A & B & 0 & \cdots & 0 & 0 & 0 \\ B & A & B & \cdots & 0 & 0 & 0 \\ 0 & B & A & \cdots & 0 & 0 & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots & \vdots & \vdots \\ 0 & 0 & 0 & \cdots & A & B & 0 \\ 0 & 0 & 0 & \cdots & B & A & B \\ 0 & 0 & 0 & \cdots & 0 & B & A \end{pmatrix}_{(N-1)^2\times(N-1)^2} \]
Para visualizar por qué esto es así, debemos tener en cuenta que un elemento en la columna \(i\) de la fila \(j\) tendrá relación, fuera de su propia fila, con los elementos \((i, j-1)\) y \((i, j+1)\), que en la forma ‘aplanada’ se encuentran a una distancia \(N-1\) de nuestro elemento de referencia. Esto hace los elementos de la diagonal del bloque anterior y siguiente sean \(-1\), formando el patrón que hemos visto.
Por ejemplo, para el caso en el que \(N=4\): \[ M= \begin{pmatrix} 4 & -1 & 0 & -1 & 0 & 0 & 0 & 0 & 0 \\ -1 & 4 & -1 & 0 & -1 & 0 & 0 & 0 & 0 \\ 0 & -1 & 4 & 0 & 0 & -1 & 0 & 0 & 0 \\ -1 & 0 & 0 & 4 & -1 & 0 & -1 & 0 & 0 \\ 0 & -1 & 0 & -1 & 4 & -1 & 0 & -1 & 0 \\ 0 & 0 & -1 & 0 & -1 & 4 & 0 & 0 & -1 \\ 0 & 0 & 0 & -1 & 0 & 0 & 4 & -1 & 0 \\ 0 & 0 & 0 & 0 & -1 & 0 & -1 & 4 & -1 \\ 0 & 0 & 0 & 0 & 0 & -1 & 0 & -1 & 4 \\ \end{pmatrix} \]
Código para diferencias finitas para problemas elípticos bidimensionales con condiciones de contorno homogéneas (descargar):
import numpy as np
import matplotlib.pyplot as plt
import scipy.sparse as sp
from matplotlib import cm
def finite_difference_elliptic_homogeneous_2D(f, N):
h = 1 / N
# Definimos las submatrices
A = sp.diags([-1, 4, -1], [-1, 0, 1], shape=(N - 1, N - 1), dtype=np.float64)
B = -sp.eye(N - 1)
# Definimos la distribución de las submatrices
F_A = sp.eye(N - 1)
F_B = sp.diags([1, 1], [-1, 1], shape=(N - 1, N - 1), dtype=np.float64)
# Usamos la delta de Kronecker para montar la matriz
M = sp.kron(F_A, A) + sp.kron(F_B, B)
# Comprimimos a formato CSR (para cálculos)
M = M.tocsr()
# Calculamos los términos independientes
points = np.linspace(0, 1, N + 1)
inner_points = points[1:-1]
X, Y = np.meshgrid(inner_points, inner_points, indexing='ij')
b = h ** 2 * f(X, Y).ravel()
# Resolvemos y montamos la matriz solución
u_vec = sp.linalg.spsolve(M, b)
U_inner = u_vec.reshape((N - 1, N - 1))
U = np.zeros([N + 1, N + 1])
U[1:-1, 1:-1] = U_inner
X, Y = np.meshgrid(points, points)
return X, Y, U
if __name__ == "__main__":
f = lambda x, y: 8 * np.pi ** 2 * np.sin(2 * np.pi * x) * np.sin(2 * np.pi * y)
X, Y, U = finite_difference_elliptic_homogeneous_2D(f, 100)
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, U, cmap=cm.viridis,
linewidth=0, antialiased=True)
ax.set_title(r'Solución de la Ecuación de Poisson $\nabla^2 u = f$')
ax.set_xlabel('Eje X')
ax.set_ylabel('Eje Y')
ax.set_zlabel(r'$u(x,y)$')
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()
El ejemplo por excelencia de un problema parabólico es la ecuación del calor con condiciones de contorno de Dirichlet homogéneas y una condición inicial:
Enunciado: encuentra \(u : \mathbb [0, T] \times R^n \to \mathbb R\) que satisfaga: \[ \left\{ \begin{align*} &\frac{\partial u}{\partial t} - \alpha \nabla^2 u = f(t, \vec x) && \forall t \in (0, T], \forall \vec x \in\Omega \subseteq \mathbb{R}^n\\ &u(\vec x, t) = 0 && \forall t\in (0, T], \forall \vec x \in \Gamma = \partial \Omega \\ &u(\vec x, 0) = u_0(\vec x) && \forall \vec x \in \Omega \end{align*} \right. \]
donde \(\alpha > 0\) es la difusividad térmica.
Resolvamos el caso particular cuando \(\Omega = [0, 1]\) y no haya término fuente: \[ \left\{ \begin{align*} &\frac{\partial u}{\partial t}-\frac{\partial^2 u}{\partial x^2} = 0 && \forall t \in (0, T], \forall x \in [0, 1]\\ &u(0, t) = u(1, t) = 0 && \forall t\in (0, T] \\ &u(x, 0) = u_0(x) && \forall x \in [0,1] \end{align*} \right. \]
Usaremos el método de separación de variables, que consiste en suponer que la solución es de la siguiente forma: \[u (x, t) = X(x) T(t)\]
Por tanto, sustituyendo en nuestra ecuación: \[ X(x)\frac{dT}{dt} - T(t)\frac{d^2 X}{dx^2} = 0 \]
Reordenamos para que cada término dependa de una única variable: \[ \frac1T\frac{dT}{dt} = \frac1X\frac{d^2 X}{dx^2} = -\lambda \] que hemos igualado a una constante debido a que cada término depende de una única variable, y la igualdad se cumple para todo el dominio, lo que solo puede pasar si cada término es constante. Resolviendo estas dos EDOs para las condiciones de contorno dadas, nos quedan las siguientes infinitas soluciones para cada \(k\in\mathbb Z\): \[ \left\{ \begin{align*} &X_k (x) = \sin(k\pi x) \\ &T_k (t) = e^{-\left(k\pi\right)^2 t} \end{align*} \right. \]
Quedándonos las siguientes infinitas soluciones: \[ u_k(x, t) = \sin\left(k\pi x\right) e^{-\left(k\pi\right)^2 t} \]
Como la superposición de soluciones de una EDP lineal homogénea es también solución de la EDP, tenemos que: \[ u(x, t) =\sum_{k=1}^\infty B_n \sin\left(k\pi x\right) e^{-\left(k\pi\right)^2 t} \]
donde \(B_n\) son coeficientes de Fourier que dependen de la condición inicial: \[ B_n = 2\int_0^1 u_0(x) \sin\left(k\pi x\right)dx \]
Vamos a discretizar el dominio \([0, T]\times[0, 1]\) en \(N\) intervalos espaciales y \(M\) intervalos temporales, de forma que: \[ \left\{ \begin{align*} &x_i = x_0 + ih &i=0,1,\cdots, N\\ &t^k = t_0 + k \Delta t &k=0,1,\cdots, M \end{align*} \right. \]
Lo haremos en dos pasos.
Si ahora despejamos el único término en \(k+1\), tenemos: \[ u_i^{k+1} = \lambda u_{i+1}^k + (1-2\lambda) u_i^k + \lambda u_{i-1}^k \] donde hemos definido \(\lambda = \frac{\Delta t}{h^2}\).
(operador discreto): Definimos el operador discreto \(E_\lambda\) de forma que: \[ (E_\lambda u^k)(x_i) = \lambda u_{i+1}^k + (1-2\lambda) u_i^k + \lambda u_{i-1}^k \]
de forma que \(\boxed{u^{k+1} = E_\lambda u^k}\).