从被问到这个问题的八年后:如果你不想重新发明轮子,那里有许多奇特的数学解析器。
我几年前写过一个,它支持算术运算、方程求解、微积分、积分、基本统计、函数/公式定义、绘图等。
它被称为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 由我编写。