我无法将此功能添加到我的计算器应用中。这就是我的想法:
我想解决:2x = 5 + 4x
。
要解决这个问题,如果我使用外部令牌库来解析方程式是没有问题的,但由于我的整个程序是围绕一个分流码解析器(EXP4J)构建的,因此它会使事情复杂化。您可能会说我可以只使用令牌解析器来处理特定情况,但是当您考虑使用EXP4J我有FUNCTIONS时,它会变得非常纠结。
所以,虽然我可以通过简单地为这个特定情况交替使用令牌解析器来使它适用于2x = 5 + 4x
,但使用EXP4J的计算,如:
2x = 5*exp4jfunc(x + 5,x) + cos(x)
完全超出我的范围。
有没有人知道如何解决这个问题?我甚至不知道我的CASIO如何处理这个问题,因为它冻结了像x = 9^x
这样的求解x方程...
答案 0 :(得分:1)
使用symja library,您可以像这样解决问题:
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() function的实现,如何转换已解析的AST来解决方程式。
答案 1 :(得分:1)
我对exp4j并不熟悉......鉴于Expression
类似乎没有提供对解析结构的大量访问,因此使用exp4j时,符号方法似乎并不可行。
您可以尝试使用exp4j:
将等式=
拆分为left
和right
建立一个双方差异的新方程式:
String diff = "(" + left + ") - (" + right + ")"
使用exp4j
diff
使用数值方法(例如Secant method)与setVariable()
和evaluate()
查找解决方案。
无耻插件:如果您考虑使用其他解析器,请查看this one
答案 2 :(得分:-1)
首先,定义方程的域。你在谈论线性方程,多项式,一般非线性方程,微分方程吗?然后定义你的维度:你有一个变量还是多个?最后,选择合适的求解器(数字,符号,高斯,牛顿等)。
一旦定义了这个,就需要将exp4j的语法树转换为求解器所需的格式。但是,似乎您无法使用exp4j执行此操作,因为它不会将表达式的结构公开为API。
我建议使用适当的AST。如果你不能这样做,你可以看到in the implementation,内部结构基本上只是一个令牌列表。