示例#1
0
        /// <summary>
        /// Вычисление интеграла
        /// </summary>
        /// <param name="f">Функция для интегрирования</param>
        /// <returns>Удельную енергию, значение интеграла</returns>
        protected override double processFunction(Common.Function f)
        {
            double   energy = 0;
            int      i      = 0;
            DateTime start  = DateTime.Now;
            TimeSpan time   = DateTime.Now - start;

            while (i < maxCount && time.Milliseconds < maxTime)
            {
                double x = f.minX + (f.maxX - f.minX) * rand.NextDouble();
                energy += Math.Pow(f.getValue(x), 2);
                i++;
                if (i % 1000 == 0)
                {
                    time = DateTime.Now - start;
                }
            }

            return(energy / i);
        }
示例#2
0
        protected override Common.Function processFunction(Common.Function f)
        {
            Complex[] input = new Complex[f.Length];
            Complex[] output;

            for (int i = 0; i < f.Length; i++)
            {
                input[i] = new Complex(f[i], 0);
            }

            output = DFT(input, Direction.Forward);

            Common.Function resultFunction = new Common.Function();
            resultFunction.setup(f.minX, f.maxX, f.step * 10);

            for (int i = 0; i < Math.Min(output.Length, resultFunction.Length); i++)
            {
                resultFunction[i] = output[i].Magnitude * 2;
            }

            //обрезать края функции, где значения меньше, чем 1/100 от максимального значения функции

            if (resultFunction.Length < 1)
            {
                throw new Exception("Wrong result of DFT");
            }
            double maxValue = resultFunction[0];

            for (int i = 1; i < resultFunction.Length; i++)
            {
                maxValue = Math.Max(maxValue, resultFunction[i]);
            }

            int begin = -1, end = 0;

            for (int i = 0; i < resultFunction.Length; i++)
            {
                if (resultFunction[i] > maxValue / 100)
                {
                    if (begin < 0)
                    {
                        begin = i;
                    }
                    end = i;
                }
            }

            if (begin == end)
            {
                if (begin > 0)
                {
                    begin--;
                }
                else
                {
                    if (end + 1 >= resultFunction.Length)
                    {
                        throw new Exception("Error in DFT result cutting");
                    }
                    end++;
                }
            }

            Common.Function cuttedResult = new Common.Function();
            cuttedResult.setup(begin * resultFunction.step, end * resultFunction.step, resultFunction.step);
            for (int i = begin; i <= end && i - begin < cuttedResult.Length; i++)
            {
                cuttedResult[i - begin] = resultFunction[i];
            }

            return(cuttedResult);
        }