Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Метод Гаусса-Зейделя иногда называют также итерационным методом "последовательных смещений", а его основная идея - немедленно вовлекать уже полученную информацию в вычислительный процесс - с успехом применима и для нелинейных итерационных схем.
- т.е. это метод якоби с использованием значений вектора х, найденных в текущем шаге
- */
- #include <iostream>
- #include <cmath>
- #include <iomanip>
- #include <vector>
- using namespace std;
- double eps = 0.000000001;
- double N = 3;
- bool converge (vector<double> &xk,vector<double> &xkp){ //условие сходимости
- double norm = 0;
- for (int i = 0; i < N; i++){
- norm += (xk[i] - xkp[i])*(xk[i] - xkp[i]);
- }
- if (sqrt (norm) >= eps)
- return false;
- return true;
- }
- double iterat (vector<vector<double>> &A,vector<double> B){// Решаем систему методом Гаусса-Зейделя.
- int k=0;
- vector<double>x(N),p(N); //текущие и предыдущие решения
- int i,j;
- do
- {//iteracii
- //for (i = 0; i < N; i++)
- p = x;
- for (i = 0; i < N; i++)
- {
- double var = 0;
- for (j = 0; j < i; j++)
- var += A[i][j] * x[j];
- for(j=i+1;j<N;j++)
- var+=(A[i][j]*p[j]);
- x[i] = (B[i]-var)/A[i][i];
- }
- k++;
- } while (!converge (x,p));
- cout << "Решение системы:" << endl;
- for (i = 0; i < N; i++){
- cout << "X" << i+1 << " = " << x[i]<<fixed<<setprecision(8) << endl;
- }
- cout << "Число итераций: " << k - 1 << endl;
- return 0;
- }
- void crt (vector<vector<double>> &matrix,vector<double>&matrixB,double N){
- cout << "Заполните матрицу А: " << endl;
- for (int i = 0; i < matrix.size (); i++){
- for (int j = 0; j < matrix[i].size (); j++){
- cout<<"A["<<i+1<<"]["<<j+1<<"] = ";
- cin >> matrix[i][j];
- }
- cout << endl;
- }
- cout<<"Заполните стоблец свободных членов:"<<endl;
- for (int i = 0; i < matrixB.size (); i++){
- cout << "В[" << i + 1 << "] = ";
- cin >> matrixB[i];
- }
- cout<<endl;
- }
- void prnt (vector<vector<double>> &matrix){
- int i,j;
- for (i = 0; i < matrix.size (); i++){
- for (j = 0; j < matrix[i].size (); j++){
- cout << matrix[i][j] << " ";
- }
- cout << "\n";
- }
- cout << "\n";
- }
- void prntB (vector<double> &matrix){
- int i,j;
- for (i = 0; i < matrix.size (); i++){
- cout << matrix[i] << " ";
- }
- cout << "\n";
- }
- int main (){
- setlocale (LC_ALL,"Ru");
- vector<vector<double>> A (N,vector<double> (N));
- vector<double> B(N);
- //crt(A,B,N);
- A[0] = {5.6,2.8,6.7};
- A[1] = {1.14,9.18,0.3};
- A[2] = {0.3,2.3,7.3};
- B[0]={10};
- B[1]={15.9};
- B[2]={32.6};
- //0.686098 4.43678 -2.29026
- /*cout<<"Заполните матрицу А: "<<endl;
- for (int i = 0; i < Ab.size (); i++){
- for (int j = 0; j < Ab[i].size (); j++){
- cin >> Ab[i][j];
- }
- cout<<endl;
- }*/
- prnt(A);
- prntB (B);
- cout << endl;
- iterat (A,B);
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement