Apresentação
O que eu quero dizer com cultura:¶
- Modelagem matemática de problemas se resume ao que se fazia 100 anos atrás.
- Pouco reaproveitamento
- Pouco compartilhamento de trabalho já realizado
- Endeusamento do que já funciona
- Pouca discussão e ossificação do conhecimento
Exemplo do que já ocorreu no passado¶
- Túnel de vento (tuninho) circa 1990 - Mestrado do Nilson
- Algor - escoamento potencial
- STAN5 (ou 7 de acordo com o Nilson)
- Modelo em escala reduzida
- Medição com fio quente
Minha opinião¶
- Compreender o que ocorre numa bancada ou em um trabalho externo
- Dar ao computador o seu lugar de direito: um escravo muito burro mas muito forte!
- Muito do que nós fazemos é software. Engenharia de Software
- Conhecer o que se faz aqui dentro e fora
- Compartilhar este conhecimento
Ideal¶
- Todas as bancadas modeladas
- Modelos hidráulicos e
- Modelos CFD
- Conhecimento profundo do que ocorre de fato nas bancadas.
- Um modelo das plantas em campo antes de medir.
- Cada área ter um conjunto de ferramentas bem conhecidas
- Ser "piloto" de software não vai nos levar longe
Computação Científica¶
-
Métodos básicos
- Sistemas lineares
- Aproximação
- Equações diferenciais
- Sistemas não lineares
-
Mais importante do que o básico, é saber como usar isso.
-
Métodos numérico rápidos e eficientes
- Muito trabalhoso
- Muito difícil
- Coisa de profissa.
Porque Julia¶
- Ambiente interativo
- Muito melhor que FORTRAN ou C/C++/Pascal/Java
- Parecido com R/Python/Matlab/Mathematica/Scilab
- Desempenho
- Consegue desempenho de C/FORTRAN
- Mas não precisa vetorizar
- Praticamente tudo é implementado em Julia!
- Biblioteca extensa
- Visualização, Álgebra Linear, equações diferenciais, etc
- Ainda não tem tudo o que Matlab tem
- Muito fácil chamar Python (que hoje tem um ecossistema impressionante)
- A linguagem é muito boa!
Engenharia de Software¶
- Controle de versões e repositórios de software (git e github)
- Documentação no código (literate programming)
- Testes unitários
- Pensar no ambiente de trabalho:
- Editor
- Interface Notebook - Jupyter
- REPL (terminal)
- Muito do que nós fazemos é programação exploratória
Estrutura do curso¶
Objetivo final: $$ \nabla\cdot\pmb{u} = 0\\ \frac{\partial \pmb{u}}{\partial t} + \pmb{u}\cdot\nabla\pmb{u} = -\nabla p + \frac{1}{Re}\nabla^2\pmb{u} $$
Precisamos saber resolver este tipo de equação: $$ \nabla^2 \phi = f\\ \frac{\partial \phi}{\partial t} = \alpha\nabla^2 \phi\\ \pmb{u}\cdot\phi = \alpha\nabla^2\phi $$
Vamos focar no problema 1D para depois tentar avançar em outras direções
Em paralelo: use algum software para resolver um problema concreto:¶
Roteiro para $\nabla^2 u = f$¶
- $u^\delta(x) = \sum \hat{u}_k \phi_k(x) \approx u(x)$ - Aproximação e interpolação
- $\nabla^2 u^\delta - f = \varepsilon(x)$ - Erro da equação diferencial
- Resíduos ponderados $\int_\Omega w_i(x) \nabla^2 u^\delta \:dx = \int_\Omega f w_i(x)\:dx$
- Formulação fraca: $ -\int_\Omega \nabla w_i(x) \cdot \nabla u^\delta \:dx + \int_{\partial\Omega} w_i\frac{\partial u}{\partial n} = \int_\Omega f w_i(x)\:dx$
- Galerkin: $w_i(x) = \phi_i(x)$
- Sistema linear: $\left[A\right]\cdot\left\{\hat{u}\right\} = \left\{f\right\}$, $$A_{i,k} = -\int_\Omega\nabla\phi_i\cdot\nabla\phi_k\:dx + \int_{\partial\Omega}\phi_i\frac{\partial u}{\partial n}\\ f_i = \int_\Omega f\phi_i\:dx $$
In [ ]:
Problema 1D¶
- Interpolação e aproximação: polinomial, senos e cossenos
- Derivadas: simbólica, numérica, diferenciação automática
- Quadratura, Simbólica, Numérica
- Sistemas lineares: Métodos diretos, métodos iterativos, Explorar a estrutura da matriz
- Equações diferenciais ordinárias: problemas de valor inicial
- Sistemas de equações não lineares: Newton-Raphson e outros
Introduzindo Julia¶
- http://julialang.org
- Lista de discussão https://discourse.julialang.org/
- Canal do youtube https://www.youtube.com/user/JuliaLanguage
- Documentação: https://docs.julialang.org
In [9]:
# Caluladora
1+1
Out[9]:
In [10]:
function soma(a,b)
return a+b
end
soma2(a,b) = a+2b
x = 1
y = 10
soma2(x,y)
Out[10]:
Porque Julia consegue ser rápido como C?¶
In [11]:
code_native(soma2, (Int,Int))
In [12]:
code_native(soma2, (Float64,Float64))
In [13]:
using ForwardDiff
function f1(x)
res = one(x)
for i = 1:5
res = x + res*x
end
return res
end
df1 = x -> ForwardDiff.derivative(f1, x)
f1b(x) = x + x*(one(x) + x*(one(x) + x * (one(x)+ 2x)))
df1b(x) = one(x) + 2x + 3x^2 + 4x^3 + 10x^4
Out[13]:
In [14]:
df1(0.5) - df1b(0.5)
Out[14]:
In [15]:
using BenchmarkTools
x - 0.5
@btime f1($x)
@btime f1b($x)
@btime df1($x)
@btime df1b($x)
Out[15]:
Sistema de equações diferenciais ordinárias:¶
Equações de Lorenz $$ \begin{align} \frac{dx}{dt} &= σ(y-x) \\ \frac{dy}{dt} &= x(ρ-z) - y \\ \frac{dz}{dt} &= xy - βz \\ \end{align} $$
In [16]:
using DifferentialEquations
using Plots
gr()
Out[16]:
In [17]:
function lorenz(du,u,p,t)
du[1] = 10.0*(u[2]-u[1])
du[2] = u[1]*(28.0-u[3]) - u[2]
du[3] = u[1]*u[2] - (8/3)*u[3]
end
Out[17]:
In [18]:
u0 = [1.0;0.0;0.0]
tspan = (0.0,100.0)
prob = ODEProblem(lorenz,u0,tspan)
sol = solve(prob);
In [19]:
gr()
plot(sol,vars=(1,2,3))
Out[19]:
In [21]:
using Psychro
using Unitful
In [22]:
println(volume(MoistAir, 20.0u"°C", DewPoint, 60.0u"°F", 1.0u"atm", u"cm^3/lb"))
println(wetbulb(MoistAir, 20.0u"°C", DewPoint, 60.0u"°F", 1.0u"atm"))
println(relhum(MoistAir, 20.0u"°C", DewPoint, 60.0u"°F", 1.0u"atm"))
In [23]:
using ACME
circ = @circuit begin
j_in = voltagesource(), [-] ⟷ gnd
r1 = resistor(1e3), [1] ⟷ j_in[+]
c1 = capacitor(47e-9), [1] ⟷ r1[2], [2] ⟷ gnd
d1 = diode(is=1e-15), [+] ⟷ r1[2], [-] ⟷ gnd
d2 = diode(is=1.8e-15), [+] ⟷ gnd, [-] ⟷ r1[2]
j_out = voltageprobe(), [+] ⟷ r1[2], [-] ⟷ gnd
end
model = DiscreteModel(circ, 1/4410)
t = 1/44100 * (0:44099)'
y = run!(model, sin.(2π*100 .* t));
plot(t[1,:],y[1,:])
Out[23]:
In [26]:
using PyCall
In [27]:
math = pyimport("math")
println(math.sin(1))
np = pyimport("numpy")
nprand = pyimport("numpy.random")
nprand.randn(3,4)
Out[27]:
In [30]:
using LinearAlgebra, SpecialFunctions, Plots, ApproxFun
x = Fun(identity,0..10)
f = sin(x^2)
g = cos(x)
Out[30]:
In [31]:
h = f + g^2
r = roots(h)
rp = roots(h')
using Plots
plot(h)
scatter!(r,h.(r))
scatter!(rp,h.(rp))
Out[31]:
In [ ]:
Comentários
Comments powered by Disqus