1 Востаннє редагувалося Cyan (12.03.2013 19:14:26)

Тема: Метод Зейделя для вирішення СЛАР

проблема в тому, що мій цикл якимось чином повторюється надто багато разів. Навіть якщо я знижую точніть (змінна е), кількість ітерацій не змінюється (хоч, по логіці, повинно бути менше)
щось, що виводиться:
http://s5.сайт-злодій/uploads/images/2013/03/b89130b196c822f52ab9b52cb2fc98a3.jpg

власне, мій код:

      int main()
{
    double mas[4][4], b_vek[4], x[4], x_k[4], r[4];
    double const e = 0.0001;

    //--------inicilization of mas--------//
                mas[0][0]= 3.81; 
            mas[0][1]= 0.25;
            mas[0][2]= 1.28;
            mas[0][3]= 0.75;
            mas[1][0]= 2.25;
            mas[1][1]= 1.32;
            mas[1][2]= 4.58;
            mas[1][3]= 0.49;
            mas[2][0]= 1.5;
            mas[2][1]= 6.03;
            mas[2][2]=-0.3;
            mas[2][3]= 0.29;
            mas[3][0]=-0.75;
            mas[3][1]= 3.06;
            mas[3][2]= 0.68;
            mas[3][3]= 4.58;

             b_vek[0]= 4.21;  
             b_vek[1]= 6.47;  
             b_vek[2]=-1.83;  
             b_vek[3]= 6.9;  

             int n=4;

        double max=100501.1;
        int iteraction=0;
             while (max>e)
             {             
                 x_k[0]=(b_vek[0]-x[1]*mas[0][1]-x[2]*mas[0][2]-x[3]*mas[0][3])/mas[0][0];             
                 x_k[1]=(b_vek[1]-x_k[0]*mas[1][0]-x[2]*mas[1][2]-x[3]*mas[1][3])/mas[1][1];             
                 x_k[2]=(b_vek[2]-x_k[0]*mas[2][0]-x_k[1]*mas[2][1]-x[3]*mas[2][3])/mas[2][2];            
                 x_k[3]=(b_vek[3]-x_k[0]*mas[3][0]-x_k[1]*mas[3][1]-x_k[2]*mas[3][2])/mas[3][3];

                 max=abs(x_k[0]-x[0]);
                 for (int i=1; i<n; i++)
                  {
                     if (abs(x_k[i]-x[i])>max)
                     {
                         max=abs(x_k[i]-x[i]);
                     }
                  };
                 
                 for (int i=0; i<n; i++)                
                  {
                    x[i]=x_k[i];
                 
                       r[i]=b_vek[i]-mas[i][0]*x[0]-mas[i][1]*x[1]-mas[i][2]*x[2]-mas[i][3]*x[3];
                          cout<<"r="<<r[i]<<endl;
                         };
              cout<<"end of iteraction#"<<iteraction<<endl<<endl;
              iteraction++;
       };

    cout<<"Total result:"<<endl;

     for (int i=0; i<n; i++)
         {
             cout<<"x"<<i<<"= "<<x[i]<<endl;
         };

    
    system("pause");
    return 0;

  };

з іншою матрицею все працює коректно

2

Re: Метод Зейделя для вирішення СЛАР

Обнуляти масиви при ініціалізації не зайве.
Це я про x, x_k і т.п.

3

Re: Метод Зейделя для вирішення СЛАР

це не сильно впливає на результат, в даному разі

4 Востаннє редагувалося Cyan (13.03.2013 15:11:08)

Re: Метод Зейделя для вирішення СЛАР

прошу мене вибачити: сам код є правильним
помилка була у вхідних даних

той самий код, але вже з правильною матрицею:

#include <iostream>

using namespace std;

int main()
{
    double mas[4][4], b_vek[4], x[4], x_k[4], r[4];
    double const e = 0.00001;

    //--------inicilization of mas--------//
            mas[0][0]= 3.81; 
            mas[0][1]= 0.25;
            mas[0][2]= 1.28;
            mas[0][3]= 0.75;
            mas[1][0]= 1.5;
            mas[1][1]= 6.03;
            mas[1][2]=-0.3;
            mas[1][3]= 0.29;
            mas[2][0]= 2.25;
            mas[2][1]= 1.32;
            mas[2][2]= 4.58;
            mas[2][3]= 0.49;
            mas[3][0]= 9.39;
            mas[3][1]= 2.45;
            mas[3][2]= 3.35;
            mas[3][3]= 15.338575;

             b_vek[0]= 4.21;  
             b_vek[1]= -1.83;  
             b_vek[2]= 6.47;  
             b_vek[3]= 30.672647;   

             x[0]=b_vek[0];
             x[1]=b_vek[1];
             x[2]=b_vek[2];
             x[3]=b_vek[3];

             int n=4;

        for (int i=0; i<n; i++)
            {
                for (int j=0; j<n; j++)
                {
                    cout<<mas[i][j]<<" ";
                }
                cout<<"   "<<b_vek[i]<<endl;
            };        
        
    double max=100501.1;
        int iteraction=0;
             while (max>e)
             {             
                 x_k[0]=(b_vek[0]-x[1]*mas[0][1]-x[2]*mas[0][2]-x[3]*mas[0][3])/mas[0][0];             
                 x_k[1]=(b_vek[1]-x_k[0]*mas[1][0]-x[2]*mas[1][2]-x[3]*mas[1][3])/mas[1][1];             
                 x_k[2]=(b_vek[2]-x_k[0]*mas[2][0]-x_k[1]*mas[2][1]-x[3]*mas[2][3])/mas[2][2];            
                 x_k[3]=(b_vek[3]-x_k[0]*mas[3][0]-x_k[1]*mas[3][1]-x_k[2]*mas[3][2])/mas[3][3];
 
                 max=abs(x_k[0]-x[0]);
                 for (int i=1; i<n; i++)
                  {
                     if (abs(x_k[i]-x[i])>max)
                     {
                         max=abs(x_k[i]-x[i]);
                     }
                  };
                 
                 for (int i=0; i<n; i++)                
                  {
                       x[i]=x_k[i];
                 
                       r[i]=b_vek[i]-mas[i][0]*x[0]-mas[i][1]*x[1]-mas[i][2]*x[2]-mas[i][3]*x[3];
                          cout<<"r="<<r[i]<<endl;
                  };
              cout<<"end of iteraction#"<<iteraction<<endl<<endl;
              iteraction++;
       };

                 
   cout<<"Total result:"<<endl;

     for (int i=0; i<n; i++)
         {
             cout<<"x"<<i<<"= "<<x[i]<<endl;
         };

    system("pause");
    return 0;
}