public double WyliczanieDlugosciWektora(Wektor w2) { double m = 0; double m2 = 0; for (int i = 0; i < rozmiar; i++) { m += wektor[i] * wektor[i]; m2 += w2.wektor[i] * w2.wektor[i]; } double wynik; double wynik2; wynik = Math.Sqrt(m); wynik2 = Math.Sqrt(m2); if (wynik - wynik2 > 0) { return(wynik - wynik2); } else { return((-1) * (wynik - wynik2)); } }
public void SkopiujDo(Wektor w) { for (int i = 0; i < rozmiar; i++) { w.wektor[i] = this.wektor[i]; } }
public double ObliczBladZ(Wektor w) { double wynik; Wektor pom = new Wektor(rozmiar); pom.WyzerujWektor(); for (int i = 0; i < rozmiar; i++) { pom.wektor[i] = wektor[i] - w.wektor[i]; // Console.WriteLine(pom.wektor[i] + " " + wektor[i] + " " + w.wektor[i]); if (pom.wektor[i] < 0) { pom.wektor[i] *= (double)-1; } } wynik = pom.wektor[0]; for (int i = 1; i < rozmiar; i++) { if (pom.wektor[i] > wynik) { wynik = pom.wektor[i]; } } return(wynik); }
///Gauss bez wyboru elementu podstawowego public Wektor GaussBWP() { Wektor X = new Wektor(SIZE); X.WyzerujWektor(); double m; //Tworzenie macierzy schodkowej for (int k = 0; k < SIZE - 1; k++) { for (int i = k + 1; i < SIZE; i++) { m = mCopy[i, k] / mCopy[k, k]; wCopy[i] = wCopy[i] - (m * wCopy[k]); for (int j = k; j < SIZE; j++) { mCopy[i, j] = mCopy[i, j] - (m * mCopy[k, j]); } } } //Wyliczanie X for (int i = SIZE - 1; i >= 0; i--) { m = 0; for (int j = i + 1; j < SIZE; j++) { m = m + (mCopy[i, j] * X.wektor[j]); } X.wektor[i] = (wCopy[i] - m) / mCopy[i, i]; } return(X); }
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 Wektor GaussCWP() //Gauss z czesciowym wyborem elementu podstawowego { double m; Wektor X = new Wektor(SIZE); X.WyzerujWektor(); for (int i = 0; i < SIZE; i++) { int max = i; //Wyszukanie najwiekszego elementu for (int j = i + 1; j < SIZE; j++) { if (ABS(mCopy[j, i]) > ABS(mCopy[max, i])) { max = j; } } double temp; //SWAP macierzy for (int j = 0; j < SIZE; j++) { temp = mCopy[i, j]; mCopy[i, j] = mCopy[max, j]; mCopy[max, j] = temp; } //SWAP wektora temp = wCopy[i]; wCopy[i] = wCopy[max]; wCopy[max] = temp; //Tworzenie macierzy schodkowej for (int j = i + 1; j < SIZE; j++) { m = mCopy[j, i] / mCopy[i, i]; wCopy[j] = wCopy[j] - (m * wCopy[i]); for (int k = i; k < SIZE; k++) { mCopy[j, k] = mCopy[j, k] - (m * mCopy[i, k]); } } } //Wyliczanie X for (int i = SIZE - 1; i >= 0; i--) { m = 0; //m=0; for (int j = i + 1; j < SIZE; j++) { m = m + (mCopy[i, j] * X.wektor[j]); } X.wektor[i] = (wCopy[i] - m) / mCopy[i, i]; } return(X); }
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); }