【问题标题】:Parsing mathematical equation in Java在 Java 中解析数学方程
【发布时间】:2014-02-27 21:13:50
【问题描述】:

我想使用区间算术来计算给定方程的范围。例如,C = f(A, B) 其中

f = -12.5 * log10 ( 1 + ( 0.64*( 1-cos(A) )/( 1-cos(B/4) ))

我会给出 A 和 B 的范围作为输入和一个包含 f 的字符串。我拥有的区间算术库可以计算 f = log A 等简单函数的范围。因此,要计算上述函数的范围,我必须手动编写多个步骤,例如首先找到 cos(A),然后 1 - cos(A)依此类推,直到我得到整个方程的范围。我试图找出是否有办法解析这个方程,可能会得到解析器在计算过程中计算的步骤,这样在每一步,我都可以找到一个范围,让解析器进入下一步。

为了更清楚,我想知道表达式求值过程中的每一步。例如,如果 f = A + B (1-C)。软件首先计算 1-c,然后计算 B * (1-C),然后将其添加到 A。因此,我需要控制每一步,以便找到迄今为止评估的表达式的范围。

感谢任何指针。

【问题讨论】:

  • 您可能可以借用shunting yard algorithm 的实现。这应该让您开始可以评估大部分表达式。​​
  • 您可以查看ANTLR

标签: java parsing math integer-arithmetic


【解决方案1】:

我更喜欢这样:

import javax.script.*;


ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
try {
     // evaluate JavaScript code for evaluating formulas
     Object result = engine.eval(formula);
     System.out.println(result);
} catch (ScriptException ex) {
    System.out.println("Something went wrong. Was your syntax invalid?");
}

注意log10必须替换成Math.log10,赋值运算符必须去掉。这应该不太难实现,比如

String formula = input.substring(intput.indexOf("=") + 1).replace("log10","Math.log10").replace("cos","Math.cos");

【讨论】:

  • 感谢您的意见。但我想知道表达式评估过程中的每一步。例如,如果 f = A + B (1-C)。软件首先计算 1-c,然后计算 B * (1-C),然后将其添加到 A。所以,我需要控制每一步,这样我才能找到到目前为止评估的表达式的范围。如果我清楚,请告诉我。
  • 是的,你很清楚。我同意 David Ehrmann 的观点,调车场算法最适合这一点。您可能想要编辑问题。
猜你喜欢
  • 2020-05-31
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
相关资源
最近更新 更多