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