Пример #1
0
        public void calcDeterminant(double[][] a, int N, out double determinant)
        {
            double realFit = 0.0;
            double imagFit = 0.0;
            int    eigen_rows;
            var    wr = new List <double>();
            var    wi = new List <double>();

            Complex[] read_eigen_array = LA.GetEigenValues(a);
            eigen_rows = read_eigen_array.Length;
            N          = eigen_rows;

            for (int i = 0; i < N; i++)
            {
                wr.Add(read_eigen_array[i].Real);
                wi.Add(read_eigen_array[i].Imag);
            }


            /*Calculate the product of eigen values*/
            realFit = wr[0];
            imagFit = wi[0];
            double tempRealFit = 0.0;

            for (int i = 1; i < N; i++)
            {
                tempRealFit = realFit;
                realFit     = realFit * wr[i] - imagFit * wi[i];
                imagFit     = tempRealFit * wi[i] + imagFit * wr[i];
            }
            determinant = realFit; //Using only real part because, we assume the eigen values
            //come in complex conjugates, so the imag parts will be gone
            //when we take the product.
        }
Пример #2
0
        //Mutation
        //Description: The members are mutated based on mutation probability - Pm.
        //Generates a random number 'r'. If the random number generated is less than Pm then mutation is carried.
        //The selection of the parameter that undergoes mutation is again based on a random number - 'randomParam'
        //which can take any value from 0 to num_of_parameters.

        public double getRealPart_ComplexEigenVal_MinReal()
        {
            bool hasImagEigenValue = false;

            rr.setTimeStart(0);
            rr.setTimeEnd(simulationTime);

            BringToSteadyStateOrThrow();

            var redJacobian = rr.getReducedJacobian();
            var eigenValues = LA.GetEigenValues(redJacobian);

            var bufferArray = new List <double>();

            for (int i = 0; i < eigenValues.Length; i++)
            {
                if (Math.Abs(eigenValues[i].Imag) == 0.0) // Check if the imaginary part is greater than zero.
                {
                    // If it is so then assign 10^6 to bufferArray Element.
                    bufferArray.Add(10E6);
                }
                else // Else store the absolute value of real eigen value.
                {
                    bufferArray.Add(Math.Abs(eigenValues[i].Real));
                    hasImagEigenValue = true;
                }
            }

            double result;

            if (hasImagEigenValue)
            {
                int minEigenIndex = findMinRealEigenValueIndex(bufferArray);
                result = eigenValues[minEigenIndex].Real;
            }
            else
            {
                result = 0.0;
            }

            return(result);
        }
Пример #3
0
        private double ComputeScoreAndUpdateEigenValues(Member m)
        {
            double norm;

            double[][] jacobian    = rr.getReducedJacobian();
            Complex[]  eigenValues = LA.GetEigenValues(jacobian);
            int        N           = eigenValues.Length;
            var        wr          = new List <double>();
            var        wi          = new List <double>();

            for (int i = 0; i < N; i++)
            {
                wr.Add(eigenValues[i].Real);
                wi.Add(eigenValues[i].Imag);
            }

            norm = ComputeScore(N, wr, wi);

            m.SetEigenValues(eigenValues);
            return(norm);
        }