//Autor: Artur Czekalski (Sator) www.epokaY.net/artur artur@epokaY.net Wer. 2007-08-15d //Liczenie ukladu rownan metoda eliminacji Gaussa na wyrazach typu double //z wyborem maksymalnego wyrazu do dzielenia z WIERSZY i KOLUMN. import std.c.windows.windows; //GetTickCount import std.stdio; //writefln import std.math; ///fabs //--------------------------------------------------------------------------- typedef double typwyr; const double MinEpsilon = 1.0E-9; //dla spr czy == 0, bo bledy zaokraglen !!!WAZNE!!! const int MAXWymiar = 2000; //2000 dla 995 double gM[]; //macierz wspolczynnikow double gB[MAXWymiar]; //wektor wyrazow wolnych double gX[MAXWymiar]; //dla wyniku double gOdpX[MAXWymiar]; //Odpowiedni wynik //--------------------------------------------------------------------------- int EliminacjaGaussaMaxWK(const int Wymiar, typwyr A[], typwyr B[], typwyr X[]) //zmienia A[] ! {//Rozwiazuje uklad rownan liniowych metoda 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 wyrazow wolnych //X[Wymiar] - tablica wynikow int i, j, k, l, nr_W, nr_K; typwyr w; int Permut[] = new int[Wymiar]; //permutacja do zapamietania zamian kolumn for (i=0; i 0 w macierzy: od k-tego wiersza i k-tej kolumny w = cast(typwyr)0.0; //maksimum for (i=k; i w) {w = cast(typwyr)fabs(A[i*Wymiar+j]); nr_W = i; nr_K = j;} //Musi to byc element <> 0.0 if (w < MinEpsilon) {delete Permut; return -1;} //nie ma takiego (same zera) //---Zamien ze soba wiersze k-ty i nr_W oraz kolumny k-ta i nr_K //--Najperw wiersze if (k != nr_W) //jesli nie jest to elem. z k-tego wiersza {i = k*Wymiar; l = nr_W*Wymiar; for (j=k; j MinEpsilon) //Dziele przez 'pierwszy' tzn. k-ty wyraz wszystkie elementy tego wiersza {A[k*Wymiar+k] = cast(typwyr)1.0; //juz nie dziele; wiadomo bedzie = 1.0 l = k*Wymiar; //nr wiersza for (j=k+1; j MinEpsilon) //tylko te rozne od 0.0 (niezredukowane) {A[i*Wymiar+k] = cast(typwyr)0.0; for (j=k+1; j=0; --k) //wiersze k {X[Permut[k]] = B[k]; for (j=k+1; j