コード例 #1
0
ファイル: Solver.cs プロジェクト: 15831944/Essence
        public static double Solve(Func <double, double> f, double min, double max, Type solverType, double absoluteAccuracy, int maxEval)
        {
            UnivariateSolver solver;

            switch (solverType)
            {
            case Type.BrentSolver:
            {
                solver = new BrentSolver(absoluteAccuracy);
                break;
            }

            case Type.BisectionSolver:
            {
                solver = new BisectionSolver(absoluteAccuracy);
                break;
            }

            case Type.SecantSolver:
            {
                solver = new SecantSolver(absoluteAccuracy);
                break;
            }

            default:
            {
                throw new IndexOutOfRangeException();
            }
            }
            double v = solver.Solve(maxEval, new DelegateUnivariateFunction(f), min, max);

            return(v);
        }
コード例 #2
0
        private static UnivariateSolver GetSolver(Type type, double error = DEFAULT_ABSOLUTE_ACCURACY)
        {
            UnivariateSolver univariateSolver;

            switch (type)
            {
            case Type.Brent:
                univariateSolver = new BrentSolver(error);
                break;

            case Type.Bisection:
                univariateSolver = new BisectionSolver(error);
                break;

            case Type.Secant:
                univariateSolver = new SecantSolver(error);
                break;

            case Type.RegulaFalsi:
                univariateSolver = new RegulaFalsiSolver(error);
                break;

            case Type.Ridders:
                univariateSolver = new RiddersSolver(error);
                break;

            default:
                throw new IndexOutOfRangeException();
            }
            return(univariateSolver);
        }
コード例 #3
0
        public void FindRoot_CosFunction_ReturnsRootWithinTolerance()
        {
            OneDimensionalFunction f = Math.Cos;

            double          lowerBound = -Math.PI / 2;
            double          upperBound = Math.PI;
            BisectionSolver solver     = new BisectionSolver(f, lowerBound, upperBound);

            var root = solver.FindRoot();

            Assert.IsTrue(Math.Abs(f(root)) < solver.Tolerance);
        }
コード例 #4
0
        public void FindRoot_QuadraticIncorrectIntialGuess_ReturnsRootWithinTolerance()
        {
            OneDimensionalFunction f = x => x * x - 4;

            double          lowerBound = -1;
            double          upperBound = 3;
            BisectionSolver solver     = new BisectionSolver(f, lowerBound, upperBound);

            var root = solver.FindRoot();

            Assert.IsTrue(Math.Abs(f(root)) < solver.Tolerance);
        }
コード例 #5
0
        public void FindRoot_PolynomialLowerBoundIsZero_ReturnsExactRoot()
        {
            OneDimensionalFunction f = x => x * x - 4;

            double          lowerBound = -2;
            double          upperBound = 3;
            BisectionSolver solver     = new BisectionSolver(f, lowerBound, upperBound);

            var root = solver.FindRoot();

            Assert.AreEqual(lowerBound, root);
        }