//Autor: Artur Czekalski (Sator) www.epokaY.net/artur artur@epokaY.net Wer. 2007-08-15d //Liczenie układu równań metodą eliminacji Gaussa na wyrazach typu double //z wyborem maksymalnego wyrazu do dzielenia z WIERSZY i KOLUMN. #include //printf #include //GetTickCount() #include //fabs //--------------------------------------------------------------------------- typedef double typwyr; const typwyr MinEpsilon = 1.0e-9; //dla spr czy == 0, bo błędy zaokrągleń !!!WAŻNE!!! const int MAXWymiar = 2000; //2000 dla 995 typwyr gM[MAXWymiar*MAXWymiar]; //macierz współczynników typwyr gB[MAXWymiar]; //wektor wyrazów wolnych typwyr gX[MAXWymiar]; //dla wyniku typwyr gOdpX[MAXWymiar]; //Odpowiedni wynik //--------------------------------------------------------------------------- inline int EliminacjaGaussaMaxWK(const int Wymiar, typwyr *A, typwyr *B, typwyr *X) //zmienia A[] ! {//Rozwiązuje układ równań liniowych metodą eliminacji Gaussa -wsz. przypadki //A[Wymiar*Wymiar] - macierz kwadratowa stopnia Wymiar; A[i,j] = A[i*Wymiar+j]: i-ty wiersz, j-ta kolumna //B[Wymiar] - wektor wyrazów wolnych //X[Wymiar] - tablica wyników int i, j, k, l, nr_W, nr_K; typwyr w; int* Permut = new int[Wymiar]; //permutacja do zapamiętania zamian kolumn for (i=0; i 0 w macierzy: od k-tego wiersza i k-tej kolumny w = 0.0; //maksimum for (i=k; i w) {w = fabs(A[i*Wymiar+j]); nr_W = i; nr_K = j;} //Musi to być element <> 0.0 if (w < MinEpsilon) {delete[] Permut; return -1;} //nie ma takiego (same zera) //---Zamień ze sobą wiersze k-ty i nr_W oraz kolumny k-tą i nr_K //--Najperw wiersze if (k != nr_W) //jeśli nie jest to elem. z k-tego wiersza {i = k*Wymiar; l = nr_W*Wymiar; for (j=k; j MinEpsilon) //Dzielę przez 'pierwszy' tzn. k-ty wyraz wszystkie elementy tego wiersza {A[k*Wymiar+k] = 1.0; //już nie dzielę; wiadomo będzie = 1.0 l = k*Wymiar; //nr wiersza for (j=k+1; j MinEpsilon) //tylko te różne od 0.0 (niezredukowane) {A[i*Wymiar+k] = 0.0; for (j=k+1; j=0; --k) //wiersze k {X[Permut[k]] = B[k]; for (j=k+1; j