Esempio n. 1
0
        /*
         * /// <summary>
         * ///
         * /// </summary>
         * /// <param name="odeRightSide">Array of functions f_i(x,y_1,y_2,...,y_m) that represents ODE system right side, i. e.
         * /// y_i'(x)=f_i(x,y1,y2,...,ym), i=1,...,m.
         * /// </param>
         * /// <param name="initialValues">y_i(a), i=1,...,m</param>
         * /// <param name="coeffsCount"></param>
         * /// <param name="quadratureNodes">Some implementations may require nodes for calculating integrals</param>
         * /// <returns></returns>
         * //public void SetParams(DynFunc<double>[] odeRightSide, double[] initialValues,
         * //    int coeffsCount, double[] quadratureNodes = null)
         * //{
         * //}
         *
         * //protected abstract ISpectralOdeOperator<double[][]> CreateSpectralOdeOperator();
         * //protected abstract Segment GetOrthogonalitySegment();
         * //protected abstract double[][] GetInitialCoeffs();
         * //protected abstract double[] InvFourierSobolevTransform(double[] coeffs, double[] nodes);
         */

        /// <summary>
        /// Solves Cauchy problem on orthogonality segment, which is determined by orthogonal system used in GetCoeffsOperator().
        /// </summary>
        /// <param name="rightSides"></param>
        /// <param name="initialValues"></param>
        /// <param name="iterCount"></param>
        /// <param name="initialCoeffs">Initial point for iteration method. It size should be equationsCount x partialSumOrder</param>
        /// <param name="nodes">Calculated approximate solution is discretized on nodes. Nodes should be inside orthogonality segment</param>
        /// <returns>Approximate solution on nodes</returns>
        protected DiscreteFunction2D[] SolveOnOrthogonalitySegment(DynFunc <double>[] rightSides, double[] initialValues,
                                                                   int iterCount, double[][] initialCoeffs, double[] nodes)
        {
            if (initialCoeffs.Length != rightSides.Length)
            {
                throw new ArgumentException("rightSides length should equal to initialCoeffs length");
            }

            // \eta(a)+\sum_{j=0}^{partialSumOrder-1}d_j\phi_{1,1+j}(t)
            var partialSumOrder = initialCoeffs[0].Length;

            _spectralOdeOperator.SetParams(rightSides, initialValues, partialSumOrder);
            var result = FixedPointIteration.FindFixedPoint(c => _spectralOdeOperator.GetValue(c), initialCoeffs, iterCount);

            return(result.Select((coeffs, j) =>
                                 new DiscreteFunction2D(
                                     nodes,
                                     _ift.Transform(new[] { initialValues[j] }.Concat(coeffs).ToArray(), nodes)))
                   .ToArray());
        }
Esempio n. 2
0
        public void FindTest()
        {
            var result = FixedPointIteration.FindFixedPoint((double x) => 0.5 * (9.0 / x + x), 1, 30);

            NUnit.Framework.Assert.AreEqual(3, result, 0.01);
        }
Esempio n. 3
0
        public void FindWithEpsTest()
        {
            var result = FixedPointIteration.FindFixedPoint((double x) => 0.5 * (9.0 / x + x), 1, 0.001, (x, y) => Math.Abs(x - y), 1000);

            NUnit.Framework.Assert.AreEqual(3, result, 0.001);
        }