2021-06-15 00:49:18 -07:00
---
id: 59880443fb36441083c6c20e
2021-08-09 17:35:35 +09:00
title: Método de Euler
2021-06-15 00:49:18 -07:00
challengeType: 5
forumTopicId: 302258
dashedName: euler-method
---
# --description--
2021-09-28 08:22:14 -07:00
O método de Euler aproxima numericamente as soluções de equações diferenciais normais de primeira ordem (ODEs) com um dado valor inicial. É um método explícito para resolver problemas de valor inicial (IVPs), conforme descrito na [neste artigo ](https://www.freecodecamp.org/news/eulers-method-explained-with-examples/ "news: Euler's Method Explained with Examples" ).
2021-06-15 00:49:18 -07:00
2021-08-09 17:35:35 +09:00
O ODE deve ser fornecido da seguinte forma:
2021-06-15 00:49:18 -07:00
< ul style = 'list-style: none;' >
< li >< big > $\frac{dy(t)}{dt} = f(t,y(t))$</ big ></ li >
< / ul >
2021-08-09 17:35:35 +09:00
com um valor inicial
2021-06-15 00:49:18 -07:00
< ul style = 'list-style: none;' >
< li > < big > $y(t_0) = y_0$< / big > < / li >
< / ul >
2021-08-09 17:35:35 +09:00
Para obter uma solução numérica, substituímos a derivada do lado esquerdo por uma aproximação da diferença finita:
2021-06-15 00:49:18 -07:00
< ul style = 'list-style: none;' >
< li >< big > $\frac{dy(t)}{dt} \approx \frac{y(t+h)-y(t)}{h}$</ big ></ li >
< / ul >
2021-08-09 17:35:35 +09:00
então resolva para $y(t+h)$:
2021-06-15 00:49:18 -07:00
< ul style = 'list-style: none;' >
< li >< big > $y(t+h) \approx y(t) + h \, \frac{dy(t)}{dt}$</ big ></ li >
< / ul >
2021-08-09 17:35:35 +09:00
que é o mesmo que
2021-06-15 00:49:18 -07:00
< ul style = 'list-style: none;' >
< li >< big > $y(t+h) \approx y(t) + h \, f(t,y(t))$</ big ></ li >
< / ul >
2021-08-09 17:35:35 +09:00
A regra de solução iterativa é, então:
2021-06-15 00:49:18 -07:00
< ul style = 'list-style: none;' >
< li >< big > $y_{n+1} = y_n + h \, f(t_n, y_n)$</ big ></ li >
< / ul >
2021-08-09 17:35:35 +09:00
onde $h$ é o tamanho da etapa, o parâmetro mais relevante para a precisão da solução. Um tamanho de etapa menor aumenta a precisão, mas também o custo de cálculo. Então, ele tem que ser sempre escolhido com cuidado e de acordo com o problema em questão.
2021-06-15 00:49:18 -07:00
2021-08-09 17:35:35 +09:00
**Exemplo: Lei de resfriamento de Newton**
2021-06-15 00:49:18 -07:00
2021-08-09 17:35:35 +09:00
A lei de resfriamento de Newton descreve como um objeto de temperatura inicial $T(t_0) = T_0$ resfria em um ambiente de temperatura $T_R$:
2021-06-15 00:49:18 -07:00
< ul style = 'list-style: none;' >
< li >< big > $\frac{dT(t)}{dt} = -k \, \Delta T$</ big ></ li >
< / ul >
2021-08-09 17:35:35 +09:00
ou
2021-06-15 00:49:18 -07:00
< ul style = 'list-style: none;' >
< li >< big > $\frac{dT(t)}{dt} = -k \, (T(t) - T_R)$</ big ></ li >
< / ul >
2021-08-09 17:35:35 +09:00
Ela diz que a taxa de resfriamento $\\frac{dT(t)}{dt}$ do objeto é proporcional à diferença de temperatura atual $\\Delta = (T(t) - T_R)$ com relação ao ambiente ao redor.
2021-06-15 00:49:18 -07:00
2021-08-09 17:35:35 +09:00
A solução analítica, que compararemos à aproximação numérica, é
2021-06-15 00:49:18 -07:00
< ul style = 'list-style: none;' >
< li >< big > $T(t) = T_R + (T_0 - T_R) \; e^{-k t}$</ big ></ li >
< / ul >
# --instructions--
2021-08-09 17:35:35 +09:00
Implemente uma rotina do método de Euler e, em seguida, use-a para resolver o exemplo da lei de resfriamento de Newton para três tamanhos de etapa diferentes de:
2021-06-15 00:49:18 -07:00
< ul >
< li > < code > 2 s< / code > < / li >
2021-08-09 17:35:35 +09:00
< li > < code > 5 s< / code > e< / li >
2021-06-15 00:49:18 -07:00
< li > < code > 10 s< / code > < / li >
< / ul >
2021-08-09 17:35:35 +09:00
e compare com a solução analítica.
2021-06-15 00:49:18 -07:00
2021-08-09 17:35:35 +09:00
**Valores iniciais:**
2021-06-15 00:49:18 -07:00
< ul >
2021-08-09 17:35:35 +09:00
< li > a temperatura inicial < big > $T_0$< / big > deve ser < code > 100 °C< / code > < / li >
< li > a temperatura ambiente < big > $T_R$< / big > deve ser < code > 20 °C< / code > < / li >
< li > a constante de resfriamento < big > $k$< / big > será < code > 0.07< / code > < / li >
< li > o intervalo de tempo para calcular deve ser de < code > 0 s< / code > a < code > 100 s< / code > < / li >
2021-07-09 21:23:54 -07:00
< / ul >
2021-06-15 00:49:18 -07:00
2021-08-09 17:35:35 +09:00
O primeiro parâmetro para a função é o tempo inicial, o segundo parâmetro é a temperatura inicial, o terceiro parâmetro é o tempo passado e o quarto parâmetro é o tamanho do passo.
2021-06-15 00:49:18 -07:00
# --hints--
2021-08-09 17:35:35 +09:00
`eulersMethod` deve ser uma função.
2021-06-15 00:49:18 -07:00
```js
assert(typeof eulersMethod === 'function');
```
2021-08-09 17:35:35 +09:00
`eulersMethod(0, 100, 100, 2)` deve retornar um número.
2021-06-15 00:49:18 -07:00
```js
assert(typeof eulersMethod(0, 100, 100, 2) === 'number');
```
2021-08-09 17:35:35 +09:00
`eulersMethod(0, 100, 100, 2)` deve retornar 20.0424631833732.
2021-06-15 00:49:18 -07:00
```js
assert.equal(eulersMethod(0, 100, 100, 2), 20.0424631833732);
```
2021-08-09 17:35:35 +09:00
`eulersMethod(0, 100, 100, 5)` deve retornar 20.01449963666907.
2021-06-15 00:49:18 -07:00
```js
assert.equal(eulersMethod(0, 100, 100, 5), 20.01449963666907);
```
2021-08-09 17:35:35 +09:00
`eulersMethod(0, 100, 100, 10)` deve retornar 20.000472392.
2021-06-15 00:49:18 -07:00
```js
assert.equal(eulersMethod(0, 100, 100, 10), 20.000472392);
```
# --seed--
## --seed-contents--
```js
function eulersMethod(x1, y1, x2, h) {
}
```
# --solutions--
```js
function eulersMethod(x1, y1, x2, h) {
let x = x1;
let y = y1;
while ((x < x2 & & x1 < x2 ) | | ( x > x2 & & x1 > x2)) {
y += h * (-0.07 * (y - 20));
x += h;
}
return y;
}
```