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