Exemple #1
0
        /// @param r double
        /// @return DhbFunctionEvaluation.PolynomialFunction
        public PolynomialFunction[] DivideWithRemainder(PolynomialFunction p)
        {
            PolynomialFunction[] answer = new PolynomialFunction[2];
            int m = this.Degree;
            int n = p.Degree;

            if (m < n)
            {
                answer[0] = new PolynomialFunction(new double[] { 0 });
                answer[1] = p;
                return(answer);
            }
            double[] quotient = new double[m - n + 1];
            double[] coef     = new double[m + 1];
            for (int k = 0; k <= m; k++)
            {
                coef[k] = _coefficients[k];
            }
            double norm = 1 / p[n];

            for (int k = m - n; k >= 0; k--)
            {
                quotient[k] = coef[n + k] * norm;
                for (int j = n + k - 1; j >= k; j--)
                {
                    coef[j] -= quotient[k] * p[j - k];
                }
            }
            double[] remainder = new double[n];
            for (int k = 0; k < n; k++)
            {
                remainder[k] = coef[k];
            }
            answer[0] = new PolynomialFunction(quotient);
            answer[1] = new PolynomialFunction(remainder);
            return(answer);
        }
Exemple #2
0
        /// @param desiredPrecision double
        /// @return double[]
        public double[] Roots(double desiredPrecision)
        {
            PolynomialFunction dp     = this.Derivative();
            double             start  = 0;
            Random             random = new Random();

            while (Math.Abs(dp.Value(start)) < desiredPrecision)
            {
                start = random.NextDouble();
            }
            PolynomialFunction p          = this;
            NewtonZeroFinder   rootFinder = new NewtonZeroFinder(this, dp, start);

            rootFinder.DesiredPrecision = desiredPrecision;
            List <double> rootCollection = new List <double>(Degree);

            while (true)
            {
                rootFinder.Evaluate();
                if (!rootFinder.HasConverged)
                {
                    break;
                }
                double r = rootFinder.Result;
                rootCollection.Add(r);
                p = p.Deflate(r);
                if (p.Degree == 0)
                {
                    break;
                }
                rootFinder.Function = p;
                try { rootFinder.Derivative = p.Derivative(); }
                catch (ArgumentException) { };
            }
            return(rootCollection.ToArray());
        }