private double [] PCG() { double [,] preconditioner = new double[stiffnessMatrix.GetLength(0), stiffnessMatrix.GetLength(1)]; for (int i = 0; i < preconditioner.GetLength(0); i++) { preconditioner [i, i] = 1 / stiffnessMatrix [i, i]; } double[] residual = VectorOperations.VectorVectorSubtraction( forceVector, VectorOperations.MatrixVectorProduct(stiffnessMatrix, solutionVector) ); double[] preconVector = VectorOperations.MatrixVectorProduct(preconditioner, residual); for (int iter = 0; iter < maxIterations; iter++) { double[] u = VectorOperations.MatrixVectorProduct(stiffnessMatrix, preconVector); double residualDotOld = VectorOperations.VectorDotProduct(residual, preconVector); double alpha = residualDotOld / VectorOperations.VectorDotProduct(preconVector, u); solutionVector = VectorOperations.VectorVectorAddition(solutionVector, VectorOperations.VectorScalarProduct(preconVector, alpha)); residual = VectorOperations.VectorVectorSubtraction(residual, VectorOperations.VectorScalarProduct(u, alpha)); if (VectorOperations.VectorDotProduct(residual, residual) < tolerance) { break; } double residualDotNew = VectorOperations.VectorDotProduct(residual, VectorOperations.MatrixVectorProduct(preconditioner, residual)); double beta = residualDotNew / residualDotOld; preconVector = VectorOperations.VectorVectorAddition( VectorOperations.MatrixVectorProduct(preconditioner, residual), VectorOperations.VectorScalarProduct(preconVector, beta) ); } return(solutionVector); }
private double[] Jacobi() { double[] oldSolution = new double[forceVector.Length]; double[,] Diag = MatrixOperations.PutZerosInDiag(stiffnessMatrix); MatrixOperations.InvertDiagMatrix(Diag); double[,] zeroDiagStiff = MatrixOperations.GetDiagMatrix(stiffnessMatrix); for (int i = 0; i < maxIterations; i++) { oldSolution = solutionVector; solutionVector = VectorOperations.MatrixVectorProduct( Diag, VectorOperations.VectorVectorSubtraction( forceVector, VectorOperations.MatrixVectorProduct(zeroDiagStiff, solutionVector) )); if (VectorOperations.VectorDotProduct(solutionVector, oldSolution) < tolerance) { break; } } return(solutionVector); }