freeCodeCamp/curriculum/challenges/portuguese/10-coding-interview-prep/rosetta-code/euler-method.md

4.1 KiB

id title challengeType forumTopicId dashedName
59880443fb36441083c6c20e Método de Euler 5 302258 euler-method

--description--

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 [página da Wikipédia](https://en.wikipedia.org/wiki/Euler method "wp: Euler method").

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 do lado esquerdo por uma aproximação da diferença finita:

  • $\frac{dy(t)}{dt} \approx \frac{y(t+h)-y(t)}{h}$

então resolva para y(t+h):

  • $y(t+h) \approx y(t) + h \, \frac{dy(t)}{dt}$

que é o mesmo que

  • $y(t+h) \approx 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)$

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.

Exemplo: Lei de resfriamento de Newton

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:

  • $\frac{dT(t)}{dt} = -k \, \Delta T$

ou

  • $\frac{dT(t)}{dt} = -k \, (T(t) - T_R)$

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.

A solução analítica, que compararemos à aproximação numérica, é

  • $T(t) = T_R + (T_0 - T_R) \; e^{-k t}$

--instructions--

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:

  • 2 s
  • 5 s e
  • 10 s

e compare com a solução analítica.

Valores iniciais:

  • a temperatura inicial $T_0$ deve ser 100 °C
  • a temperatura ambiente $T_R$ deve ser 20 °C
  • a constante de resfriamento $k$ será 0.07
  • o intervalo de tempo para calcular deve ser de 0 s a 100 s

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.

--hints--

eulersMethod deve ser uma função.

assert(typeof eulersMethod === 'function');

eulersMethod(0, 100, 100, 2) deve retornar um número.

assert(typeof eulersMethod(0, 100, 100, 2) === 'number');

eulersMethod(0, 100, 100, 2) deve retornar 20.0424631833732.

assert.equal(eulersMethod(0, 100, 100, 2), 20.0424631833732);

eulersMethod(0, 100, 100, 5) deve retornar 20.01449963666907.

assert.equal(eulersMethod(0, 100, 100, 5), 20.01449963666907);

eulersMethod(0, 100, 100, 10) deve retornar 20.000472392.

assert.equal(eulersMethod(0, 100, 100, 10), 20.000472392);

--seed--

--seed-contents--

function eulersMethod(x1, y1, x2, h) {

}

--solutions--

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;
}