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); }
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); }
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); }
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); }
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); }
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); }
public SimpleIterationSolution(matrix matrix, List <double> vectorB) { this.vectorB = vectorB; this.matrix = matrix; dim = matrix.ColumnCount; }
public SeidelSolution(matrix matrix, List <double> vectorB) { this.vectorB = vectorB; this.matrix = matrix; dim = matrix.ColumnCount; }
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]))); }
public RotationMethod(matrix A) { this.A = A; dim = A.ColumnCount; }