コード例 #1
0
        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));
            }
        }
コード例 #2
0
 public void SkopiujDo(Wektor w)
 {
     for (int i = 0; i < rozmiar; i++)
     {
         w.wektor[i] = this.wektor[i];
     }
 }
コード例 #3
0
        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);
        }
コード例 #4
0
        ///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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
            }
        }
コード例 #8
0
        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();
            }
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        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);
        }