Seidel

#include "stdafx.h" #include <cmath> #include <iostream> #include <fstream> #include <iomanip> using namespace std; const int N = 2; const double eps = 1e-5; void Id_matrix(double **A, int k) { for (int i = 0; i < k; i++) { for (int j = 0; j < N + 1; j++) { A[i][j] = 0; A[j][i] = 0; } } for (int i = 0; i < k; i++) { for (int j = 0; j < k; j++) { if (i == j) A[i][j] = 1; } } } void Id_vector(double *vec, int zeros, int j) //зануляет первые zeros элементов, на j-е место ставит 1 { for (int i = 0; i < zeros; i++) vec[i] = 0; vec[j] = 1; } void Mul_matmat(double **A, double **B, double **Res) { for (int i = 0; i < N + 1; i++) { for (int j = 0; j < N + 1; j++) { for (int k = 0; k < N + 1; ++k) { Res[i][j] += A[i][k] * B[k][j]; } } } } void Mul_matvec(double **A, double *b, double *res) { for (int i = 0; i < N + 1; i++) { for (int j = 0; j < N + 1; j++) { res[i] += A[i][j] * b[j]; } } } double vTu(double *vec1, double *vec2) { double res = 0; for (int i = 0; i < N + 1; i++) { res += vec1[i] * vec2[i]; } return res; } void vuT(double *vec1, double *vec2, double **res) { for (int i = 0; i < N + 1; i++) { for (int j = 0; j < N + 1; j++) { res[i][j] = vec1[i] * vec2[j]; } } } void Mul_numvec(double *vec, double m) { for (int j = 0; j < N + 1; j++) { vec[j] *= m; } } void Mul_nummat(double **A, double m) { for (int i = 0; i < N + 1; i++) { for (int j = 0; j < N + 1; j++) { A[i][j] *= m; } } } double vec_norm(double *vec) { double norm = 0; for (int i = 0; i < N + 1; i++) norm += pow(vec[i], 2); return sqrt(norm); } bool STOP(double **A, double *x_k, double *b, double eps) //критерий остановки - ||Ax_k-b||<eps { bool stop = false; double *Ax = new double[N + 1]; double *err = new double[N + 1]; Mul_matvec(A, x_k, Ax); for (int i = 0; i < N + 1; i++) err[i] = Ax[i] - b[i]; if (vec_norm(err) < eps) stop = true; return stop; } void seidel(double **A, double *b, double *res) { double *x_prev = new double[N + 1]; double *x_cur = new double[N + 1]; for (int i = 0; i < N + 1; i++) { x_cur[i] = b[i]; } do { for (int i = 0; i < N + 1; i++) x_prev[i] = x_cur[i]; for (int i = 0; i < N + 1; i++) { double var = 0; for (int j = 0; j < i; j++) var += (A[i][j] * x_cur[j]); for (int j = i + 1; j < N + 1; j++) var += (A[i][j] * x_prev[j]); x_cur[i] = (b[i] - var) / A[i][i]; } } while (!STOP(A, x_cur, b, eps)); for (int i = 0; i < N + 1; i++) res[i] = x_cur[i]; } int main() { double ** A = new double *[N + 1];//объявление матрицы, которую можно подать как аргумент функции for (int i = 0; i < N+1; i++) A[i] = new double[N+1]; Id_matrix(A, N + 1); Mul_nummat(A, 4); double *b = new double[N + 1];//объявление вектора, который можно подать как аргумент функции for (int i = 0; i < N + 1; i++) b[i] = i + 1; double *res = new double[N + 1]; //seidel(A, b, res); //for (int i = 0; i < N + 1; i++) cout << res[i] << " "; cout << endl; system("pause"); return 0; }

Be the first to comment

You can use [html][/html], [css][/css], [php][/php] and more to embed the code. Urls are automatically hyperlinked. Line breaks and paragraphs are automatically generated.