public void SkopiujDo(Macierz kopia) { for (int i = 0; i < kopia.rozmiarMacierzy; i++) { for (int j = 0; j < kopia.rozmiarMacierzy; j++) { kopia.macierz[i, j] = macierz[i, j]; } } }
public static Wektor Jacobe(Macierz M, Wektor V, int p) { //Nasz wynik i pomoc do obliczania prezycji Wektor X1 = new Wektor(M.rozmiarMacierzy); Wektor X2 = new Wektor(M.rozmiarMacierzy); double suma = 0; X1.WyzerujWektor(); X2.WyzerujWektor(); double precyzja = Math.Pow(10, p); // nasza obliczona precyzja int rozmiar = M.rozmiarMacierzy; // Rozmiar macierzy wszystkie przypadki int z = 0; do { X1.SkopiujDo(X2); //X2=X1; // X1.WyswietlWektor(); for (int i = 0; i < rozmiar; i++) { suma = 0.0; for (int j = 0; j < rozmiar; j++) { if (i != j) { suma += M.macierz[i, j] * X2.wektor[j]; } } suma *= -1; suma = suma + V.wektor[i]; X1.wektor[i] = (double)(suma / M.macierz[i, i]); //Console.WriteLine("------------------"); } z++; // Console.WriteLine(z); } while (X1.ObliczBladZ(X2) > precyzja); //Blad to roznica wektora X1 i X2 return(X1); }
public static Wektor Seid(Macierz M, Wektor V, int p) //M=kopia / V=wektor kopia (same 0 i 1 na koncu) / p=precyzja na -10 itp { //Nasz wynik i pomoc do obliczania prezycji Wektor X1 = new Wektor(M.rozmiarMacierzy); Wektor X2 = new Wektor(M.rozmiarMacierzy); double suma1 = 0; double suma2 = 0; X1.WyzerujWektor(); X2.WyzerujWektor(); double precyzja = Math.Pow(10, p); // nasza obliczona precyzja int rozmiar = M.rozmiarMacierzy; // Rozmiar macierzy wszystkie przypadki do { X1.SkopiujDo(X2); //X2=X1 for (int i = 0; i < rozmiar; i++) { suma1 = 0.0; suma2 = 0.0; for (int j = 0; j < i; j++) { suma1 -= (M.macierz[i, j] * X1.wektor[j]); } for (int j = i + 1; j < rozmiar; j++) { suma2 -= (M.macierz[i, j] * X2.wektor[j]); } suma1 += suma2 + V.wektor[i]; X1.wektor[i] = suma1 / M.macierz[i, i]; } } while (X1.ObliczBladZ(X2) > precyzja); return(X1); }
public static void CzyDobrzeObliczyloWektor(Macierz test, Wektor X) { double[] wynik = new double[test.rozmiarMacierzy]; for (int i = 0; i < test.rozmiarMacierzy; i++) { for (int j = 0; j < test.rozmiarMacierzy; j++) { wynik[i] += test.macierz[i, j] * X.wektor[j]; } } string path = Path.GetFullPath("test.txt"); string text = ""; Console.WriteLine(); Console.WriteLine(); for (int i = 0; i < test.rozmiarMacierzy; i++) { Console.WriteLine(wynik[i]); text = Convert.ToString(wynik[i]) + "\r\n"; System.IO.File.AppendAllText(@path, text); } }
static void Main(string[] args) { for (int rozmiar = 19; rozmiar <= 21; rozmiar++) { Macierz m1 = new Macierz(rozmiar); Macierz m2 = new Macierz(rozmiar); Wektor w1 = new Wektor(m1.rozmiarMacierzy); Wektor w2 = new Wektor(m1.rozmiarMacierzy); Wektor X = new Wektor(m1.rozmiarMacierzy); Wektor Z = new Wektor(m1.rozmiarMacierzy); string path = Path.GetFullPath("POPRAWNE.txt"); TimeSpan ts; Stopwatch stopWatch = new Stopwatch(); string elapsedTime; m1.OdejmijJedynki(); m1.SkopiujDo(m2); // m2.ZapiszDoPliku(); Gauss gauss = new Gauss(m1.macierz, w1.wektor, m2.macierz, w2.wektor, m1.rozmiarMacierzy); Console.WriteLine("MONTE CARLO----------------------------------------"); X = MonteCarlo.GenerujMonte(m2); X.WyswietlWektor(); //X.ZapiszDoPliku(); Console.WriteLine("JACOB----------------------------------------"); Z = Jacob.Jacobe(m2, w1, -6); Z.WyswietlWektor(); System.IO.File.AppendAllText(@path, Convert.ToString(X.ObliczBladZ(Z)) + ";"); // X.ZapiszDoPliku(); Console.WriteLine("JACOB----------------------------------------"); Z = Jacob.Jacobe(m2, w1, -10); Z.WyswietlWektor(); System.IO.File.AppendAllText(@path, Convert.ToString(X.ObliczBladZ(Z)) + ";"); // X.ZapiszDoPliku(); Console.WriteLine("JACOB----------------------------------------"); Z = Jacob.Jacobe(m2, w1, -14); Z.WyswietlWektor(); System.IO.File.AppendAllText(@path, Convert.ToString(X.ObliczBladZ(Z)) + ";"); // X.ZapiszDoPliku(); Console.WriteLine("SEIDEL----------------------------------------"); Z = Seidel.Seid(m2, w1, -6); ts = stopWatch.Elapsed; Z.WyswietlWektor(); System.IO.File.AppendAllText(@path, Convert.ToString(X.ObliczBladZ(Z)) + ";"); // X.ZapiszDoPliku(); Console.WriteLine("SEIDEL----------------------------------------"); Z = Seidel.Seid(m2, w1, -10); ts = stopWatch.Elapsed; Z.WyswietlWektor(); System.IO.File.AppendAllText(@path, Convert.ToString(X.ObliczBladZ(Z)) + ";"); // X.ZapiszDoPliku(); Console.WriteLine("SEIDEL----------------------------------------"); Z = Seidel.Seid(m2, w1, -14); ts = stopWatch.Elapsed; Z.WyswietlWektor(); System.IO.File.AppendAllText(@path, Convert.ToString(X.ObliczBladZ(Z)) + ";"); // X.ZapiszDoPliku(); Console.WriteLine("GAUSS Z CZESCIOWYM WYBOREM ELEMENTU PODSTAWOWEGO----------------------------------------"); Z = gauss.GaussCWP(); Z.WyswietlWektor(); System.IO.File.AppendAllText(@path, Convert.ToString(X.ObliczBladZ(Z)) + ";"); // X.ZapiszDoPliku(); Console.WriteLine("GAUSS BEZ WYBORU ELEMENTU PODSTAWOWEGO----------------------------------------"); Z = gauss.GaussBWP(); Z.WyswietlWektor(); System.IO.File.AppendAllText(@path, Convert.ToString(X.ObliczBladZ(Z)) + "\r\n"); // X.ZapiszDoPliku(); } }
public static Wektor GenerujMonte(Macierz m) { Wektor wynik = new Wektor(m.rozmiarMacierzy); bool choice = true; Random r = new Random(); int iloscWykonan = 10000; wynik.WyzerujWektor(); int tak, nie, nw, s1, s2; double[] wektor = new double[m.iloscAgentow]; double[] kopia = new double[m.iloscAgentow]; for (int ktoraStruktura = 0; ktoraStruktura < m.struktura.Count(); ktoraStruktura++) { int licznik = 0; tak = m.struktura[ktoraStruktura].t; nie = m.struktura[ktoraStruktura].n; nw = m.iloscAgentow - tak - nie; for (int i = 0; i < m.iloscAgentow; i++) { if (i < tak) { wektor[i] = 0; } if (i >= tak && i < tak + nie) { wektor[i] = 1; } if (i >= tak + nie) { wektor[i] = 2; } } for (int i = 0; i < iloscWykonan; i++) { kopia = Skopiuj(wektor, kopia); choice = true; do { s1 = r.Next(m.iloscAgentow); s2 = r.Next(m.iloscAgentow); if (kopia[s1] == 0 && kopia[s2] == 2 || kopia[s1] == 2 && kopia[s2] == 0) { kopia[s1] = 0; kopia[s2] = 0; } else if (kopia[s1] == 0 && kopia[s2] == 1 || kopia[s1] == 1 && kopia[s2] == 0) { kopia[s1] = 2; kopia[s2] = 2; } else if (kopia[s1] == 1 && kopia[s2] == 2 || kopia[s1] == 2 && kopia[s2] == 1) { kopia[s1] = 1; kopia[s2] = 1; } if (!Jest(kopia, 1) && !Jest(kopia, 0)) { choice = false; } else if (!Jest(kopia, 1)) { licznik++; choice = false; } else if (!Jest(kopia, 0)) { choice = false; } } while (choice); } wynik.wektor[ktoraStruktura] = (double)licznik / (double)iloscWykonan; } return(wynik); }