我正在进行一些数值分析的作业,需要评估、绘制和求导数学表达式等等。 我使用Java实现了表达式树。 到目前为止,我可以构建表达式树,用LaTeX显示它,求出它的值,绘制它,并得到它的导数。在树中由复合函数实现的接口具有以下方法:
我已经编写的实现包括:Constant、Variable、Add、Subtract、Multiply、Divide、Power、Sine、Cosine和Ln。 现在,当我对某些基本函数求导时,我得到的是一个非简化形式:
这是因为导数是以最普遍的方式实现的。 我思考的解决方案是,在每个节点f的构造过程中,给定f的子节点,递归地减少子节点,然后进行一些简单的重构。 在这样的重构之后,子节点关于f被“聚合”并减少。
例如,给定表达式0 * x,则树应如下所示:
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方式--或者如果您以前处理过它,那么您的帮助将非常感激。