private async Task RefreshPlot(Math.Expression func, double from, double to) { _ctx.Points.Clear(); await Task.Run(() => { for (var i = from; i <= to; i++) { func.addArguments(new Math.Argument($"x = {i}")); _ctx.Points.Add(new DataPoint(i, func.calculate())); func.removeAllArguments(); } }); FuncPlot.InvalidatePlot(); }
/** * Constructor for function definition in natural math language, * for instance providing on string "f(x,y) = sin(x) + cos(x)" * is enough to define function "f" with parameters "x and y" * and function body "sin(x) + cos(x)". * * @param functionDefinitionString Function definition in the form * of one String, ie "f(x,y) = sin(x) + cos(x)" * @param elements Optional elements list (variadic - comma separated) * of types: Argument, Constant, Function * * @see PrimitiveElement * */ public Function(String functionDefinitionString, params PrimitiveElement[] elements) : base(Function.TYPE_ID) { parametersNumber = 0; if (mXparser.regexMatch(functionDefinitionString, ParserSymbol.functionDefStrRegExp)) { HeadEqBody headEqBody = new HeadEqBody(functionDefinitionString); this.functionName = headEqBody.headTokens[0].tokenStr; functionExpression = new Expression(headEqBody.bodyStr, elements); functionExpression.setDescription(headEqBody.headStr); if (headEqBody.headTokens.Count > 1) { Token t; for (int i = 1; i < headEqBody.headTokens.Count; i++) { t = headEqBody.headTokens[i]; if (t.tokenTypeId != ParserSymbol.TYPE_ID) functionExpression.addArguments(new Argument(t.tokenStr)); } } parametersNumber = functionExpression.getArgumentsNumber() - countRecursiveArguments(); description = ""; addFunctions(this); } else { functionExpression = new Expression(); functionExpression.setDescription(functionDefinitionString); String errorMessage = ""; errorMessage = errorMessage + "\n [" + functionDefinitionString + "] " + "--> pattern not mathes: f(x1,...,xn) = ... reg exp: " + ParserSymbol.functionDefStrRegExp; functionExpression.setSyntaxStatus(Expression.SYNTAX_ERROR_OR_STATUS_UNKNOWN, errorMessage); } }
/** * Constructor - creates function from function name, * function expression string and argument names. * * @param functionName the function name * @param functionExpressionString the function expression string * @param argumentsNames the arguments names (variadic parameters) * comma separated list * * @see Expression */ public Function(String functionName ,String functionExpressionString ,params String[] argumentsNames) : base(Function.TYPE_ID) { if (mXparser.regexMatch(functionName, ParserSymbol.nameOnlyTokenRegExp)) { this.functionName = functionName; functionExpression = new Expression(functionExpressionString); functionExpression.setDescription(functionName); foreach (String argName in argumentsNames) functionExpression.addArguments(new Argument(argName)); parametersNumber = argumentsNames.Length - countRecursiveArguments(); description = ""; addFunctions(this); } else { parametersNumber = 0; description = ""; functionExpression = new Expression(""); functionExpression.setSyntaxStatus(SYNTAX_ERROR_OR_STATUS_UNKNOWN, "[" + functionName + "]" + "Invalid function name, pattern not matches: " + ParserSymbol.nameTokenRegExp); } }