/*
codeby.net
Autor: DarkKnight125 (Denis Goncharov)
*/
#include <iostream>
using namespace std;
//Метод Якоби (простая итерация)
void MJacobi (int Size, double **A, double *F, double *X, double eps)
// Size - размерность матрицы; A[Size][Size] - матрица коэффициентов, F[Size] - столбец свободных членов,
// X[Size] - начальное приближение, ответ записывается также в X[Size];
// esp - точность
{
double * TempX = new double[Size];
double norm; // норма, определяемая как наибольшая разность компонент столбца иксов соседних итераций.
do {
for (int i = 0; i < Size; i++)
{
TempX[i] =- F[i];
for (int g = 0; g < Size; g++)
{
if (i != g)
TempX[i] += A[i][g] * X[g];
}
TempX[i] /= -A[i][i];
}
norm = abs(X[0] - TempX[0]);
for (int h = 0; h < Size; h++) {
if (abs(X[h] - TempX[h]) > norm)
norm = abs(X[h] - TempX[h]);
X[h] = TempX[h];
}
} while (norm > eps);
delete[] TempX;
}
//Основная функция программы
void main(void)
{
setlocale(LC_ALL,".1251");
const int Size = 4; //Размер уравнение (кол-во уранений и коэффициентов)
//Исходные данные
double A[Size][Size] = {
{2,1,5,2},
{5,2,2,6},
{2,2,1,2},
{1,3,3,1}
};
double Y[Size] = {3,1,2,1};
//Ввод x и t
double x,t;
cout << "Введите x = ";
cin >> x;
cout << "Введите t = ";
cin >> t;
//Приведем к СЛАУ A2X=YT,
double **Arr = new double*[Size]; //Выделим память под строки
for (int i = 0; i< Size; i++)
{
Y[i] = Y[i] * t;
Arr[i] = new double[Size]; //Выделим память под строки столбцы
for (int j = 0; j< Size; j++)
{
Arr[i][j] = 2*x* A[i][j];
Arr[i][j] = A[i][j];
}
}
double ArrResult[Size]={0}; //Результ. матрица
double esp = 10.0; //Точность
//Решим СЛАУ с помощью метода Якобби
MJacobi(Size, Arr,Y, ArrResult ,esp);
cout<< "Результат : " << endl;
for (int i = 0; i < Size; i++)
{
cout << ArrResult[i] << endl;
}
}