МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
<<ЛЬВІВСЬКА ПОЛІТЕХНІКА>>
Інститут ІКНІ
Кафедра автоматизовані системи управління
ГРАФІКО-РОЗРАХУНКОВА РОБОТА
на тему
“Метод Адамса розв’язання задачі Коші для диференціального рівняння першого порядку”
З курсу “Чисельні методи”
ЗАВДАННЯ:
Створити проект на певній мові програмування для розв’язання задачі Коші для диференціального рівняння першого порядку методом Адамса:
1. Розробити проект на певній мові програмування для розв’язання задачі Коші для диференціального рівняння першого порядку методом Адамса.
2. Обчислити розв’язок задачі Коші для диференціального рівняння першого порядку методом Адамса.
3. Порівняти отримані результати з розв’язком задачі Коші за методом Рунге-Кутта та зробити висновки. Визначити абсолютну та відносну похибку обчислення кожного методу. Обґрунтувати досягнення заданої точності.
4. Оформити звіт.
Оскільки я 27 варіант, але завдань хватає лише на 25, тому я взяв завдання з другого варіанту.
2.
Відомості та алгоритм
Метод Адамса — група методів чисельного інтегрування звичайних диференційних рівнянь, які дозволяють обчислювати таблицю наближених значень розв'язку за даними в початкових точках. Він є багатокроковим.
В однокрокових методах для обчислення значения уn+1 використовується значения тільки уn і для підвищення точності при фіксованому кроці необхідно проводити обчислення великої кількості допоміжних величин. Це є причиною того, що для багатьох задач застосування формул Рунге-Кутти неможливе внаслідок надто великого обсягу обчислень. Тому часто раціональніше переходити до багатокрокових методів, які дають можливість, використовуючи значення f(xi,yi), що обчислені на попередніх кроках, отримати прийнятну точність.
Проте для обчислення задачі цим алгоритмом, нам потрібно як мінімум два початкових значень, тож зазвичай за цими значеннями звертаються до методу Рунге-Кутта або методу Ейлера. Після чого йде багатокроковий алгоритм, який є точнішим.
/
Де h – крок, f – наша функція.
Текст програми
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
double eps = 0.001;
double h = 0.1;
double masY[10];
double func(double x, double y) {
return x * x + 0.25 * y * y;
}
double x1[10] = { 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1 };
double rounge[10] = { 1.026, 1.055, 1.09, 1.134, 1.188, 1.255, 1.340, 1.444, 1.573, 1.732 };
void print(double x, double y, int n) {
double z = abs(y - rounge[n - 1]);
if (n == 1)
cout << setprecision(4) << n << " |" << x << "\t| " << y << " | " << rounge[n - 1] << "\t| " << z << "\t| " << z / y * 100 << "%" << endl;
else
cout << setprecision(4) << n << " |" << x << "\t| " << y << " | " << rounge[n - 1] << "\t| " << z << "\t| " << z / y * 100 << "%" << endl;
}
double Adams(double x, double y0, int count) {
while (count < 11) {
x += h;
double yn = y0 + h * func(x, y0);
print(x, yn, count);
y0 = yn;
masY[count - 1] = y0;
count++;
}
return y0;
}
double adams(double y0, int count) {
double y[10];
y[0] = 1.026;
print(x1[0], y[0], 1);
y[1] = rounge[1];
print(x1[1], y[1], 2);
for (int i = 2; i < 10; i++) {
y[i] = y[i - 1] + 1.5 * h * func(x1[i - 1], y[i - 1]) - 0.5 * h * func(x1[i - 2], y[i - 2]);
masY[i] = y[i];
print(x1[i], y[i], i+1);
}
return 0;
}
int main() {
system("chcp 1251");
system("cls");
double y0 = 1;
double x = 0;
double y1 = y0 + h * func(0.1, y0);
cout << "Метод Адамса\tМетод Рунге-Кутта\n";
cout << "n | x |y(Адамс) |y(РунгеКутта)| abs похибка |відносна\n0 | 0 | 1 | 1 |\n";
adams(y0, 1);
cout << "\n\nОтже, наближене значення y(Адамса) = " <<masY[9] << ", y(Рунге - Кутта) = " << rounge[9] << endl;
cout << "Абсолютна похибка = " << abs(masY[9] - rounge[9]) << ", Відносна похибка = " << (abs(masY[9] - rounge[9])) / masY[9] * 100 << "%\n\n";
return 0;
}
Результат виконання програми
/
Висновок
Я програмно реалізував алгоритм розв’язання задачі Коші для диференціального рівняння першого порядку методом Адамса та порівняв результати з методом Рунге-Кутта, різниця між ними була мінімальна, проте реалізація цих методів зовсім різна, навідміну від методу Рунге-Кутта, метод Адамса значень функції, які вже були вирахувані в минулих точках.