Пример #1
0
        /// <summary>Метод определения значения</summary>
        /// <returns>Численное значение элемента выражения</returns>
        public override double GetValue(MathExpression ParametersExpression, MathExpression Function)
        {
            var parameters_root = ParametersExpression.Tree.Root;
            var iterator        = ((VariableValueNode)parameters_root.Left)?.Variable ?? throw new InvalidOperationException("Не определён узел дерева с итератором суммы");

            var interval = (IntervalNode)parameters_root.Right ?? throw new InvalidOperationException("Не определён узел дерева с интервалом значений суммы");
            var min_node = (ComputedNode)interval.Min ?? throw new InvalidOperationException("Не определён узел дерева с минимальным значением интервала суммы");
            var max_node = (ComputedNode)interval.Max ?? throw new InvalidOperationException("Не определён узел дерева с максимальным значением интервала суммы");;

            var min = min_node.Compute();
            var max = max_node.Compute();

            var sum = 0.0;

            if (min < max)
            {
                for (int i = (int)min, Max = (int)max; i < Max; i++)
                {
                    iterator.Value = i;
                    sum           += Function.Compute();
                }
            }
            else
            {
                for (int i = (int)min, Min = (int)max - 1; i >= Min; i--)
                {
                    iterator.Value = i;
                    sum           += Function.Compute();
                }
            }
            return(sum);
        }
Пример #2
0
        /// <summary>Метод определения значения</summary>
        /// <returns>Численное значение элемента выражения</returns>
        public override double GetValue(MathExpression ParametersExpression, MathExpression Function)
        {
            var x      = ParametersExpression.Variable[0];
            var x_node = ParametersExpression.Tree
                         .OfType <VariableValueNode>()
                         .First(n => ReferenceEquals(x, n.Variable));
            var interval = (IntervalNode)x_node.Parent.Right ?? throw new InvalidOperationException("Правый узел дерева не определён - невозможно рассчитать интервал значений интегрирования");
            var min_node = (ComputedNode)interval.Left ?? throw new InvalidOperationException("В левом поддереве интервала значений отсутствует элемент - невозможно определить минимальное значение интервала");
            var max_node = (ComputedNode)interval.Right ?? throw new InvalidOperationException("В правом поддереве интервала значений отсутствует элемент - невозможно определить максимальное значение интервала");;

            var min = min_node.Compute();
            var max = max_node.Compute();

            Func <double, double> f = xx =>
            {
                x.Value = xx;
                return(Function.Compute());
            };

            if (_IsAdaptive)
            {
                return(f.GetIntegralValue_Adaptive(min, max));
            }

            var dx      = ParametersExpression.Variable[$"d{x_node.Variable.Name}"];
            var dx_node = ParametersExpression.Tree
                          .OfType <VariableValueNode>()
                          .First(n => ReferenceEquals(dx, n.Variable));
            var dx_value_node = (ConstValueNode)dx_node.Parent.Right ?? throw new InvalidOperationException("Отсутствует правое поддерево у родительского элемента dx - невозможно рассчитать шаг интегрирования");

            dx.Value = dx_value_node.Value;
            return(f.GetIntegralValue(min, max, dx.GetValue()));
        }