O método de Euler aproxima numericamente soluções de equações diferenciais ordinárias (ODEs) de primeira ordem com um dado valor inicial. É um método explícito para resolver problemas de valor inicial (IVPs), conforme descrito na página da Wikipedia .
O ODE deve ser fornecido da seguinte forma:
:: $ \ frac {dy (t)} {dt} = f (t, y (t)) $
com um valor inicial
:: $ y (t_0) = y_0 $
Para obter uma solução numérica, substituímos a derivada no LHS por uma aproximação por diferenças finitas:
:: $ \ frac {dy (t)} {dt} \ approx \ frac {y (t + h) -y (t)} {h} $
então resolva para $ y (t + h) $:
:: $ y (t + h) \ aproximadamente y (t) + h \, \ frac {dy (t)} {dt} $
que é o mesmo que
:: $ y (t + h) \ aproximadamente y (t) + h \, f (t, y (t)) $
A regra de solução iterativa é então:
:: $ y_ {n + 1} = y_n + h \, f (t_n, y_n) $
em que $ h $ é o tamanho do passo, o parâmetro mais relevante para a precisão da solução. Um tamanho de passo menor aumenta a precisão, mas também o custo de computação, por isso sempre tem que ser escolhido a dedo de acordo com o problema em questão.
Exemplo: Lei de Resfriamento de Newton
A lei de refrigeração de Newton descreve como um objeto da temperatura inicial $ T (t_0) = T_0 $ esfria em um ambiente de temperatura $ T_R $ :
:: $ \ frac {dT (t)} {dt} = -k \, \ Delta T $
ou
:: $ \ frac {dT (t)} {dt} = -k \, (T (t) - T_R) $
Ele diz que a taxa de resfriamento de $ \ frac {dT (t)} {dt} $ do objeto é proporcional à diferença de temperatura atual $ \ Delta T = (T (t) - T_R) $ para o ambiente ao redor.
A solução analítica, que vamos comparar com a aproximação numérica, é
:: $ T (t) = T_R + (T_0 - T_R) \; e ^ {- kt} $
Tarefa:Implemente uma rotina do método de Euler e depois use-a para resolver o exemplo dado da lei de resfriamento de Newton com ela para três tamanhos diferentes de degraus de:
:: 2 s
:: * 5 se
:: 10 s
e comparar com a solução analítica.
Valores iniciais::: * temperatura inicial $ T_0 $ deve ser 100 ° C
:: * temperatura ambiente $ T_R $ deve ser 20 ° C
:: * constante de resfriamento $ k $ deve ser 0,07
:: * o intervalo de tempo a calcular deve ser de 0 s ──► 100 s
eulersMethod
é uma função.
testString: 'assert(typeof eulersMethod === "function", "eulersMethod
is a function.");'
- text: 'eulersMethod(0, 100, 100, 10)
deve retornar um número.'
testString: 'assert(typeof eulersMethod(0, 100, 100, 10) === "number", "eulersMethod(0, 100, 100, 10)
should return a number.");'
- text: 'eulersMethod(0, 100, 100, 10)
deve retornar 20.0424631833732.'
testString: 'assert.equal(eulersMethod(0, 100, 100, 2), 20.0424631833732, "eulersMethod(0, 100, 100, 10)
should return 20.0424631833732.");'
- text: 'eulersMethod(0, 100, 100, 10)
deve retornar 20.01449963666907.'
testString: 'assert.equal(eulersMethod(0, 100, 100, 5), 20.01449963666907, "eulersMethod(0, 100, 100, 10)
should return 20.01449963666907.");'
- text: 'eulersMethod(0, 100, 100, 10)
deve retornar 20.000472392.'
testString: 'assert.equal(eulersMethod(0, 100, 100, 10), 20.000472392, "eulersMethod(0, 100, 100, 10)
should return 20.000472392.");'
```