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

4.2 KiB

title id challengeType videoUrl localeTitle
Euler method 59880443fb36441083c6c20e 5 Método de Euler

Description

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

Instructions

Tests

tests:
  - text: <code>eulersMethod</code> é uma função.
    testString: 'assert(typeof eulersMethod === "function", "<code>eulersMethod</code> is a function.");'
  - text: '<code>eulersMethod(0, 100, 100, 10)</code> deve retornar um número.'
    testString: 'assert(typeof eulersMethod(0, 100, 100, 10) === "number", "<code>eulersMethod(0, 100, 100, 10)</code> should return a number.");'
  - text: '<code>eulersMethod(0, 100, 100, 10)</code> deve retornar 20.0424631833732.'
    testString: 'assert.equal(eulersMethod(0, 100, 100, 2), 20.0424631833732, "<code>eulersMethod(0, 100, 100, 10)</code> should return 20.0424631833732.");'
  - text: '<code>eulersMethod(0, 100, 100, 10)</code> deve retornar 20.01449963666907.'
    testString: 'assert.equal(eulersMethod(0, 100, 100, 5), 20.01449963666907, "<code>eulersMethod(0, 100, 100, 10)</code> should return 20.01449963666907.");'
  - text: '<code>eulersMethod(0, 100, 100, 10)</code> deve retornar 20.000472392.'
    testString: 'assert.equal(eulersMethod(0, 100, 100, 10), 20.000472392, "<code>eulersMethod(0, 100, 100, 10)</code> should return 20.000472392.");'

Challenge Seed

function eulersMethod (x1, y1, x2, h) {
  // Good luck!
}

Solution

// solution required