[英]Java: solving symbolic algebraic equations
我无法将此功能添加到我的计算器应用程序中。 这是我的想法:
我想解决: 2x = 5 + 4x
。
为了解决这个问题,如果我使用外部令牌库来解析方程,那是没有问题的,但是由于我的整个程序是围绕一个分流码解析器 (EXP4J) 构建的,所以它使事情变得复杂。 你可能会说我可以只在特定情况下使用令牌解析器,但是当你考虑到我有使用 EXP4J 的 FUNCTIONS 时,它变得非常纠结。
因此,虽然我可以通过简单地在这种特定情况下交替使用令牌解析器来使其适用于2x = 5 + 4x
,但使用 EXP4J 的计算,例如:
2x = 5*exp4jfunc(x + 5,x) + cos(x)
完全超出我的范围。
有没有人知道如何解决这个问题? 我什至不知道我的卡西欧是如何解决这个问题的,因为它冻结在求解x = 9^x
这样的 x 方程上......
使用symja 库,您可以像这样解决您的问题:
package org.matheclipse.core.examples;
import org.matheclipse.core.eval.ExprEvaluator;
import org.matheclipse.core.interfaces.IExpr;
import org.matheclipse.parser.client.SyntaxError;
import org.matheclipse.parser.client.math.MathException;
public class Solve2Example {
public static void main(String[] args) {
try {
ExprEvaluator util = new ExprEvaluator();
IExpr result = util.evaluate("Solve(2*x==5 + 4*x,x)");
// print: {{x->-5/2}}
System.out.println(result.toString());
result = util.evaluate("Roots(2*x==5+4*x, x)");
// print: x==-5/2
System.out.println(result.toString());
} catch (SyntaxError e) {
// catch Symja parser errors here
System.out.println(e.getMessage());
} catch (MathException me) {
// catch Symja math errors here
System.out.println(me.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}
您可以查看Roots() 函数的实现,它是如何转换解析后的 AST 来求解方程的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.