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 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); }