Метод Гаусса решения систем линейных алгебраических уравнений
Необходимость выбора главных элементов. Заметим, что вычисление множителей, а также обратная подстановка требуют деления на главные элементы akk (k-1). Поэтому если один из главных элементов оказывыется равным нулю, то схема единственного деления не может быть реализована. Здравый смысл подсказывает, что и в ситуации, когда все главные элементы отличны от нуля, но среди них есть близкие к нулю… Читать ещё >
Метод Гаусса решения систем линейных алгебраических уравнений (реферат, курсовая, диплом, контрольная)
Белорусский государственный университет Факультет прикладной математики и информатики Кафедра вычислительной математики Лабораторная работа № 1.
Тема: «Метод Гаусса решения систем линейных алгебраических уравнений».
Подготовил: студент 2 курса 2 группы Зинькович И.А.
Преподаватель: Самусенко А.В.
Минск.
Теоретический материал Пусть есть система:
Прямой ход состоит из n 1 шагов исключения.
1-й шаг. Целью этого шага является исключение неизвестного x1 из уравнений с номерами i = 2, 3, …, n. Предположим, что коэффициент a11 0. Будем называть его главным элементом 1-го шага.
Найдем величины qi1 = ai1/a11 (i = 2, 3, …, n), называемые множителями 1-го шага. Вычтем последовательно из второго, третьего, …, n-го уравнений системы первое уравнение, умноженное соответственно на q21, q31, …, qn1. Это позволит обратить в нуль коэффициенты при x1 во всех уравнениях, кроме первого. В результате получим эквивалентную систему.
a11x1 + a12x2 + a13x3 + … + a1nxn = b1,.
a22(1)x2 + a23(1)x3 + … + a2n(1)xn = b2(1),.
a32(1)x2 + a33(1)x3 + … + a3n(1)xn = b3(1),.
an2(1)x2 + an3(1)x3 + … + ann(1)xn = bn(1).
в которой aij(1) и bij(1) вычисляются по формулам.
aij(1) = aij? qi1a1j, bi(1) = bi? qi1b1.
2-й шаг. Целью этого шага является ислючение неизвестного x2 из уравнений с номерами i = 3, 4, …, n. Пусть a22(1)? 0, где a22(1) — коэффициент, называемый главным (или ведущим) элементом 2-го шага. Вычислим множители 2-го шага.
qi2 = ai2(1) / a22(1) (i = 3, 4, …, n).
и вычтем последовательно из третьего, четвертого, …, n-го уравнения системы второе уравнение, умноженное соответственно на q32, q42, …, qm2. В результате получим систему.
a11x1 + a12x2 + a13x3 + … + a1nxn = b1 ,.
a22(1)x2 + a23(1)x3 + … + a2n(1) xn = b2(1) ,.
a33(2)x3 + … + a3n(2)xn = b3(2) ,.
an3(2)x3 + … + ann(2)xn = bn(2) .
Здесь коэффициенты aij(2) и bij(2) вычисляются по формулам: aij(2) = aij(1) — qi2a2j(1), bi(2) = bi(1) — qi2b2(1).
Аналогично проводятся остальные шаги. Опишем очередной k-й шаг.
k-й шаг. В предположении, что главный (ведущий) элемент k-го шага akk(k-1) отличен от нуля, вычислим множители k-го шага qik = aik(k-1) / akk(k-1) (i = k + 1, …, n) и вычтем последовательно из (k + 1)-го, …, n-го уравнений полученной на предыдущем шаге системы k-e уравнение, умноженное соответственно на qk+1,k, qk+2,k, …, qnk.
После (n — 1)-го шага исключения получим систему уравнений.
a11x1 + a12x2 + a13x3 + … + a1nxn = b1 ,.
a22(1)x2 + a23(1)x3 + … + a2n(1)xn = b2(1) ,.
a33(2)x3 + … + a3n(2)xn = b3(2) ,.
ann(n-1)xn = bn(n-1) .
матрица A(n-1) которой является верхней треугольной. На этом вычисления прямого хода заканчиваются.
Обратный ход. Из последнего уравнения системы находим xn. Подставляя найденное значение xn в предпоследнее уравнение, получим xn-1. Осуществляя обратную подстановку, далее последовательно находим xn-1, xn-2, …, x1. Вычисления неизвестных здесь проводятся по формулам.
xn = bn(n-1) / ann(n-1),.
xk = (bn(k-1) — ak, k+1(k-1)xk+1 — … — akn(k-1)xn) / akk(k-1), (k = n — 1, …, 1).
Необходимость выбора главных элементов. Заметим, что вычисление множителей, а также обратная подстановка требуют деления на главные элементы akk(k-1). Поэтому если один из главных элементов оказывыется равным нулю, то схема единственного деления не может быть реализована. Здравый смысл подсказывает, что и в ситуации, когда все главные элементы отличны от нуля, но среди них есть близкие к нулю, возможен неконтролируемый рост погрешности.
линейный алгебраический уравнение гаусс Условие задания Решить методом Гаусса систему линейных уравнений Ax = b, где A = D + C*k. Матрицы D, C, b взяты из № 41, k = 0,2.
Код программы (main.cpp).
#include.
#include.
using namespace std;
double round (double x) {.
return (x < 0)? ceil (x-0.5): floor (x+0.5);
}.
int main (){.
int SIZE;
double** A;
double** copy;
double* b;
double* result;
double* delta;
double k = 0.2;
ifstream in («in.txt»);
in >> SIZE;
A = new double*[SIZE];
copy = new double*[SIZE];
for (int i = 0; i < SIZE; i++){.
A[i] = new double[SIZE];
copy[i] = new double[SIZE];
}.
double** D = new double*[SIZE];
for (int i = 0; i < SIZE; i++).
D[i] = new double[SIZE];
for (int i = 0; i < SIZE; i++).
for (int j = 0; j < SIZE; j++).
in >> D[i][j];
double** C = new double*[SIZE];
for (int i = 0; i < SIZE; i++).
C[i] = new double[SIZE];
for (int i = 0; i < SIZE; i++).
for (int j = 0; j < SIZE; j++).
in >> C[i][j];
for (int i = 0; i < SIZE; i++).
for (int j = 0; j < SIZE; j++){.
A[i][j] = D[i][j] + C[i][j] * k;
copy[i][j] = A[i][j];
}.
b = new double[SIZE];
result = new double[SIZE];
delta = new double[SIZE];
for (int i = 0; i < SIZE; i++){.
in >> b[i];
result[i] = b[i];
}.
for (int i = 0; i < SIZE; ++i) {.
if (A[i][i]≠ 0) {.
result[i] /= A[i][i];
for (int j = SIZE — 1; j >= i; —j) {.
A[i][j] /= A[i][i];
}.
}.
else {.
return 0;
}.
for (int j = i + 1; j < SIZE; ++j) {.
for (int k = i; k < SIZE; k++) {.
if (i == k).
continue;
A[j][k] -= A[j][i] * A[i][k];
}.
result[j] -= result[i] * A[j][i];
A[j][i] = 0;
}.
}.
for (int j = SIZE — 1; j >= 0; j—){.
for (int i = 0; i < j; i++){.
result[i] -= A[i][j] * result[j];
A[i][j] = 0;
}.
}.
ofstream out («out.txt»);
FILE* f = fopen («out.txt», «w»);
for (int i = 0; i < SIZE; i++){.
result[i] = round (result[i] * 100 000) / 100 000;
}.
for (int i = 0; i < SIZE; i++).
fprintf (f, «%.5lfn», result[i]);
for (int i = 0; i < SIZE; i++).
for (int j = 0; j < SIZE; j++) {.
double sum = 0;
for (int k = 0; k < SIZE; k++).
sum += copy[i][k] * result[k];
delta[i] = abs (b[i] - sum);
}.
for (int i = 0; i < SIZE; i++).
fprintf (f, «n%.10lf», delta[i]);
fclose (f);
}.
В результате получили X:
0.9 169 573 287.
0.2 508 817 999.
— 1.1 237 128 647.
0.277 923 094.
1.872 656 987.
— 0.2 322 239 583.
Округляя до пяти знаков после запятой:
0.91 696.
0.25 088.
— 1.12 371.
0.2 779.
1.8 727.
— 0.23 222.
При вычислении AX — B, где X — округлённые данные, получим:
0.61 000.
0.61 000.
0.57 000.
0.22 000.
0.35 000.
0.31 000.