示例#1
0
        /// <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)));
            }
        }
示例#2
0
 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);
 }