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
znaleziono=true; } } if(znaleziono) { for(int y=1;y<=n+1;y++) { swap(a[y],a
} 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; } |