private double FreshetByYCoreFunction(double t, double k)
        {
            double H       = IntegralEquationDiscretezer.CalculateDiscreteStep(PointsNumber);
            double coreSum = 0;
            double sj      = 0;

            for (int j = 0; j < PointsNumber; j++)
            {
                double x = InnerCurve.GetX(sj), y = InnerCurve.GetY(sj),
                       dx = InnerCurve.GetDerivetiveX(sj), dy = InnerCurve.GetDerivetiveY(sj);

                double denominator = x * x + y * y
                                     + Radius * Radius - 2.0 * x * Radius * Math.Cos(t)
                                     - 2.0 * y * Radius * Math.Sin(t);
                double firstTerm = -(x * x + y * y - Radius * Radius)
                                   * (2.0 * y - 2.0 * Radius * Math.Sin(t))
                                   / (2.0 * Math.PI * Radius * Math.Pow(denominator, 2));
                double secondTerm       = y / (Math.PI * Radius * denominator);
                double result           = (firstTerm + secondTerm) / 2.0;
                double derivetiveNorm   = dx * dx + dy * dy;
                double dataEquationCore = DataEquationOperatorCore(new Point(Radius * Math.Cos(t), Radius * Math.Sin(t)),
                                                                   new Point(x, y));
                coreSum += (2.0 * Math.PI / PointsNumber) * Density[j]
                           * (result * Math.Cos(k * sj) + dataEquationCore * dy * ChebishevPolDerivative(k, sj) / derivetiveNorm);// додано двійку без формули 2.0 * dataEquationCore

                //coreSum += (2.0 * Math.PI / PointsNumber) * Density[j]
                //    * (result * Math.Cos(k * sj));
                sj += H;
            }
            return(coreSum);
        }
예제 #2
0
        public double[] CalculateDensity()
        {
            IntegralEquationDiscretezer discretezer = new IntegralEquationDiscretezer(
                _state.PointsNumber,
                _state.DirectProblemCore,
                _state.RightPartFunction);

            double[,] matrix;
            double[] rightPart;
            discretezer.FormDiscreteEquation(out matrix, out rightPart);

            SystemOfLinearEquations systemSolver = new SystemOfLinearEquations();

            double[] density = systemSolver.LU_methodSolving(matrix, rightPart, rightPart.Length);

            return(density);
        }
        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++;
            }
        }