public double[] BuildSolutionDerivativeOnOuterCurve(double[] density)
        {
            var descretePoints     = IntegralEquationDiscretezer.GetDiscretePoints(PointsNumber);
            var solutionDerivative = new double[descretePoints.Length];

            for (int i = 0; i < descretePoints.Length; i++)
            {
                var core = new DoubleCore <Point>(DataEquationOperatorCore);
                core.Prepare(new Point(
                                 OuterCurve.GetX(descretePoints[i]),
                                 OuterCurve.GetY(descretePoints[i])));

                solutionDerivative[i] = Integral.CalculateWithTrapeziumMethod(density, core)
                                        + Omega1(descretePoints[i]);
            }

            return(solutionDerivative);
        }
        public void CalculateCurve()
        {
            if (_state.DerivativeOnOuterCurve == null)
            {
                // Solver is in testing mode
                // Find derivative
                var initialInnerCurve = _state.InnerCurve;
                _state.InnerCurve = _state.InversProblemTestData.CorrectInnerCurve;
                DirectProblemSolver solver  = new DirectProblemSolver(_state);
                double[]            density = solver.CalculateDensity();
                Printer.WriteLine("Correct density:");
                Printer.Write(density);
                _state.DerivativeOnOuterCurve = _state.BuildSolutionDerivativeOnOuterCurve(density);
                Printer.WriteLine("Derivetive on outer curve:");
                Printer.Write(_state.DerivativeOnOuterCurve);

                // change initial state back
                _state.InnerCurve = initialInnerCurve;
            }

            double[] points = IntegralEquationDiscretezer.GetDiscretePoints(_state.PointsNumber);
            Printer.WriteLine("Innitial inner curve X:");
            Printer.Write(GetCurveValues(_state.InnerCurve, points, onX: true));
            Printer.WriteLine("Innitial inner curve Y:");
            Printer.Write(GetCurveValues(_state.InnerCurve, points, onX: false));

            bool innerCurveFound = false;
            int  iteration       = 0;

            while (iteration < 6)
            {
                Printer.WriteLine($"ITERATION {iteration} ................................");
                DirectProblemSolver solver = new DirectProblemSolver(_state);
                _state.Density = solver.CalculateDensity();
                Printer.WriteLine("Calculated density");
                Printer.Write(_state.Density);

                var curveCorrection = CalculateCurveCorrection();
                Printer.WriteLine("Correction coefficients");
                Printer.Write(curveCorrection);
                var correctedCurve = BuildNewCurve(_state.InnerCurve,
                                                   new ArraySegment <double>(curveCorrection, 0, _state.CorrectionPolinomPower + 1),
                                                   new ArraySegment <double>(curveCorrection, _state.CorrectionPolinomPower + 1,
                                                                             _state.CorrectionPolinomPower + 1));
                // TODO calculate exit conditiona

                Printer.WriteLine("Correct curve X");
                Printer.Write(GetCurveValues(_state.InversProblemTestData.CorrectInnerCurve, points, onX: true));
                Printer.WriteLine("Solution curve x");
                Printer.Write(GetCurveValues(correctedCurve, points, onX: true));
                Printer.WriteLine("Solution curve x pol coeffients");
                Printer.Write((correctedCurve as ApproxParametrizedCurve)._xApproxPolinom.Coefficients.ToArray());
                Printer.WriteLine("Correct curve y");
                Printer.Write(GetCurveValues(_state.InversProblemTestData.CorrectInnerCurve, points, onX: false));
                Printer.WriteLine("Solution curve y");
                Printer.Write(GetCurveValues(correctedCurve, points, onX: false));
                Printer.WriteLine("Solution curve y pol coeffients");
                Printer.Write((correctedCurve as ApproxParametrizedCurve)._yApproxPolinom.Coefficients.ToArray());
                Printer.WriteLine("Correct curve derivative Y");
                Printer.Write(GetCurveDerivativeValues(_state.InversProblemTestData.CorrectInnerCurve, points, onX: false));
                Printer.WriteLine("Solution curve derivative Y");
                Printer.Write(GetCurveDerivativeValues(correctedCurve, points, onX: false));
                Printer.WriteLine("Correct curve derivative X");
                Printer.Write(GetCurveDerivativeValues(_state.InversProblemTestData.CorrectInnerCurve, points, onX: true));
                Printer.WriteLine("Solution curve derivative X");
                Printer.Write(GetCurveDerivativeValues(correctedCurve, points, onX: true));

                _state.InnerCurve = correctedCurve;
                iteration++;
            }
        }