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

4.4 KiB

title id localeTitle challengeType
Euler method 59880443fb36441083c6c20e 59880443fb36441083c6c20e 5

Description

El método de Euler aproxima numéricamente las soluciones de ecuaciones diferenciales ordinarias de primer orden (EDO) con un valor inicial dado. Es un método explícito para resolver problemas de valor inicial (IVP), como se describe en la página de wikipedia .

La EDO debe ser proporcionada en la siguiente forma:

:: $ \ frac {dy (t)} {dt} = f (t, y (t)) $

con un valor inicial

:: $ y (t_0) = y_0 $

Para obtener una solución numérica, reemplazamos el derivado en LHS con una aproximación de diferencias finitas:

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

luego resuelva por $ y (t + h) $:

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

que es lo mismo que

:: $ y (t + h) \ approx y (t) + h \, f (t, y (t)) $

La regla de solución iterativa es entonces:

:: $ y_ {n + 1} = y_n + h \, f (t_n, y_n) $

donde $ h $ es el tamaño del paso, el parámetro más relevante para la precisión de la solución. Un tamaño de paso más pequeño aumenta la precisión, pero también el costo de cómputo, por lo que siempre tiene que ser seleccionado de acuerdo con el problema en cuestión.

Ejemplo: Ley de enfriamiento de Newton

La ley de enfriamiento de Newton describe cómo un objeto de temperatura inicial $ T (t_0) = T_0 $ se enfría en un entorno de temperatura $ T_R $ :

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

o

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

Dice que la tasa de enfriamiento $ \ frac {dT (t)} {dt} $ del objeto es proporcional a la diferencia de temperatura actual $ \ Delta T = (T (t) - T_R) $ al entorno circundante.

La solución analítica, que compararemos con la aproximación numérica, es

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

Tarea:

Implemente una rutina del método de Euler y luego úselo para resolver el ejemplo dado de la ley de enfriamiento de Newton para tres tamaños de pasos diferentes de:

:: * 2 s

:: * 5 sy

:: * 10 s

y comparar con la solución analítica.

Valores iniciales:

:: * temperatura inicial $ T_0 $ será de 100 ° C

:: * temperatura ambiente $ T_R $ será 20 ° C

:: * constante de refrigeración $ k $ será 0.07

:: * El intervalo de tiempo para calcular será de 0 s ──► 100 s

Instructions

Tests

tests:
  - text: <code>eulersMethod</code> es una función.
    testString: 'assert(typeof eulersMethod === "function", "<code>eulersMethod</code> is a function.");'
  - text: ' <code>eulersMethod(0, 100, 100, 10)</code> debe devolver un 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> debe devolver 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> debe devolver 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> debe devolver 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

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