在Java中,我尝试查找线性方程的系数,以在计算器应用程序中找到线性方程的解,例如:
3x +2*(6x-3) = 2 -4x
我渴望得到的是x的系数和形式的常数ax+b =0
,
在这个特定的例子中
coefficient = 19
constant = -8
请提出一个概括的想法
正如已经被我的评论所说:这可以任意复杂,这取决于什么样的正是这种分析器应该支持。这里涉及到一些潜在的非常复杂和具有挑战性的任务。
第一个是解析自身。尽管它已经被很好地理解并且有支持编写解析器以及所有工具的工具,但是从头开始为这些表达式编写一个健壮,可靠的解析器将是一件很乏味的工作(并且会涉及一些工作)。
第二个是简化表达。虽然可以编写一个简单的解析器(或使用现有的解析器),但可能(乍一看)认为有必要对所生成的AST进行操作以找到实际的常数和系数-例如,人们可能会认为必须应用分布定律,找到公因子,将部分表达式从方程式的一侧移到另一侧,依此类推。
幸运的是,所有这些都是不必要的:-)
您可以使用任意解析器来解析方程式中涉及的表达式。JEP是Java解析器,这是最著名的解析器之一(这不是建议-我只是知道它,它似乎运行良好)。顾名思义,它只是一个表达式解析器,而不是一个方程式解析器。但是可以简单地在处拆分方程式=
,以获得两个可以单独解析的表达式。
这两个表达式不足以找到系数和常数。但是,这里有一个小技巧(肮脏?):您可以通过对这些表达式求值来得出系数和常数。特别是,您可以一次设置x=0
分别确定左侧和右侧的常数部分。然后,您可以设置x=1
,评估结果表达式并减去常数以获得系数。
从双方的系数和常数,您可以计算整个方程式的系数和常数。这在这里实现为MCVE:
import org.nfunk.jep.JEP;
public class LinearEquationParser
{
private double coefficient;
private double constant;
public static void main(String[] args)
{
runTest("3x = 5");
runTest("3x +2*(6x-3) = 2 -4x");
runTest("3x + 2*(6x -sin(3))=cos(2)-4*x*log(tan(43))");
}
private static void runTest(String s)
{
System.out.println("Input: "+s);
LinearEquationParser p = new LinearEquationParser();
p.process(s);
System.out.println("Coefficient: "+p.getCoefficient());
System.out.println("Constant : "+p.getConstant());
System.out.println();
}
public void process(String s)
{
JEP jep = new JEP();
jep.setImplicitMul(true);
jep.addStandardFunctions();
jep.addStandardConstants();
jep.addVariable("x", 0.0);
String s0 = s.substring(0, s.indexOf("="));
String s1 = s.substring(s.indexOf("=")+1, s.length());
jep.parseExpression(s0);
if (jep.hasError())
{
throw new IllegalArgumentException(jep.getErrorInfo());
}
jep.addVariable("x", 0.0);
double constant0 = jep.getValue();
jep.addVariable("x", 1.0);
double value0 = jep.getValue();
jep.parseExpression(s1);
if (jep.hasError())
{
throw new IllegalArgumentException(jep.getErrorInfo());
}
jep.addVariable("x", 0.0);
double constant1 = jep.getValue();
jep.addVariable("x", 1.0);
double value1 = jep.getValue();
constant = constant0 - constant1;
coefficient = (value0 - constant0) - (value1-constant1);
}
public double getCoefficient()
{
return coefficient;
}
public double getConstant()
{
return constant;
}
}
输出是,根据需要:
Input: 3x = 5
Coefficient: 3.0
Constant : -5.0
Input: 3x +2*(6x-3) = 2 -4x
Coefficient: 19.0
Constant : -8.0
Input: 3x + 2*(6x -sin(3))=cos(2)-4*x*log(tan(43))
Coefficient: 15.7024963786418
Constant : 0.13390682042740798
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句