我正在为我的calc类做一个附带项目,该项目区分了Javascript中的y=x^2这样的简单函数。为此,我将表达式解析为抽象语法树,然后硬编码派生规则,如积规则和链规则。
唯一要用到的函数是AP微积分/第一年微积分问题,所以trig,日志,指数都在发挥作用。
我的程序很好地接受了导数,但我最终得到的是以一种非常不简化的方式编写的函数。
例如,区分x^2给出了(2*(x^(2-1))),这在技术上是正确的,但是编写起来比2*x容易得多。到目前为止,我有一个基本的简化器,它基本上是反复分析树的,并应用了一些基本规则。
我的一般步骤是用递归下降来分析它。
如果当前树没有变量,则对其进行评估,并将当前节点替换为结果。
否则,应用大量的if语句来简化它。包括这样的东西
以此类推。如果我真的想得到任何真正的简化,像合并一样的术语,这将很快失去控制。另外,如果我想确定任何两个表达式是否等价,最好的解决方案就是在函数的域中生成随机数,看看它们是否相等。然而,这似乎不太有效。
我如何更有效地确定两个不同表达式的相等性(简单的例子是x+2和2+x),有没有一种方法可以在没有大量if语句的情况下简化函数?
发布于 2014-08-22 00:02:57
我实际上正在开发一个使用二叉树的计算机代数系统。它有一个比较函数来确定两个表达式(树)在数学上是否相等,以便将它们分解。例如:
算法是这样的:
每个节点都签署了一个侧(左或右)。搜索树中的每个操作符,如果是+或*,则子节点的两边并不重要。但是,如果运算符是/,则^或-儿童的两侧都很重要。在除法中,谁是分子,谁是分母。因此,使用这个算法,x+2将等于2+x。
对不起我的英语不好:P
发布于 2015-12-13 20:02:35
我将在下面的一系列步骤中解决这个问题
1 + x总是被表示为x + 1,等等)
ln(xy) = ln(x) + ln(y)等。
sin x = sin y当且仅当x = y + 2*k*Pi对于k或ln(x) = ln(y)的某些整数值,当且仅当x = y等。
这些只是几个让你开始的想法。这个项目很有雄心。
https://stackoverflow.com/questions/22560721
复制相似问题