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