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