Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського»
Навчально-науковий інститут атомної та теплової енергетики
Кафедра цифрових технологій в енергетиці
ЛАБОРАТОРНА РОБОТА №1
з дисципліни «Чисельні методи»
Варіант № 9
Тема: Розв’язання задачі Коші.Завдання:
Методами Рунге-Кутта та Адамса розв'язати задачу Коші.
Розв’язати за допомогою Matchad систему рівнянь.
Виконання роботи:
Завдання 1:
Розвязати задачу Коші методом Рунге-Кутта та Адамса.
Варіант завдання :
/
/
Лістинг програми:
package chmLr1;/* * Ждан Вячеслав Тм-02 * Варіант №9 * y' = e^(-ax) ( y^2 + b); [0,4]; h = 0.1; * */public class Main { private static double x = 0; private static double y = 0; private static double h = 0.1; public static void main(String[] args) { int left = 0; int right = 4; int n = (int) ((right - left) / h) + 1; calculateRK(n); x = 0; y = 0; calculateAdams(n); } /* y' = e^(-ax) ( y^2 + b); */ public static double dF(double x, double y) { int variant = 9; int n = variant - 5, k = variant - 5; double a = 1 + 0.4 * n; double b = 1 + 0.4 * k; return Math.pow(Math.E, (-a * x)) * (Math.pow(y, 2) + b); } /* Calculate values for RK*/ public static void calculateRK(int tMax) { double dx, e; System.out.println("\n Runge-Kutta Method: " + "\n n x y k1 k2 k3 k4 e" + "\n----------------------------------------------------"); for (int t = 0; t < tMax; t++) { x = t * h; double[] resK = rk(); dx = (resK[0] + 2 * resK[1] + 2 * resK[2] + resK[3]) / 6; e = Math.abs((Math.pow(y, h) - Math.pow(y, h / 2)) / (Math.pow(2, 4) - 1)); System.out.printf("%2d %6.2f %6.2f %6.2f %6.2f %6.2f %6.2f %6.3f\n", t, x, y, resK[0], resK[1], resK[2], resK[3], e); y += dx; } } public static double[] rk() { double[] res = new double[4]; res[0] = h * dF(x, y); res[1] = h * dF(x + h / 2, y + res[0] / 2); res[2] = h * dF(x + h / 2, y + res[1] / 2); res[3] = h * dF(x + h, y + res[2]); return res; } //Get 4 first value from RK public static double[] RKfirst4() { double dx, e; double[] res = new double[4]; for (int t = 0; t < 4; t++) { x = t * h; double[] resK = rk(); dx = (resK[0] + 2 * resK[1] + 2 * resK[2] + resK[3]) / 6; res[t] = y; y += dx; } return res; } //Calculate values for Adams public static void calculateAdams(int tMax) { double e; System.out.println("\n Adams Method: " + "\n n x y e" + "\n-----------------------"); double[] last4results = RKfirst4(); for (int t = 0; t < 4; t++) { x = t * h; e = Math.abs((Math.pow(last4results[t], h) - Math.pow(last4results[t], h / 2)) / (Math.pow(2, 4) - 1)); System.out.printf("%2d %6.2f %6.2f %6.3f\n", t, x, last4results[t], e); } for (int t = 4; t < tMax; t++) { y = last4results[3] + (h / 24) * (55 * dF(x, last4results[3]) - 59 * dF(x - h, last4results[2]) + 37 * dF(x - 2 * h, last4results[1]) - 9 * dF(x - 3 * h, last4results[0])); e = Math.abs((Math.pow(y, h) - Math.pow(y, h / 2)) / (Math.pow(2, 4) - 1)); for (int i = 0; i < 3; i++) last4results[i] = last4results[i + 1]; last4results[3] = y; x = t * h; System.out.printf("%2d %6.2f %6.2f %6.3f\n", t, x, y, e); } }}
Результат роботи:
/
/
Графіки:
/
/
Розв`язок завдання по варіантам за допомогою MathCad:
Відповіді отримані за допомогою MathCad сходяться з власними
/
/
Завдання №2:
Розв’язати за допомогою Matchad систему рівнянь:
/
Розв`язок системи за допомогою MathCad:
/
/
Висновок: Під час виконання роботи було набуто навички з використання MathCad. Розроблено програмне забезпечення для обрахунку задач Коші методами Рунге-Кутта та Адамса.