Міністерство освіти і науки України Харківський національний університет радіоелектроніки Кафедра системотехніки Дисципліна: «Чисельні методи» ЛАБОРАТОРНА РОБОТА № 2«Методи розв'язання систем лінійних алгебраїчних рівнянь» Виконав: ст. гр. ІТУ-20-2 Лаптєв Олександр Миколайвич Прийняла: Ситнікова Поліна Едуардівна з оцінкою «____________» «____»_______________2021р. Харків 2021 Мета заняття: знайомство з точними і наближеними методами рішення систем лінійних алгебраїчних рівнянь. Метод Гаусса #include using namespace std; void Swapper(double** , double* , int ); int main() { setlocale(LC_ALL, ""); cout << "Метод Гаусса:\n"; int n, i, j, k; double d, s; cout << "Размер матрицы: " << endl; cin >> n; double** a = new double* [n]; for (i = 0; i <= n; i++){ a[i] = new double[n]; } double** a1 = new double* [n]; for (i = 0; i <= n; i++) { a1[i] = new double[n]; } double* b = new double[n]; double* x = new double[n]; cout << "Введите коэфициенты " << endl; for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { cout << "a[ " << i << "," << j << "]= "; cin >> a[i][j]; a1[i][j] = a[i][j]; } } cout << "Матрица A\n"; for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { cout << a[i][j]<<" "; } cout << endl; } for (i = 1; i <= n; i++) { cout << "b[ " << i << "]= "; cin >> b[i]; } for (k = 1; k <= n; k++) // прямой ход { if (a[k][k] == 0) { Swapper(a, b,n); } for (j = k + 1; j <= n; j++) { d = a[j][k] / a[k][k]; for (i = k; i <= n; i++) { a[j][i] -= d * a[k][i]; } b[j] -= d * b[k]; } } cout << "Промежуточное решение\n"; for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { cout << a[i][j] << " "; } cout << endl; } for (k = n; k >= 1; k--) // обратный ход { d = 0; for (j = k + 1; j <= n; j++) { s = a[k][j] * x[j]; d+= s; } x[k] = (b[k] - d) / a[k][k]; } cout << "Корни системы: " << endl; for (i = 1; i <= n; i++) cout << "x[" << i << "]=" << x[i] << " " << endl; return 0; } void Swapper(double** a, double* b, int n) { for (int i = 0; i < n; i++) { while (a[i][i] == 0) { for (int j = 0; i < n; j++) { swap(a[i][j], a[i + 1][j]); } swap(b[i], b[i + 1]); } } } Метод простої ітерації та метод Зейделя #include #include #include #define eps 0.005 using namespace std; bool diagonal(double a[10][10], int n) { int i, j, l = 1; double sum; for (i = 0; i < n; i++) { sum = 0; for (j = 0; j < n; j++) sum += abs(a[i][j]); sum -= abs(a[i][i]); if (sum > a[i][i]) { l = 0; } } return (l == 1); } int main() { setlocale(LC_ALL, ""); int n, i, j, num, k(0); double A[10][10], B[10], X[10], x[10], xn[10], norma, r[10]; cout << "Введите размерность матрицы N*N:"; cin >> n; cout << "Введите элементы м-цы:"; cout << endl; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { cout << " A [" << i + 1 << "][" << j + 1 << "] = "; cin >> A[i][j]; } } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { cout << A[i][j]<<" "; } cout << endl; } cout << "Введите свободные члены:"; cout << endl; for (i = 0; i < n; i++) { cout << " B [" << i + 1 << "] = "; cin >> B[i]; } for (i = 0; i < n; i++) { X[i] = 0; } cout << "Выберете метод:\n1-метод простых иттераций\n2-метод Зейделя\n"; cin >> num; cout << endl; if (diagonal(A, n)) { while (num != 3) //цикл выполняется пока не нажата кнопка 3 { switch (num) { case 1: k = 0; cout << "Метод простых иттераций\n"; for (i = 0; i < 10; i++) { xn[i] = 0; x[i] = X[i]; } do { k++; norma = 0; for (i = 0; i < n; i++) { xn[i] = -B[i]; for (j = 0; j < n; j++) { if (i != j) xn[i] += A[i][j] * x[j]; } xn[i] /= (-A[i][i]); } for (i = 0; i < n; i++) { if (fabs(x[i] - xn[i]) > norma) norma = fabs(x[i] - xn[i]); x[i] = xn[i]; } cout << "Иттерация №:" << k << ": "; for (i = 0; i < n; i++) { cout << x[i] << " "; } cout << endl; } while (norma > eps); cout << "Кол-во итераций:"; cout << k << endl; for (i = 0; i < n; i++) cout << "x [" << i + 1 << "] = " << x[i] << endl; for (i = 0; i < n; i++) { r[i] = B[i]; for (int j = 0; j < n; j++) { r[i] -= A[i][j] * x[j]; } } cout << "Невязки:" << endl; for (i = 0; i < n; i++) { cout << "r" << i + 1 << " = " << r[i] << endl; } break; case 2: k = 0; cout << "Метод Зейделя\n"; for (i = 0; i < 10; i++) { xn[i] = 0; x[i] = X[i]; } do { k++; norma = 0; for (i = 0; i < n; i++) { x[i] = -B[i]; for (j = 0; j < n; j++) { if (i != j) x[i] += A[i][j] * x[j]; } x[i] /= -A[i][i]; } for (i = 0; i < n; i++) { if (fabs(x[i] - xn[i]) > norma) norma = fabs(x[i] - xn[i]); xn[i] = x[i]; } cout << "Иттерация №:" << k << ": "; for (i = 0; i < n; i++) { cout << x[i] << " "; } cout << endl; } while (norma > eps); cout << "Кол-во итераций:"; cout << k << endl; for (i = 0; i < n; i++) cout << "x [" << i + 1 << "] = " << x[i] << endl; for (i = 0; i < n; i++) { r[i] = B[i]; for (int j = 0; j < n; j++) { r[i] -= A[i][j] * x[j]; } } cout << "Невязки:" << endl; for (i = 0; i < n; i++) { cout << "r" << i + 1 << " = " << r[i] << endl; } break; case 3: break; default: cout << "Повторите ввод"; break; } cout << endl; cin >> num; } } else { cout << "Нет диагонального преобладания"; } } 1.4 Висновки: ми познайомились з точними і наближеними методами рішення систем лінійних алгебраїчних рівнянь. |