我正在做一些數值分析任務,我應該評估,繪製和區分數學表達式。其他的東西。我使用Java實現了表達式樹。如何將數學表達式樹轉換爲簡化形式?
到目前爲止,我可以構建表達式樹,用Latex顯示它,評估它,繪製它並得到它的導數。是樹中複合函數實現的接口有以下幾種方法: Function[] child();
void addChild(Function chld);
double evaluate(HashMap subMap);
String toLatex();
int precedence();
Function derivative();
目前我編碼的實現是:Constant, Variable, Add, Subtract, Multiply, Divide, Power, Sine, Cosine, Ln
。
現在,當我區分一些基本功能時,我得到它在一個非簡化的形式:
d/dx(x^2) ===> x^2 * (1 * 2/x + 0 * ln(x))
這是因爲衍生工具以最一般的方式實施。
我想到的解決方案是,在樹中每個節點f
的構建中,給出f
的孩子,我遞歸地減少孩子,然後做一些天真的重建。經過這樣的重建之後,孩子們在「一起」減少了f
。
例如,給定的表達式0 * x,則樹應該看起來像:
* /\ 0 x
在*節點的結構,如果它的一個子是零不變,*節點成爲零恆定。當然會拋棄它的孩子。
0
等乘法的所有不同情況。 這需要我進行大量分析,可能無法涵蓋所有情況 - 請記住,乘法不是唯一需要的功能 - 。
任務是:給出了一個表達式樹,我該如何做基本的還原呢?如果您可以將任何鏈接或論文提交給此問題的解決方案 - 最好採用優雅的OO方式 - 或者如果您之前已經解決了這個問題,那麼您的幫助應該是真的讚賞。
其實,你需要實施很多規則,並忘記覆蓋所有情況。你需要的是來自以前做過這件事的人的經驗(不是我),並且可以告訴你一個明智的** OOP設計**(結合戰略,訪客,複合等)。恕我直言,你最好使用功能語言。 – 2012-03-23 13:38:48
恩,謝謝你的快速回應。這就是我要找的**「之前做過這些的人」**。 我不能使用Java以外的任何東西。 :) – MSiddeek 2012-03-23 13:43:48
你選擇了(或者已經交給)一個相當難的問題。這個http://issc.uj.ac.za/symbolic/symbolic.html可能有幫助。 – 2012-03-23 16:08:31