コード例 #1
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);
        }
コード例 #2
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);
        }
コード例 #3
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);
        }
コード例 #4
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);
        }
コード例 #5
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);
        }
コード例 #6
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);
        }