Ім'я файлу: ЧМ_ЛБ2_Лаптєв_ІТУ_20_2.docx
Розширення: docx
Розмір: 120кб.
Дата: 22.04.2021
скачати

Міністерство освіти і науки України

Харківський національний університет радіоелектроніки

Кафедра системотехніки

Дисципліна: «Чисельні методи»

ЛАБОРАТОРНА РОБОТА № 2«Методи розв'язання систем лінійних алгебраїчних рівнянь»

Виконав: ст. гр. ІТУ-20-2

Лаптєв Олександр Миколайвич

Прийняла:

Ситнікова Поліна Едуардівна

з оцінкою «____________»

«____»_______________2021р.

Харків 2021

    1. Мета заняття: знайомство з точними і наближеними методами рішення систем лінійних алгебраїчних рівнянь.

    2. Метод Гаусса



#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]);

}

}

}

    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 Висновки: ми познайомились з точними і наближеними методами рішення систем лінійних алгебраїчних рівнянь.

скачати

© Усі права захищені
написати до нас