示例#1
0
        private matrix FindU(matrix Ak)
        {
            double maxEl = 0;
            int    iMax  = 0;
            int    jMax  = 0;

            for (int i = 0; i < dim; ++i)
            {
                for (int j = i + 1; j < dim; ++j)
                {
                    if (Abs(Ak[i, j]) > maxEl)
                    {
                        iMax  = i;
                        jMax  = j;
                        maxEl = Abs(Ak[i, j]);
                    }
                }
            }

            double phi = CountPhi(Ak, iMax, jMax);

            var U = matrix.IdentityMatrix(dim);

            U[iMax, jMax] = -Sin(phi);
            U[jMax, iMax] = Sin(phi);
            U[jMax, jMax] = Cos(phi);
            U[iMax, iMax] = Cos(phi);

            return(U);
        }
示例#2
0
        public List <double> GetAnswer()
        {
            var vectorBeta     = new List <double>(vectorB);
            var matrixAlpha    = new matrix(matrix);
            var matrixDInverse = matrix.IdentityMatrix(matrixAlpha.ColumnCount);

            for (int i = 0; i < dim; i++)
            {
                vectorBeta[i]       /= matrix[i, i];
                matrixDInverse[i, i] = 1 / matrix[i, i];
            }

            matrixAlpha = matrix.IdentityMatrix(matrixAlpha.ColumnCount) - matrixDInverse * matrix;

            List <double> vectorX;
            var           vectorXk = new List <double>(vectorBeta);
            var           count    = 0;

            do
            {
                count++;
                vectorX  = new List <double>(vectorXk);
                vectorXk = vectorBeta.Sum(matrixAlpha.Multiply(vectorX));
            } while (!IsFinished(vectorX, vectorXk, matrixAlpha));

            Console.WriteLine("Number of Simple iterations {0}", count);
            return(vectorXk);
        }
示例#3
0
        public List <double> GetAnswer2()
        {
            var vectorBeta     = new List <double>(vectorB);
            var matrixAlpha    = new matrix(matrix);
            var matrixDInverse = Matrix.Matrix.IdentityMatrix(dim);

            for (int i = 0; i < dim; i++)
            {
                vectorBeta[i]       /= matrix[i, i];
                matrixDInverse[i, i] = 1 / matrix[i, i];
            }

            matrixAlpha = Matrix.Matrix.IdentityMatrix(dim) - matrixDInverse * matrix;

            var matrixB         = matrixAlpha.ToLower();
            var matrixC         = matrixAlpha - matrixB;
            var matrixEbInverse = (Matrix.Matrix.IdentityMatrix(dim) - matrixB).Inverse();

            List <double> vectorX;
            var           vectorXk = new List <double>(vectorBeta);
            var           count    = 0;

            do
            {
                count++;
                vectorX  = new List <double>(vectorXk);
                vectorXk = ((matrixEbInverse * matrixC).Multiply(vectorX)).Sum(matrixEbInverse.Multiply(vectorBeta));
            } while (!IsFinished(vectorX, vectorXk, matrixAlpha, matrixC));


            Console.WriteLine("Number of Siedel2 iterations {0} ", count);
            return(vectorXk);
        }
示例#4
0
        private bool IsFinished(matrix Ak)
        {
            double sum = 0;

            for (int i = 0; i < dim; ++i)
            {
                for (int j = i + 1; j < dim; ++j)
                {
                    sum += Pow(Ak[i, j], 2);
                }
            }

            return(Pow(sum, 0.5) < MatrixConstants.Eps);
        }
示例#5
0
        public matrix GetAnswer()
        {
            var U     = matrix.IdentityMatrix(dim);
            var Ak    = new matrix(A);
            var count = 0;

            while (!IsFinished(Ak))
            {
                count++;
                var Uk = FindU(Ak);
                Ak = Uk.Transpose() * Ak * Uk;
                U  = U * Uk;
            }
            Console.WriteLine("NumberOfIterations: {0}\n Lambda Matrix:", count);
            Ak.Print();
            return(U);
        }
示例#6
0
        public bool IsFinished(List <double> vectorXCurrent, List <double> vectorXPrevious, matrix matrixAlpha)
        {
            var vectorDiffRate  = vectorXCurrent.Difference(vectorXPrevious).RateC();
            var matrixAlphaRate = matrixAlpha.RateC();

            return(Math.Abs(matrixAlphaRate - 1) < Epsilon
                ? vectorDiffRate <= MatrixConstants.Eps
                : vectorDiffRate *matrixAlphaRate / (1 - matrixAlphaRate) <= MatrixConstants.Eps);
        }
示例#7
0
 public SimpleIterationSolution(matrix matrix, List <double> vectorB)
 {
     this.vectorB = vectorB;
     this.matrix  = matrix;
     dim          = matrix.ColumnCount;
 }
示例#8
0
 public SeidelSolution(matrix matrix, List <double> vectorB)
 {
     this.vectorB = vectorB;
     this.matrix  = matrix;
     dim          = matrix.ColumnCount;
 }
示例#9
0
 private double CountPhi(matrix Ak, int iMax, int jMax)
 {
     return(Abs(Ak[iMax, iMax] - Ak[jMax, jMax]) < Double.Epsilon
         ? PI / 4
         : 0.5 * Atan(2.0 * Ak[iMax, jMax] / (Ak[iMax, iMax] - Ak[jMax, jMax])));
 }
示例#10
0
 public RotationMethod(matrix A)
 {
     this.A = A;
     dim    = A.ColumnCount;
 }