--- id: 59880443fb36441083c6c20e title: Метод Ейлера challengeType: 1 forumTopicId: 302258 dashedName: euler-method --- # --description-- Метод Ейлера надає приблизний розв’язок звичайних диференціальних рівнянь першого порядку з заданим початковим значенням. Це явний метод розв’язку задачі Коші, як описано в цій статті. Звичайні диференціальні рівняння задані в такому форматі: з початковим значенням Щоб отримати числовий розв’язок, замінимо похідну зліва на скінченнорізницеве наближення: потім знайдемо $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; } ```