【发布时间】:2012-04-08 01:06:14
【问题描述】:
我正在做一些数值分析作业,我应该评估、绘制和区分数学表达式。除其他外。我用 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对于所有不同的乘法情况,依此类推。 这需要代表我进行大量分析,并且可能无法涵盖所有情况——请记住,乘法并不是唯一需要的函数——。
任务是:给定一个表达式树,我怎样才能对它进行基本的归约?如果您可以向我推荐任何可以解决此问题的链接或论文——最好是在优雅的 OO 方式 - 或者如果您之前解决过它,您的帮助将真的感激。
【问题讨论】:
-
实际上,您需要实施很多规则,而忘记涵盖所有情况。您需要的是以前做过这件事的人(不是我)的经验,它可以告诉您一种明智的 OOP 设计(结合例如策略、访问者、复合等)。不过,恕我直言,你最好使用函数式语言。
-
好的,感谢您的快速回复。这就是我要寻找的“以前做过这件事的人”。我不允许使用除 Java 之外的任何东西。 :)
-
你选择了(或被交给了)一个相当困难的问题。这个issc.uj.ac.za/symbolic/symbolic.html 可能会有所帮助。
标签: java math expression composite