{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> Texto fornecido sob a Creative Commons Attribution license, CC-BY. Todo o código está disponível sob a FSF-approved BSD-3 license.
\n",
"> (c) Original por Lorena A. Barba, Gilbert F. Forsyth em 2017, traduzido por Felipe N. Schuch em 2020.
\n",
"> [@LorenaABarba](https://twitter.com/LorenaABarba) - [@fschuch](https://twitter.com/fschuch)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"12 passos para Navier-Stokes\n",
"======\n",
"***"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Continuamos nossa jornada para resolver a equação de Navier-Stokes, esse é o Passo 4. Não continue a menos que você tenha completado as tarefas anteriores. Na verdade, esse passo será uma combinação dos dois anteriores \\[[2](./02_Passo_2.ipynb),[3](./04_Passo_3.ipynb)\\]. O maravilhoso *reaproveitamento de código*!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Passo 4: Equação de Burgers\n",
"----\n",
"***"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Você pode ler mais sobre a equação de Burgers na sua [página wikipedia](http://en.wikipedia.org/wiki/Burgers'_equation).\n",
"\n",
"A equação de Burgers em uma dimensão se parece com:\n",
"\n",
"$$\\frac{\\partial u(x,t)}{\\partial t} + u(x,t) \\frac{\\partial u(x,t)}{\\partial x} = \\nu \\frac{\\partial ^2u(x,t)}{\\partial x^2}$$\n",
"\n",
"Como você pode perceber, ela é uma combinação entre convecção não linear e difusão. É surpreendente o quanto você aprende com essa pequena e elegante equação!\n",
"\n",
"Discretizamos a equação usando os mesmos métodos que já foram detalhados nos Passos [1](./01_Passo_1.ipynb) a [3](./04_Passo_3.ipynb). Usando diferença para frente para a derivada temporal, diferença para trás para a derivada espacial de primeira ordem e um esquema de diferença centrada para a derivada segunda. A equação é então escrita como:\n",
"\n",
"$$\\frac{u_i^{n+1}-u_i^n}{\\Delta t} + u_i^n \\frac{u_i^n - u_{i-1}^n}{\\Delta x} = \\nu \\frac{u_{i+1}^n - 2u_i^n + u_{i-1}^n}{\\Delta x^2}$$\n",
"\n",
"Como antes, uma vez conhecida a condição inicial, a única incógnita é $u_i^{n+1}$. Vamos prosseguir no tempo com:\n",
"\n",
"$$u_i^{n+1} = u_i^n - u_i^n \\frac{\\Delta t}{\\Delta x} (u_i^n - u_{i-1}^n) + \\nu \\frac{\\Delta t}{\\Delta x^2}(u_{i+1}^n - 2u_i^n + u_{i-1}^n)$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Condição Inicial e de Contorno\n",
"\n",
"Para examinar algumas propriedades interessantes da equação de Burgers, é adequado o uso de condições inicial e de contorno diferentes do que usamos nas tarefas anteriores.\n",
"\n",
"A nossa condição inicial para esse problema agora será:\n",
"\n",
"\\begin{eqnarray}\n",
"u &=& -\\frac{2 \\nu}{\\phi} \\frac{\\partial \\phi}{\\partial x} + 4 \\\\\\\n",
"\\phi &=& \\exp \\bigg(\\frac{-x^2}{4 \\nu} \\bigg) + \\exp \\bigg(\\frac{-(x-2 \\pi)^2}{4 \\nu} \\bigg)\n",
"\\end{eqnarray}\n",
"\n",
"Que tem solução analítica, dada por:\n",
"\n",
"\\begin{eqnarray}\n",
"u &=& -\\frac{2 \\nu}{\\phi} \\frac{\\partial \\phi}{\\partial x} + 4 \\\\\\\n",
"\\phi &=& \\exp \\bigg(\\frac{-(x-4t)^2}{4 \\nu (t+1)} \\bigg) + \\exp \\bigg(\\frac{-(x-4t -2 \\pi)^2}{4 \\nu(t+1)} \\bigg)\n",
"\\end{eqnarray}\n",
"\n",
"Nossa condição de contorno será:\n",
"\n",
"$$u(0) = u(2\\pi)$$\n",
"\n",
"Ela é denominada condição de contorno *periódica*. Preste atenção! Isso pode lhe causar certa dor de cabeça se você não tratá-la cuidadosamente."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Poupando tempo com SymPy\n",
"\n",
"A condição inicial que usaremos para a Equação de Burgers pode ser meio trabalhosa para ser calculada à mão. A derivada $\\frac{\\partial \\phi}{\\partial x}$ não é lá muito complicada, mas seria fácil perder um sinal ou esquecer um fator de $x$ em algum lugar, então vamos usar Sympy para nos ajudar.\n",
"\n",
"[SymPy](http://sympy.org/en/) é uma biblioteca Python para metemática simbólica. Ela tem várias das funcionalidades de cálculo simbólico como Mathematica, com o benefício adicional de que podemos facilmente converter os resultados de volta para nosso cálculo em Python (SymPy também é grátis e de código aberto).\n",
"\n",
"Começamos carregando a biblioteca SymPy, em conjunto com nossa biblioteca preferida, Numpy."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy\n",
"import sympy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Vamos também informar ao SymPy que nós queremos que todas impressões sejam renderizadas usando $\\LaTeX$. Isso vai deixar nosso Notebook incrível!"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from sympy import init_printing\n",
"init_printing(use_latex=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Começamos por definir nossas variáveis simbólicas para as três variáveis presentes na nossa condição inicial e então digitar a equação completa para $\\phi$. Vamos obter uma versão satisfatoriamente renderizada para nossa equação para $\\phi$."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAOgAAAAfBAMAAAAfEJzqAAAAMFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEIl2mSJE3e9UMqtmzbsXyEShAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC7ElEQVRIDaWWzWsTQRjGn02arZuPJpW9SAksRBAFNbUVPHhYMEUEDwv15kUoKPSUQg8BD1pvgoeAXnoL8Sxs/oNIDxLwkJwlkP4DUqH3+k7mY5PNTD62A9l95519fs/MvrNDgESt/SBIpAOSKzHK1hOaJleib10kNE2uBJykK9UoD+X8z3ngyT67y3JsU1yeX1MDJ13SKDNVYZI/Qiak2Bf98U2WYw2wOpMDM7GR42uUOSk/HCDPJuDLBLvLcjhNuJve5Eg8NnJONUpXqK3mAHdeUscHMo+esjWz5tTtRuM9EOLDVZ2n9FcjJ6dRHghGGgOsA7drx7WmY488kS4HTipN8Uj0jTcjZ0Mj6QFurVZrtnc+tcps3KdfugqLki/G5XCpoOjTb24zcVDQyOQMgRN8y9MDPpDaaHX5o6yQPXoBy690hqNb6RanAzcvg1ePqeMDa2eVFk+zQnZy1JE15mnN1chRO2xCNJPzJwZVSLt3QTNyTjVC9X3JsZYMJu+srPObkePrdG91yXiOnUgLmoHDTiTV7L/UzlG8WqFdKHUULMmJBLFog0/Kbo3zKXbtYGqm4wHzRQDAj+HlAL+46T7wmsCsjO0T/t3GfL7G+rIrAFTeBQApAOwf3DQEzig73jtHgGb3GUwlgDbyAkBkeqtQcv5hZPlIHXcj05lvATCYCgBcLcCq7AaRmYyqhRI+Zkd2FagjVXtOpyBopZoTRZrGOAKAAy3gXZDxpJW6ZytP7mXDQpBvwupTVr5ezdkpTac5EoCeDmB9httSZlFwo5Te3gOt1PG7kal5pTMcDqCVagC5Lzs/IysVWQ/3cnfpH0KIzDN6+2yl3y+biNf0/nDYGA7/0GicIwDY0gGKoTLSBWJ0/Hpp3Lx7TRwxzWlA0dN5qdw+j7Ii4asBFYiamjjiGJ4GrHtAVRFmAvvNZEp3IglTI2fqGBaAdB8uFS15E6arcXZ/d5M7klKY4rqclSYhTVcSXffhzdUB/wGbZ/+XrVaUnQAAAABJRU5ErkJggg==\n",
"text/latex": [
"$$e^{- \\frac{\\left(- 4 t + x - 2 \\pi\\right)^{2}}{4 \\nu \\left(t + 1\\right)}} + e^{- \\frac{\\left(- 4 t + x\\right)^{2}}{4 \\nu \\left(t + 1\\right)}}$$"
],
"text/plain": [
" 2 2 \n",
" -(-4⋅t + x - 2⋅π) -(-4⋅t + x) \n",
" ─────────────────── ─────────────\n",
" 4⋅ν⋅(t + 1) 4⋅ν⋅(t + 1) \n",
"ℯ + ℯ "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x, nu, t = sympy.symbols('x nu t')\n",
"phi = (sympy.exp(-(x - 4 * t)**2 / (4 * nu * (t + 1))) +\n",
" sympy.exp(-(x - 4 * t - 2 * sympy.pi)**2 / (4 * nu * (t + 1))))\n",
"phi"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ela parece um pouco pequena, mas está tudo em ordem. Agora, obter a derivada parcial $\\frac{\\partial \\phi}{\\partial x}$ é uma tarefa trivial."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/latex": [
"$$- \\frac{\\left(- 8 t + 2 x\\right) e^{- \\frac{\\left(- 4 t + x\\right)^{2}}{4 \\nu \\left(t + 1\\right)}}}{4 \\nu \\left(t + 1\\right)} - \\frac{\\left(- 8 t + 2 x - 4 \\pi\\right) e^{- \\frac{\\left(- 4 t + x - 2 \\pi\\right)^{2}}{4 \\nu \\left(t + 1\\right)}}}{4 \\nu \\left(t + 1\\right)}$$"
],
"text/plain": [
" 2 2 \n",
" -(-4⋅t + x) -(-4⋅t + x - 2⋅π) \n",
" ───────────── ───────────────────\n",
" 4⋅ν⋅(t + 1) 4⋅ν⋅(t + 1) \n",
" (-8⋅t + 2⋅x)⋅ℯ (-8⋅t + 2⋅x - 4⋅π)⋅ℯ \n",
"- ─────────────────────────── - ───────────────────────────────────────\n",
" 4⋅ν⋅(t + 1) 4⋅ν⋅(t + 1) "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"phiprime = phi.diff(x)\n",
"phiprime"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Se você quiser ver a versão não rederizada, basta apenas usar o comando `print()`."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-(-8*t + 2*x)*exp(-(-4*t + x)**2/(4*nu*(t + 1)))/(4*nu*(t + 1)) - (-8*t + 2*x - 4*pi)*exp(-(-4*t + x - 2*pi)**2/(4*nu*(t + 1)))/(4*nu*(t + 1))\n"
]
}
],
"source": [
"print(phiprime)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### E agora?\n",
"\n",
"Uma vez que temos a versão *Pythonica* da nossa derivada, podemos terminar de escrever a condição inicial completa e então traduzir ela para uma expressão Python utilizável. Para tanto, usaremos a função *lambdify*, que toma uma equação simbólica do SymPy e a transforma em uma função invocável. "
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-2*nu*(-(-8*t + 2*x)*exp(-(-4*t + x)**2/(4*nu*(t + 1)))/(4*nu*(t + 1)) - (-8*t + 2*x - 4*pi)*exp(-(-4*t + x - 2*pi)**2/(4*nu*(t + 1)))/(4*nu*(t + 1)))/(exp(-(-4*t + x - 2*pi)**2/(4*nu*(t + 1))) + exp(-(-4*t + x)**2/(4*nu*(t + 1)))) + 4\n"
]
}
],
"source": [
"from sympy.utilities.lambdify import lambdify\n",
"\n",
"u = -2 * nu * (phiprime / phi) + 4\n",
"print(u)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Lambdify\n",
"\n",
"Para que lambdify transforme a expressão em uma função invocável, dizemos ao lambdify quais variáveis deve solicitar e a equação na qual queremos conectá-la."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.49170664206445\n"
]
}
],
"source": [
"ufunc = lambdify((t, x, nu), u)\n",
"print(ufunc(1, 4, 3))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### De volta à equação de Burgers \n",
"\n",
"Agora que temos a condição inicial preparada, podemos prosseguir para finalizar nosso problema. Podemos exibir nossa condição inicial no gráfico da condição inicial (CI) usando nossa função lambdify."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([4. , 4.06283185, 4.12566371, 4.18849556, 4.25132741,\n",
" 4.31415927, 4.37699112, 4.43982297, 4.50265482, 4.56548668,\n",
" 4.62831853, 4.69115038, 4.75398224, 4.81681409, 4.87964594,\n",
" 4.9424778 , 5.00530965, 5.0681415 , 5.13097336, 5.19380521,\n",
" 5.25663706, 5.31946891, 5.38230077, 5.44513262, 5.50796447,\n",
" 5.57079633, 5.63362818, 5.69646003, 5.75929189, 5.82212374,\n",
" 5.88495559, 5.94778745, 6.0106193 , 6.07345115, 6.136283 ,\n",
" 6.19911486, 6.26194671, 6.32477856, 6.38761042, 6.45044227,\n",
" 6.51327412, 6.57610598, 6.63893783, 6.70176967, 6.76460125,\n",
" 6.82742866, 6.89018589, 6.95176632, 6.99367964, 6.72527549,\n",
" 4. , 1.27472451, 1.00632036, 1.04823368, 1.10981411,\n",
" 1.17257134, 1.23539875, 1.29823033, 1.36106217, 1.42389402,\n",
" 1.48672588, 1.54955773, 1.61238958, 1.67522144, 1.73805329,\n",
" 1.80088514, 1.863717 , 1.92654885, 1.9893807 , 2.05221255,\n",
" 2.11504441, 2.17787626, 2.24070811, 2.30353997, 2.36637182,\n",
" 2.42920367, 2.49203553, 2.55486738, 2.61769923, 2.68053109,\n",
" 2.74336294, 2.80619479, 2.86902664, 2.9318585 , 2.99469035,\n",
" 3.0575222 , 3.12035406, 3.18318591, 3.24601776, 3.30884962,\n",
" 3.37168147, 3.43451332, 3.49734518, 3.56017703, 3.62300888,\n",
" 3.68584073, 3.74867259, 3.81150444, 3.87433629, 3.93716815,\n",
" 4. ])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from matplotlib import pyplot\n",
"%matplotlib inline\n",
"\n",
"###Declaração de variáveis\n",
"nx = 101\n",
"nt = 100\n",
"dx = 2. * numpy.pi / (nx - 1)\n",
"nu = .07\n",
"dt = dx * nu\n",
"\n",
"x = numpy.linspace(0, 2 * numpy.pi, nx)\n",
"un = numpy.empty(nx)\n",
"t = 0\n",
"\n",
"u = numpy.asarray([ufunc(t, x0, nu) for x0 in x])\n",
"u"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"