出于我想要做的目的,我需要将用户输入作为字符串并将其转换为未评估的函数。例如,如果用户输入是“x ^ 2 * sin(x)”,我需要一个带有双输入x并返回的函数
owl:sameAs
我需要这个函数,我不能传入x的值,我会多次调用该函数(可能数百个)所以每次进行计算时我都无法解析字符串。
我该如何实现?我从问题Convert a string into mathematical equation?中得出结论,没有标准的方法来做到这一点。但我对如何“保存”数学公式有点迷失,有没有办法用数学表达式创建委托?
至少,我需要它来识别基本代数方程,幂,指数和触发函数。此外,虽然我使用了单个变量x的函数示例,但我希望能够解析多个变量的函数。
答案 0 :(得分:3)
基本上,您需要实现自己的语法分析器并将输入字符串转换为Expression Tree。
答案 1 :(得分:0)
我最终使用NCalc。我传入了用户的字符串表达式,用我正在评估的值替换变量,然后使用Evaluate方法并解析为double。
private double Function(double t, double y)
{
NCalc.Expression expression = new NCalc.Expression(this.Expression);
expression.Parameters["t"] = t;
expression.Parameters["y"] = y;
double value;
double.TryParse(expression.Evaluate().ToString(), out value);
return value;
}
例如,假设输入t = .5和y = 1且表达式为“4 * y + Tan(2 * t)”,我们将评估字符串“4 * 1 + Tan(2 * .5) “使用NCalc。
它并不完美,如果NCalc无法解析用户的字符串或函数的数据类型不同,则抛出异常。我正在研究它。