Niepoprawnosc kodu Gauss Seidl

0
 #include <iostream>
#include <math.h>
#include <fstream>

using namespace std;

//const double eps=0.01;

int main()
{
    int const W=200,K=200; double A[W][K],B[W],X[W],G[W], XX[W], XXX[W]; int i,j;
 double ss=0; int licz=0;
    for(i=0;i<W;i++)
    {
        for(j=0;j<K;j++)
        {
            if(i==j)A[i][j]=360360/i+i+1;
            else A[i][j]=j+0.2;

        }
    }
    for(i=0;i<W;i++)
    {
        double s=0;
        for(j=0;j<W;j++)
        {
            s+=A[i][j];
        }
        B[i]=i+j;
    }



    for(i=0;i<W;i++) X[i]=0;
    for(i=0;i<W;i++) XX[i]=0;

//Wykonujemy iteracje:
do{
    double ss=0;
    for(i=0;i<W;i++)
    {
        double s=0;
        for(j=0;j<W;j++)
        {
         if(j>i) s+=A[i][j]*XX[j];
         if(j<i) s+=A[i][j]*XX[j];
        }
        X[i]=XX[i]; //do warunku stopu
        X[i]=(B[i]-s)/A[i][i];
        XX[i]=X[i];
     }
     for(i=0;i<W;i++)
     {
         ss+=pow(XX[i]-X[i],2);
     }
        licz++;
}while(sqrt(ss)>0.001);
cout<<""<<sqrt(ss)<<endl;

         std::ofstream plik("wynik.txt");
         for(i=0; i<W; i++)
         {
         plik<<X[i]<<"\n\n";;
         }
         plik.close();
         cout<<""<<licz<<endl;
         return 0;
}

Witam

co tu jest niepoprawnie

0

Niepoprawnie robisz to, że nie dzielisz kodu na funkcje. Nie możesz przez to w łatwy sposób testować poszczególnych elementów programu.

0

ROzumiem :( a czy tutaj bys pomógł mi wychwycic błąd?

0

Bardzo ciężko wychwycić błąd w takim kodzie.
Deklarujesz zmienną ss 2 razy. Jesteś pewny, w którym momencie, której używasz?

0

Poprawiłem, usunąłem z do.. while. Dalej jakies propoozycje?

0
if(i==j)A[i][j]=360360/i+i+1;

dzielisz przez 0

0
 #include <iostream>
#include <math.h>
#include <fstream>

using namespace std;

//const double eps=0.01;

int main()
{
    int const W=50,K=50; double A[W][K],B[W],X[W],G[W], XX[W], XXX[W]; int i,j;
    int licz=0; double ss=0;
    for(i=0;i<W;i++)
    {
        for(j=0;j<K;j++)
        {
            //if(i==j) A[i][j]=2.2+2*i;
            A[i][j]=360360/(i+j+1);
            //else A[i][j]=1/3;

        }
    }
    for(i=0;i<W;i++)
    {
        double s=0;
        for(j=0;j<W;j++)
        {
            s+=A[i][j];
        }
        B[i]=s;
    }
    for(i=0;i<W;i++) X[i]=0; //Wektor początkowy
    for(i=0;i<W;i++) XX[i]=0;

//Wykonujemy iteracje:

do{

    for(i=0;i<W;i++)
    {
        double s=0;
        for(j=0;j<W;j++)
        {
         if(j>i) s+=A[i][j]*X[j];
         if(j<i) s+=A[i][j]*X[j];
        }
        XX[i]=X[i]; //do warunku stopu
        XX[i]=(B[i]-s)/A[i][i];
        X[i]=XX[i];
     }

     for(i=0;i<W;i++)
     {
         ss+=pow((XX[i]-X[i]),2);
     }
        licz++;
}while(sqrt(ss)>0.00001); cout<<""<<sqrt(ss)<<endl;

         std::ofstream plik("wynik.txt");
         for(i=0; i<W; i++)
         {
         plik<<X[i]<<"\n\n";;
         }
         plik.close();
         cout<<""<<licz<<endl;
         return 0;
}

Po poprawkach i wskazanych błędach, niepokoi mnie czy dobrze przechowuje wektor początkowy i następnik ( kolejnej iteracji )

1 użytkowników online, w tym zalogowanych: 0, gości: 1