Чисельні методи

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Не вказано

Інформація про роботу

Рік:
2024
Тип роботи:
Лабораторна робота
Предмет:
Чисельні методи аналізу автоматичних систем
Варіант:
14

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний університет “Львівська політехніка” / ЛАБОРАТОРНА РОБОТА № 9 з дисципліни: "Чисельні методи" на тему: «Методи розв’язування диференціальних рівнянь у частинних похідних» ЛАБОРАТОРНА РОБОТА № 9 Тема роботи: Методи розв’язування диференціальних рівнянь у частинних похідних. Мета роботи: Вивчити і засвоїти методи розв’язування диференціальних рівнянь у частинних похідних. Навчитися досліджувати розв’язок , використовуючи метод кінцевих різниць. Варіант 24: Використовуючи метод сіток, побудувати різницеву схему для заданої крайової задачі. Одержану СЛАР розв’язати методом прогонки. Використовуючи точний розв’язок, оцінити похибку. / Код програми: #define _USE_MATH_DEFINES #include <Windows.h> #include <cmath> #include <iostream> #include <iomanip> using namespace std; double* Method_running(double**, double*, int); double f(double x) {return exp(x)*(x*x + x + 2);} double y_abs(double x) {return x*exp(x);} int main() { SetConsoleOutputCP(1251); cout << "ЛАБОРАТОРНА РОБОТА №9" << endl; double X0, Xn, Y0, Yn, h; double alpha0=0, alpha1=1, beta0=1, beta1=0, alpha=1, beta=M_E; cout << "Введіть X0 та Xn: "; cin >> X0 >> Xn; cout << "Введіть крок: "; cin >> h; cout << "Введіть коефіцієнти граничних рівнянь (a1*y'(x0) - a2*y(x0) = a): " << endl; cin >> alpha1 >> alpha0 >> alpha; cout << "(b1*y'(xn) + b2*y(xn) = b): " << endl; cin >> beta1 >> beta0 >> beta; int n, q = -1; n = (int)((Xn - X0) / h); n += 1; double** System_equ; double* f_x,*y_answer; y_answer = new double[n]; f_x = new double[n]; System_equ = new double*[n]; for (int i = 0; i < n; i++) System_equ[i] = new double[n]; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) System_equ[i][j] = 0; //граничні рівняння System_equ[0][0] = h*alpha0-alpha1; System_equ[0][1] = alpha1; f_x[0] = h*alpha; System_equ[n-1][n-2] = -beta1; System_equ[n-1][n-1] = h*beta0 + beta1; f_x[n-1] = h*beta; //проміжні рівняння for (int i = 1; i < n-1; i++) { System_equ[i][i - 1] = 1 / (h*h) - (X0 + h*i) / (2 * h); System_equ[i][i] = -2 / (h*h) - 1; System_equ[i][i + 1] = 1 / (h*h) + (X0 + h*i) / (2 * h); f_x[i] = f(X0 + h*i); } cout << endl << "---------- Утворена система рівнянь ----------" << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (j == 0) { cout << setw(5) << System_equ[i][j] << "Y[" << j + 1 << "]"; continue; } cout << " +" << setw(5) << System_equ[i][j] << " Y[" << j + 1 << "]"; } cout << " = " << f_x[i]; cout << endl; } y_answer = Method_running(System_equ, f_x, n); cout << endl << "Xi\t\tYi\t\tY істинне\t\tПохибка" << endl; for (int i = 0; i < n; i++) { cout << "X[" << i << "] = " << X0 + h*i <<setprecision(7) <<"\tY[" << i << "] = " << y_answer[i] << " \t" << y_abs(X0 + i*h) << "\t" << fabs(y_answer[i] - y_abs(X0 + i*h)) << endl; } system("pause"); delete[] y_answer; delete[]f_x; for (int i = 0; i < n; i++) delete[] System_equ[i]; delete[]System_equ; return 0; } double* Method_running(double** A, double*b, int n) { double* alpha, *beta,*y; alpha = new double[n]; beta = new double[n]; y = new double[n]; double gamma; alpha[0] = -A[0][1] / A[0][0]; beta[0] = b[0] / A[0][0]; for (int i = 1; i < n - 1; i++) { gamma = A[i][i] + A[i][i-1] * alpha[i - 1]; alpha[i] = -A[i][i + 1] / gamma; beta[i] = (b[i] - A[i][i-1] * beta[i - 1]) / gamma; } y[n - 1] = (b[n - 1] - A[n - 1][n - 2] * beta[n - 2]) / (A[n - 1][n - 1] + A[n - 1][n - 2] * alpha[n - 2]); for (int i = n - 2; i >= 0; i--) { y[i] = alpha[i] * y[i + 1] + beta[i]; } delete[] alpha; delete[] beta; return y; } Результат: / / / Висновок: В результаті виконання лабораторної роботи було вивчено метод кінцевих різниць для розв’язання диференціальних рівнянь у частинних похідних. З результатів роботи програми видно, що точність обчислень при кроці h = 0.1 є 10 −2 . Було знайдено розв’язок диференційного рівняння: / На проміжку Х є [0;1]. Наприклад при х = 0.9 , у = 1.54.
Антиботан аватар за замовчуванням

08.11.2018 17:11-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!