Forum programistyczne

Języki programowania => C/C++ => Wątek zaczęty przez: Kammeleon Maj 22, 2011, 10:10:32



Tytuł: [C++] Metoda Gaussa. Prosze o pomoc
Wiadomość wysłana przez: Kammeleon Maj 22, 2011, 10:10:32
Witam!
Napisalem program rozwiazujacy uklad rownan liniowych metoda Gaussa. Jednak mam problem w momencie gdy w pewnym momencie wspolczynniki przy jakiejs zmiennej x_i w KAZDYM rownaniu wynosza 0. Probowalem to naprawic,a teraz program nie dziala juz w ogole. prosze o pomoc,gdzie zrobilem błąd?
, oto kod:

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int n;
    cout<<"Witam, ten program rozwiaze uklad n rownan z n niewiadomymi metoda Gaussa"<<endl<<"Ile rownan i niewiadomych?"<<endl;
    cin>>n;
    double a[n+1][n+2];//Wspolczynniki: a[nr wiersza][nr wspolczynnika w tym wierszu,(n+1)-szy oznacza wartosc tego wiersza],
    double x[n];//Rozwiazania ukladu równañ
    bool UkladMaRozwiazanie=true;

    //Wpisanie wspólczynników


  for(int i=1;i<=n;i++)
  {
      cout<<"rownanie nr"<<i<<endl;
      for(int j=1;j<=n+1;j++)
      {
          cin>>a[j];
      }
      cout<<endl;
  }

//Rozwiazanie równania

    //doprowadzenie do postaci schodkowej
    for(int i=1;i<=n-1;i++)
    {
    int rugowana=i;//zmienna ktora rugujemy


            if(a[rugowana]<0.00001)//a==0
            {
                //szukamy wiersza w ktorym wspolczynnik przy i-tej zmiennej jest niezerowy
                int x=rugowana;
                bool znaleziono=false;
                while(!znaleziono)
                {
                    x++;
                    if(x<=n)//Bo x moze wyniesc n+1
                    {
                        if(abs( a
  • [rugowana])>0.00001)//a
  • !=0
                        {
                            znaleziono=true;
                        }
                    }

                    if(znaleziono)
                    {
                        for(int y=1;y<=n+1;y++)
                        {
                            swap(a[y],a
  • [y]);
                        }
                    }
                    else
                    {
                        rugowana++;
                        x=rugowana;
                    }
                }
            }
        //Wyrugowanie i-tej zmiennej z równan i+1,i+2,...,n
        for(int j=i+1;j<=n;j++)
        {
            //wyrugowanie i-tej zmiennej z j-tego wiersza
            int temp;
            temp=a[j][rugowana]/a[rugowana];
            cout<<"temp="<<temp;
            for(int k=rugowana;k<=n+1;k++)
            {

                a[j][k]-=temp*a[k];
            }

        }

    }
    for(int i=1;i<=n;i++)
    {
        cout<<"wiersz "<<i<<endl;
        for(int j=1;j<=n+1;j++)
        {
            cout<<a[j]<<" ";
        }
        cout<<endl;
    }

    //rozwiazanie ukladu
    //n razy rozwi¹zaæ równanie Ax+B=0, czyli x=-B/A dla A!=0
    x[n]=-a[n][n+1]/a[n][n];
    for(int i=n-1;i>=1;i--)
    {
        //znajdujemy B
        double B=0;
        for(int j=i+1;j<=n;j++)
        {
            B+=a[j]*x[j];
        }
        B+=a[n+1];

        //A=a, wiec
        if(abs( a)>0.00001)//Sprawdzenie czy rozne od 0
        {
            x=-B/a;
        }
        else
        {
            if(abs(B)<0.00001)
            {
                cout<<"Uklad ma nieskonczenie wiele rozwiazan,x_"<<i<<"jest dowolna liczba rzeczywista. Wybierz jej wartosc"<<endl;
                cin>>x;
            }
            else
            {
                i=0;




                UkladMaRozwiazanie=false;
            }
        }
    }
    if(UkladMaRozwiazanie)
    {
        cout<<"Rozwiazaniem tego ukladu sa liczby:"<<endl;
        for(int i=1;i<=n;i++)
        {
            cout<<x<<" ";
        }
    }
    else
    {
        cout<<"Brak rozwiazan";
    }

    return 0;
}