Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
281
Добавлен:
20.06.2014
Размер:
237 Кб
Скачать
☆
  1. Пример решения

Вычисления производить с точностью до двух знаков после запятой.

РЕШЕНИЕ: Приводим систему(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

Далее, решаем

И так далее. Подставляем результаты вычисленные в таблице. Подсчитав все приращения , содержащее значение корней

Для проверки подставляем найденные значения корней в исходное уравнение; в целом система решена точно.

  1. Листинг

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

}