2014-02-27 59 views
0

我想使用區間算法來計算給定方程的範圍。例如,C = f(A,B)其中解析Java中的數學方程

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.所以,我需要在每一步控制,以便我可以找到目前評估的表達式的範圍。

任何指針表示讚賞。

+1

有可能是你可以借用[調度場算法]的實現(http://en.wikipedia.org/wiki/Shunting-yard_algorithm)。這應該讓你開始着手評估大部分表達。 –

+0

你可能會檢查[ANTLR](http://www.antlr.org) – user3334690

回答

-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"); 
+0

感謝您的意見。但是我想知道在評估表達式的過程中知道每一步。例如,如果f = A + B(1-C)。軟件首先計算1-c,然後計算B *(1-C),然後將它添加到A.所以,我需要在每一步都進行控制,以便我可以找到迄今評估的表達式的範圍。如果我清楚,請告訴我。 – TechCrunch

+0

是的,你很清楚。我同意David Ehrmann的說法,調車場算法對此最好。您可能想要編輯該問題。 – PlasmaPower