将用户输入的字符串转换为数学函数

Turn user input string into mathematical function

出于我想要执行的目的,我需要将用户输入作为字符串并将其转换为未计算的函数。例如,如果用户输入是 "x^2*sin(x)" 我需要一个接受双输入 x 并返回

的函数

Math.Pow(x, 2)*Math.Sin(x)

我需要这个函数,但我不能为 x 传递一个值,而且我会多次调用这个函数(可能有数百次),所以我无法在每次进行计算时都解析该字符串。

我将如何实施?我从问题 Convert a string into mathematical equation? 中得出结论,没有标准的方法可以做到这一点。但是我对如何 "save" 一个数学公式有点迷茫,有没有办法用数学表达式创建一个委托?

至少,我需要它来识别基本的代数方程、幂、指数和三角函数。另外,虽然我用的是单变量x的函数的例子,但我希望能够解析多变量的函数。

本质上,您需要实现自己的语法分析器并将输入字符串转换为 Expression Tree.

我最终使用了 NCalc。我传入了用户的字符串表达式,用我正在评估的值替换了变量,然后使用 Evaluate 方法并解析为双精度值。

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 无法解析用户的字符串或函数的数据类型不同,则会抛出异常。我正在完善它。