【问题标题】:Turn user input string into mathematical function将用户输入字符串转换为数学函数
【发布时间】:2015-09-01 13:37:19
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: c# math symbolic-math


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我最终使用了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 无法解析用户的字符串或者函数的数据类型不同,NCalc 会抛出异常。我正在打磨它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 2013-03-09
      • 2011-03-16
      • 1970-01-01
      相关资源
      最近更新 更多