Forum programistyczne
Marzec 28, 2024, 16:50:45 *
Witamy, Gość. Zaloguj się lub zarejestruj.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Forum programistyczne wystartowało. Potrzebujesz pomocy przy pisaniu programu, masz problem programistyczny?

Zapraszamy do rejestracji!!!
 
   Strona główna   Pomoc Szukaj Zaloguj się Rejestracja  

Strony: [1]
  Drukuj  
Autor Wątek: [C++] Metoda Gaussa. Prosze o pomoc  (Przeczytany 5441 razy)
Kammeleon
Nowy użytkownik
*
Wiadomości: 1


Zobacz profil Email
« : 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;
}
Zapisane
Strony: [1]
  Drukuj  
 
Skocz do:  



Polski producent obuwia https://aktinet.pl/w-jakiej-temperaturze-nalezy-wprowadzic-paproc-bostonska-do-srodka/ Haft komputerowy
Działa na MySQL Działa na PHP Powered by SMF 1.1.20 | SMF © 2006-2007, Simple Machines Prawidłowy XHTML 1.0! Prawidłowy CSS!