Witam wszystkich... mam następujący problem:
Chcę rozwiązać przykładowy układ równań met Gaussa:
X1 + X4 = 0
X1 + X5 = 0
X1 + X7 = 14
X2 + X6 = 0
X3 + X6 = 0
X3 + X7 = 0
Ponieważ w takiej sytuacji układ ma nieskończenie wiele rozwiązań za X1 podstawiam 0.
Korzystam z tego znalezionego programu:
// Program rozwiązuje układ równań liniowych o n niewiadomych
// za pomocą metody eliminacji Gaussa.
//-----------------------------------------------------------
// (C)2006 mgr J.Wałaszek I LO w Tarnowie
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cmath>
using namespace std;
const double EPS = 0.0000000001; // dokładność porównania z zerem
const int MAXEQ = 100; // maksymalna ilość równań w układzie
// Funkcja dokonująca eliminacji niewiadomych. Jeśli operacja
// się powiedzie, zwraca true. Inaczej zwraca false.
bool EliminujX(int n, double AB[][MAXEQ+1])
{
int i,j,k;
double m;
for(i = 0; i < n - 1; i++)
{
if(fabs(AB[i][i]) < EPS) return false;
for(j = i + 1; j < n; j++)
{
m = -AB[j][i] / AB[i][i];
for(k = i + 1; k <= n; k++) AB[j][k] += m * AB[i][k];
}
}
return true;
}
// Funkcja oblicza kolejne niewiadome x z macierzy AB
// przetworzonej przez funkcję Eliminuj_X().
// Jeśli operacja się powiedzie, zwraca true. Inaczej
// zwraca false.
bool ObliczX(int n, double X[], double AB[][MAXEQ+1])
{
int i,j;
double s;
for(i = n - 1; i >= 0; i--)
{
if(fabs(AB[i][i]) < EPS) return false;
s = AB[i][n];
for(j = n - 1; j > i; j--) s -= AB[i][j] * X[j];
X[i] = s / AB[i][i];
}
return true;
}
//-----------------------------------------------------
// Program główny
//-----------------------------------------------------
int main(int argc, char* argv[])
{
ifstream fin;
ofstream fout;
int i,j,n;
double AB[MAXEQ][MAXEQ+1], X[MAXEQ];
cout.precision(5); // 5 cyfr po przecinku
cout.setf(ios::fixed); // format stałoprzecinkowy
cout << "Uklad rownan liniowych - metoda eliminacji Gaussa\n"
"--------------------------------------------------\n"
"(C)2006 mgr Jerzy Walaszek I LO w Tarnowie\n\n";
// Dane dla programu odczytujemy z pliku tekstowego o nazwie in.txt,
// który musi się znajdować w tym samym katalogu co program
// Pierwszy wiersz pliku powinien zawierać liczbę n
// Następne n kolejnych wierszy powinno zawierać współczynniki ai dla
// tego wiersza, a na końcu współczynnik bi. Kolejne współczynniki
// oddzielone są od siebie przynajmniej jedną spacją.
fin.open("in.txt");
fin >> n;
if(n <= MAXEQ)
{
for(i = 0; i < n; i++)
for(j = 0; j <= n; j++) fin >> AB[i][j];
fin.close();
// Dokonujemy eliminacji oraz obliczania niewiadomych x
cout << "\n--------------------------------------------------\n"
"Wyniki:\n\n";
if(EliminujX(n,AB) && ObliczX(n,X,AB))
{
fout.open("out.txt");
for(i = 0; i < n; i++)
{
cout << "x" << i + 1 << " = " << setw(12) << X[i] << endl;
fout << X[i] << endl;
}
fout.close();
}
else cout << "Rozwiazanie ukladu rownan nie powiodlo sie\n";
}
else
{
fin.close();
cout << "Zbyt wiele rownan!\n";
}
cout << "\n--------------------------------------------------\n";
system("pause");
return 0;
}
tak wygląda plik wejściowy:
6
0 0 1 0 0 0 0
0 0 0 1 0 0 0
0 0 0 0 0 1 14
1 0 0 0 1 0 0
0 1 0 0 1 0 0
0 1 0 0 0 1 0
czyli taki układ równań:
0X2 + 0X3 + 1X4 + 0X5 + 0X6 + 0X7 = 0
0X2 + 0X3 + 0X4 + 1X5 + 0X6 + 0X7 = 0
0X2 + 0X3 + 0X4 + 0X5 + 0X6 + 1X7 = 14
1X2 + 0X3 + 0X4 + 0X5 + 1X6 + 0X7 = 0
0X2 + 1X3 + 0X4 + 0X5 + 1X6 + 0X7 = 0
0X2 + 1X3 + 0X4 + 0X5 + 0X6 + 1X7 = 0
Próbowałem również innym: http://www.programmersheaven.com/download/29309/download.aspx
i też zima...
Nie rozumiem dlaczego nie rozwiązuje takiego prostego układu... na innych działa, przykład:
5
2 -2 2 -7 6 -4
7 -3 -2 7 2 11
2 2 -1 1 4 9
9 8 -2 2 -2 21
4 8 -3 3 -1 16
Macie pomysł dlaczego?
Pozdrawiam.