Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- using namespace std;
- double eps = 0.0001; // точность
- int iter = 0; // количество итераций
- void Out(double** a, double* y, int n) { //Функция вывода матрицы
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- cout << a[i][j] << " ";
- }
- cout << y[i] << endl;
- }
- system("PAUSE");
- }
- void Relax(int n, double** a, double* y) // Метод релаксации
- {
- double max; //максимальная невязка
- int max_index=-1; // ее индекс
- int ret = 0; //костыль
- double* R; //вектор невязок
- double* x; // вектор приращений
- double* Sx; // вектор значений Х
- R = new double[n]; //Столбец невязок
- x = new double[n]; // Создание столбца приращений
- Sx = new double[n]; //Создание столбца значений
- for (int i = 0; i < n; i++) {
- x[i] = 0; //начальное приближение 0
- R[i] = 0;
- Sx[i] = 0;
- }
- for (int i = 0; i < n; i++) { //Модификация матрицы для итерационного метода
- for (int j = 0; j < n; j++) {
- if (i != j)a[i][j] =-1* a[i][j] / a[i][i];
- }
- y[i] = y[i]/a[i][i];
- a[i][i] = -1;
- }
- for (;;) { // нахождение невязок
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- if(i!=max_index)R[i] += a[i][j] * Sx[j];
- }
- if (i != max_index)R[i] += y[i];
- }
- max_index = 0;
- max = R[0];
- iter++;
- for (int i = 0; i < n; i++) { // нахождение максимальной невязки
- if (abs(max) < abs(R[i])) {
- max = R[i];
- max_index = i;
- }
- }
- x[max_index] = R[max_index];
- Sx[max_index] += x[max_index]; //к финальному значению x-итой добавляем максимальную невязку на данной итерации
- cout << "++++++++++++++" << endl;
- for (int i = 0; i < n; i++) {
- cout << Sx[i] << " x=" << x[i] << " R=" << R[i] << endl; //Sx – сумма приращений, x – приращение, R – невязки
- }
- cout << "------------------";
- for (int i = 0; i < n; i++) { //условие выхода
- if (abs(R[i]) < eps)ret++;
- }
- if (ret == n)return;
- ret = 0;
- for (int i = 0; i < n; i++) {
- R[i] = 0;
- }
- }
- }
- int main()
- {
- double**a, *y;
- int n;
- n = 3;
- a = new double*[n];
- y = new double[n];
- for (int i = 0; i < n; i++) {
- a[i] = new double[n];
- }
- a[0][0] = 1,17;
- a[0][1] = -0,65;
- a[0][2] = 1,54;
- a[1][0] = -0,65;
- a[1][1] = 1,16;
- a[1][2] = -1,33;
- a[2][0] = 1,54;
- a[2][1] = -1,33;
- a[2][2] = 2,15;
- y[0] = -1,43;
- y[1] = 0,68;
- y[2] = 1,87;
- Relax(n, a, y);
- cout << "Количество итераций: " << iter << endl;
- system("PAUSE");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement