/// <summary> /// Обратное вейвлет-преобразование указанной функции /// </summary> /// <param name="F"></param> /// <returns></returns> /// <remarks>Сам несобственный интеграл считается параллельно, так что рисовать эту функцию лучше последовательно, что ввиду мемоизации будет раз в 6 быстрее, чем рисовать параллельно и считать последовательно</remarks> public Func <double, double> GetSyntesis(Func <double, double, Complex> F = null) { //вычисление коэффициента С //надо добавить какое-нибудь ограничение на <inf Complex C = Ccoef; //tex:$ f(t) =\dfrac{1}{C} \int_{R_* \times R} Wf(a,b) \psi_{a,b}(t) \dfrac{da db}{a^2}$ Func <double, double> GetRes(Func <Point, Complex> func) => (double t) => (MathNet.Numerics.Integration.GaussLegendreRule.Integrate((x, y) => (this.Mother((t - y) / x) * func(new Point(x, y)) / x / x).Re, 0.01, 3, -8, 8, 96) / C).Re / 2; //(DefInteg.DoubleIntegralIn_FULL( // (Point p) => (this.Mother((t - p.y) / p.x) * func(p) / p.x / p.x).Re, // eps: eps, // parallel: true, // M: DefInteg.Method.GaussKronrod61, changestepcount: 0, a: 1, b: 10) / C).Re; //задание промежуточных переменных if (F != null) { Memoize <Point, Complex> f = new Memoize <Point, Complex>((Point p) => F(p.x, p.y)); return(GetRes(f.Value)); } else { return(GetRes(p => ResultMemoized(p.x, p.y))); } }
private Func <double, double, Complex> MemoizeAndReturn(Func <double, double, Complex> s) { Resultmems = new Memoize <Point, Complex>((Point p) => s(p.x, p.y)); ResultMemoized = new Func <double, double, Complex>((double a, double b) => Resultmems.Value(new Point(a, b))); return(ResultMemoized); }