/* * /// <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()); }
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); }
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); }