--- id: 59880443fb36441083c6c20e title: Метод Ейлера challengeType: 5 forumTopicId: 302258 dashedName: euler-method --- # --description-- Метод Ейлера чисельно наближує рішення звичайних рівнянь першого порядку (ODE) з заданим початковим значенням. Це явний метод вирішення проблем із початковими значеннями (IVP), описаний у [цій статті](https://www.freecodecamp.org/news/eulers-method-explained-with-examples/ "news: Euler's Method Explained with Examples"). ODE повинен бути наданий за такою формою: з початковим значенням Щоб отримати числове рішення, ми заміняємо похідну на LHS з скінченним наближенням до різниці: тоді вирішіть для $y(t+h)$: що є тим самим, як і Тоді, правило повторного рішення: де $h$ - розмір кроку, найбільш відповідний параметр для точності рішення. Менший розмір кроку збільшує точність, але й обчислювальні витрати, тому вони завжди повинні бути підібрані вручну відповідно до завдань. **Приклад: Закон Ньютона** Закон Ньютона описує як об’єкт початкової температури $T(t_0) = T_0$ охолоджується в умовах температури $T_R$: або Він каже, що швидкість охолодження $\\frac{dT(t)}{dt}$ $ об'єктів пропорційна поточній різниці температури $\\Delta T = (T(t) - T_R)$ в навколишнє середовище. Аналітичне рішення, яке ми будемо порівняти з числовим наближенням, є # --instructions-- Реалізуйте розпорядок методу Ейлера та використовуйте його для рішення заданого прикладу закону Ньютона про три різні розміри кроку: та порівняти з аналітичним рішенням. **Початкові значення:** Перший параметр функції - це початковий час, другий параметр - початкова температура, третій - минулий час і четвертий параметр - крок розміру. # --hints-- `eulersMethod` має бути функцією. ```js assert(typeof eulersMethod === 'function'); ``` `eulersMethod(0, 100, 100, 2)` має повернути число. ```js assert(typeof eulersMethod(0, 100, 100, 2) === 'number'); ``` `eulersMethod(0, 100, 100, 2)` має повернути 20.0424631833732. ```js assert.equal(eulersMethod(0, 100, 100, 2), 20.0424631833732); ``` `eulersMethod(0, 100, 100, 5)` має повернути 20.01449963666907. ```js assert.equal(eulersMethod(0, 100, 100, 5), 20.01449963666907); ``` `eulersMethod(0, 100, 100, 10)` має повернути 20.000472392. ```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; } ```