public virtual IterativeResult Solve(ISystemEquations systemEquations, double eps = 0.001) { var result = new IterativeResult(); var size = systemEquations.Matrix.GetLength(0); double[,] alpha; double[] beta; Transform(systemEquations.Matrix, systemEquations.B.ToArray(), size, out alpha, out beta); if (alpha.Norm() > 1.0) { return null; } double epsK; var px = beta; do { result.X = GetX(alpha, beta, px); epsK = (alpha.Norm() / (1.0 - alpha.Norm())) * DifferentAbs(result.X, px).Max(); result.CountIterations++; px = result.X; } while (epsK > eps); return result; }
public DirectResult SolveSystem(ISystemEquations systemEquations, DirectMethod methods) { switch (methods) { case DirectMethod.Tridiag: return new TridiagonalMethod((TridiagonalSystemEquations)systemEquations).Solve(); case DirectMethod.Gauss: return new Gauss((DefaultSystemEquations)systemEquations).Solve(); default: return null; } }
public IterativeResult SolveSystem(ISystemEquations systemEquations, IterativeMethod method, double eps = 0.001) { switch (method) { case IterativeMethod.SimpleIterations: // todo выполнить проверку на возможность приведения к типу return new SimpleIterationsMethod(systemEquations, eps).Solve(); case IterativeMethod.Seidel: return new SeidelMethod(systemEquations, eps).Solve(); default: return null; } }
public SeidelMethod(ISystemEquations systemEq, double e) { systemEquations = systemEq; eps = e; size = systemEquations.Matrix.GetLength(0); }
public SimpleIterationsMethod(ISystemEquations systemEq, double e) { systemEquations = systemEq; eps = e; size = systemEquations.Matrix.GetLength(0); }
public IEnumerable<DirectResult> SolveSystem(ISystemEquations systemEquations, IEnumerable<DirectMethod> methods) { return methods.Select(directMethod => SolveSystem(systemEquations, directMethod)); }
public IEnumerable<IterativeResult> SolveSystem(ISystemEquations systemEquations, IEnumerable<IterativeMethod> methods, double eps = 0.001) { return methods.Select(iterativeMethod => SolveSystem(systemEquations, iterativeMethod, eps)); }