View in NBViewer Open in binder Download notebook View source


12.1. Equações a derivadas parciais e diferenças finitas

Objetivos:

using Plots

Equações a derivadas parciais

Notacão

\[ \frac{\partial u}{\partial x}, \quad \partial_x u, \quad D_x u, \quad u_x. \] \[ \frac{\partial^2 u}{\partial x^2}, \quad \partial_x^2 u, \quad D_x^2 u, \quad u_{xx}, \quad \frac{\partial^n u}{\partial x^n}, \quad \partial_x^n u, \quad D_x^n u, \quad u_{x\cdots x}. \]

Exemplos lineares clássicos

\[u_t + c u_x = 0;\] \[u_t + \vec{c} \cdot \nabla u;\] \[u_t = \nu u_{xx};\] \[u_t = \nu \Delta u;\] \[u_{tt} = c^2 u_{xx};\] \[u_{tt} = c^2 \Delta u;\] \[ u_{tt} = - \lambda \Delta^2 u. \]

Exemplos não-lineares clássicos

\[u_t + uu_x = 0;\] \[u_t + uu_x + u_{xxx} = 0;\] \[u_t = \nu u_{xx} + f(u);\] \[ u_t + (u\cdot \nabla)u + \nabla p = \nu\Delta u + f, \quad \nabla \cdot u = 0. \] \[ \nabla \cdot \left( \frac{\nabla u}{\sqrt{1+\|\nabla u \|^2}} \right) = 0. \]

Problema de valor inicial

Condições de contorno

Aproximando derivadas via diferenças finitas

Diferença finita de primeira ordem para a frente

\[ (Du)(x) = \lim_{h\rightarrow 0} \frac{u(x+h)-u(x)}{h}. \] \[ (\delta_h^+ u)(x) = \frac{u(x+h)-u(x)}{h}. \]

Taxa de convergência

\[ u(x) = x^{1+\theta}, \qquad x\geq 0. \] \[ u'(x) = (1+\theta)x^\theta, \qquad x\geq 0. \] \[ (\delta_h^+u)(0) = \frac{h^{1+\theta} - 0}{h} = h^\theta. \] \[ |(\delta_h^+u)(0) - u'(0)| \lesssim h^\theta, \]

Ordem da aproximação

\[ \begin{align*} (\delta_h^+ u)(x) - (Du)(x) & = \frac{u(x+h)-u(x)}{h} - (Du)(x) \\ & = \frac{1}{h} \int_x^{x+h} (Du)(\xi)\;d\xi - (Du)(x) \\ & = \frac{1}{h} \int_x^{x+h} \left((Du)(\xi) - (Du)(x)\right)\;d\xi. \end{align*} \] \[ |(\delta_h^+ u)(x) - (Du)(x)| \leq \max_{x\leq \xi \leq x+h} |(Du)(\xi) - (Du)(x)| \leq \max_{x\leq \xi \leq x+h} \frac{1}{h}\int_0^h L\xi \;d\xi \leq \frac{Lh}{2}. \] \[ (\delta_h^+ u)(x) = (Du)(x) + \mathcal{O}(h), \qquad h\rightarrow 0. \] \[ f(h) = \mathcal{O}(|h|^\alpha), \;h\rightarrow h_0 \Leftrightarrow \exists C>0, \exists \delta > 0, \; |f(h)-f(h_0)| \leq C |h|^\alpha, \;\forall 0<|h|<\delta, \] \[ f(h) = \mathcal{o}(|h|^\alpha), \;h\rightarrow h_0 \Leftrightarrow \frac{|f(h)-f(h_0)|}{|h|^\alpha} \rightarrow 0, \; h\rightarrow h_0. \]

Expansão de Taylor

\[ u(x+h) = u(x) + u'(x)h + u''(x)\frac{h^2}{2} + \cdots. \] \[ (\delta_h^+ u)(x) = \frac{u(x+h)-u(x)}{h} = u'(x) + u''(x)\frac{h^2}{2} + \cdots. \] \[ \left|(\delta_h^+ u)(x) - u'(x)\right| = Ch + \cdots = \mathcal{O}(h). \]

Diferença centrada

\[ (\delta_h^0u)(x) = \frac{u(x+h) - u(x-h)}{2h} = \frac{1}{2h}\left( u(x+h) - u(x) + u(x) - u(x-h) \right) = \frac{1}{2h}\left(u'(x)h + u''(x)\frac{h^2}{2} - u'(x)(-h) - u''(x)(-h)^2 + \mathcal{O}(h^3) \right) = u'(x) + \mathcal{O}(h^2). \] \[ \delta_h^0 = \frac{\delta_h^+ + \delta_h^-}{2}. \]

Aproximação da segunda derivada

\[ (\delta_h^2u)(x) = \frac{u(x+h) - 2u(x) + u(x-h)}{h^2} = u''(x) + \mathcal{O}(h^2). \] \[ \delta_h^2u = \frac{\delta_h^+ - \delta_h^-}{h}. \]

Discretização espacial

Discretização unidimensional uniforme

N = 20
L = 4
x = range(0.0, L, length=N)
scatter(x, zero(x), markersize=4, legend=false)
plot!(title="Malha uniforme", titlefont=10, size=(600,100), ylims=(-0.1, 0.2))

Discretização unidimensional não-uniforme

\[ x_i = \frac{L}{2}\left( 1 + \cos(\pi s_i)\right), \qquad i=1,\ldots, N. \] \[ x_i = \frac{L}{2}\left( 1 + \cos\left({\frac {2i-1}{2N}}\pi \right)\right), \qquad i=1,\ldots, N. \]
N = 20
L = 4
s = range(0.0, 1.0, length=N)
x = L/2 * (1 .+ cos.(π * s))
#x = L/2 * ( 1 .+ [cos((2i - 1)/(2N) * π) for i in 1:N])
scatter(x, zero(x), markersize=4, legend=false)
scatter!(x,x->√((L/2)^2-(x-L/2)^2), markersize=3, legend=false)
plot!(title="Distribuição dos pontos de Chebyshev", titlefont=10, size=(600,300))
Error: InterruptException:

Discretização espacial bidimensional uniforme

\[ 0 = x_1 < \ldots < x_{N_x} = L_x, \quad (N_x-1)h_x = L_x, \qquad 0 = y_1 < \ldots < y_{N_y} = L_y, \quad (N_y-1)h_y = L_y \]
L_x = 4.0
L_y = 2.0
N_x = 20
N_y = 10
x = range(0.0, L_x, length=N_x)
y = range(0.0, L_y, length=N_y)
scatter(x, repeat(y',length(x)), legend=false, color=1, size=(600,300))
Error: InterruptException:

Discretização bidimensional não-uniforme

L_x = 4.0
L_y = 2.0
N_x = 20
N_y = 10
x = range(0.0, L_x, length=N_x)
s = range(0.0, 1.0, length=N_y)
y = L/2 * (1 .+ cos.(π * s))
scatter(x, repeat(y',length(x)), legend=false, color=1, size=(600,300),
    xlabel="x", ylabel="y", title="Malha não-uniforme em y", titlefont=10)
L_x = 4.0
L_y = 2.0
N_x = 20
N_y = 10
r = range(0.0, 1.0, length=N_x)
s = range(0.0, 1.0, length=N_y)
x = L/2 * (1 .+ cos.(π * r))
y = L/2 * (1 .+ cos.(π * s))
scatter(x, repeat(y',length(x)), legend=false, color=1, size=(600,300),
    xlabel="x", ylabel="y", title="Malha não-uniforme em ambas as direções", titlefont=10)

Resolvendo EDPs em Julia