Пример решения
|
|
|
Вычисления производить с точностью до двух знаков после запятой.
РЕШЕНИЕ: Приводим систему(4) к виду, удобному для решения методом релаксации
|
|
|
Задаем начальные приближения корней нулевыми значениями
|
|
|
Находим значения невязок
![]()
![]()

|
|
|
|
|
|
|
|
|
|
0 |
0,60 |
0 |
0,70 |
0 |
0,80 |
|
|
|
0,16 |
|
0,16 |
|
-0,80 |
|
|
|
0,76 |
|
0,86 |
|
0 |
|
|
|
0,17 |
0,86 |
-0,86 |
|
0,09 |
|
|
|
0,93 |
|
0 |
|
0,09 |
|
|
0,93 |
-0,93 |
|
0,09 |
|
0,09 |
|
|
|
0 |
|
0,09 |
0,18 |
0,18 |
|
|
|
0,04 |
|
0,04 |
|
-0,18 |
|
|
|
0,04 |
0,13 |
0,13 |
|
0 |
|
|
|
0,03 |
|
-0,13 |
|
0,01 |
|
|
0,07 |
0,07 |
|
0 |
|
0,01 |
|
|
|
-0,07 |
|
0,01 |
|
0,01 |
|
|
|
0 |
|
0,01 |
0,02 |
0,02 |
|
|
|
0 |
|
0 |
|
-0,02 |
|
|
|
0 |
|
|
|
|
|
|
|
0 |
0,01 |
0,01 |
|
0 |
|
|
|
0 |
|
-0,01 |
|
0 |
|
|
|
0 |
|
0 |
|
0 |
|
|
1,00 |
|
1,00 |
|
1,00 |
|
Далее, решаем
![]()
И так далее.
Подставляем результаты вычисленные в
таблице. Подсчитав все приращения
,
содержащее значение корней
Для проверки подставляем найденные значения корней в исходное уравнение; в целом система решена точно.
Листинг
#include <math.h>
#include <locale.h>
#include <conio.h>
#include <stdio.h>
int maximal(int n, double R0[]){
int i, f;
f = 0.0;
for(i = 0; i < n-1; i++){
if (R0[i+1] > R0[i]) f = i+1;
}
return f;
}
void main(){
setlocale(LC_ALL, "Russian");
int i, j, n, f, k, iter;
double S, det;
printf("Введите размерность матрицы (матрица должна быть квадратной): ");
scanf("%i", &n);
double* x = new double [n];
double** b = new double* [n];
for(i = 0; i < n; i++)
b[i] = new double [n+1];
double** a = new double* [n];
for(i = 0; i < n; i++)
a[i] = new double [n+1];
printf("Введите количество итераций: ");
scanf("%i", &iter);
printf("Введите расширенную матрицу:\n");
for(i = 0; i < n; i++){
for(j = 0; j <= n; j++)
scanf("%lf", &(b[i][j]));
}
printf("Подготавливаю матрицу к релаксации...\n");
for(i = 0; i < n; i++){
for(j = 0; j < n; j++)
a[i][j] = -b[i][j] / b[i][i];
a[i][n] = b[i][n] / b[i][i];
}
for(i = 0; i < n; i++){
for(j = 0; j < n+1; j++)
printf(" %.3lf || ", a[i][j]);
printf("\n\r");
}
double* x0 = new double [n];
for(i = 0; i < n; i++)
x[i] = 0.0;
double* R0 = new double [n];
printf("Введите значения начальных приближений:\n\r");
for(i = 0; i < n; i++)
scanf("%lf", &(x0[i]));
S=0.0;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++)
S += a[i][j] * x0[i];
}
for(i = 0; i < n; i++){
R0[i] = a[i][n] - x0[i] + S;
printf("R(%i)=%.3lf | ", i, R0[i]);
}
f = maximal(n, R0);
det = R0[f];
for(k = 0; k < iter; k++){
printf("det{%i}=%.3lf\n\r", k, det);
for(i = 0; i < n; i++){
if (i != f) R0[i] += a[i][f] * det;
else R0[i] -= det;
}
for(i = 0; i < n; i++)
printf("R[%i]=%.3lf ", i+1, R0[i]);
x[f] += det;
f = maximal(n, R0);
det = R0[f];
}
printf("\n\r");
for(i = 0; i < n; i++)
printf("X{%i}=%.3lf\n\r", i+1, x[i]);
delete[] x, R0, x0, a, b;
getch();
}


