对于任何在这篇文章发布九年后看到这个问题的人:如果你不想重复造轮子,那么有许多奇特的数学解析器可供选择。
我多年前用Java写了一个,它支持算术运算、方程求解、微积分、积分计算、基本统计、函数/公式定义、绘图等等。
它叫做ParserNG,而且是免费的。
评估表达式就像这样简单:
MathExpression expr = new MathExpression("(34+32)-44/(8+9(3+2))-22");
System.out.println("result: " + expr.solve());
result: 43.16981132075472
或者使用变量和计算简单表达式:
MathExpression expr = new MathExpression("r=3;P=2*pi*r;")
System.out.println("result: " + expr.getValue("P"))
或者使用函数:
MathExpression expr = new MathExpression("f(x)=39*sin(x^2)+x^3*cos(x);f(3)");
System.out.println("result: " + expr.solve());
result: -10.65717648378352
或者在给定点评估导数(注意:它在幕后进行符号微分(而不是数值微分),因此精度不受数值逼近误差的限制):
MathExpression expr = new MathExpression("f(x)=x^3*ln(x); diff(f,3,1)");
System.out.println("result: " + expr.solve());
result: 38.66253179403897
在x=3处对 x^3 * ln(x)
进行一阶微分。
目前可微分的次数为1。
或者对于数值积分:
MathExpression expr = new MathExpression("f(x)=2*x; intg(f,1,3)")
System.out.println("result: " + expr.solve())
result: 7.999999999998261... approx: 8
这个解析器速度相当快,而且具有许多其他功能。
免责声明:ParserNG是由我编写的。