Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського»
Навчально-науковий інститут атомної та теплової енергетики
Кафедра цифрових технологій в енергетиці
ЛАБОРАТОРНА РОБОТА №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. Розроблено програмне забезпечення для обрахунку задач Коші методами Рунге-Кутта та Адамса.