我正在为我的 calc 类开发一个辅助项目,以区分像y=x^2
Javascript 中的简单函数。为此,我将表达式解析为抽象语法树,然后硬编码衍生规则,如乘积规则和链规则。
唯一会用到的函数是 AP 微积分/第一年的微积分问题,所以三角函数、对数、指数都在起作用
我的程序很好地采用了导数,但我最终得到的是以一种荒谬的简单方式编写的函数。
例如,微分x^2
给出(2*(x^(2-1)))
,这在技术上是正确的,但可以更容易地写成 2*x。到目前为止,我有一个基本的简化器,它基本上重复分析树,并应用一些基本规则。
我的一般程序是用递归下降来分析它。
如果当前树没有变量,则评估它并用结果替换当前节点。
否则,应用大量 if 语句来简化它。这包括像
- 如果要乘以零,请将表达式替换为零
- 如果要乘以 1,请将表达式替换为另一个操作数
- 如果您要提高到 0 的幂,请将表达式替换为 1。
等等等等。如果我真的想要进行任何真正的简化,比如组合类似的术语,这将很快失控。另外,如果我想确定任何两个表达式是否等价,我最好的解决方案是在函数的域中简单地生成随机数,看看它们是否相等。然而,这似乎不是很有效。
我怎样才能更有效地确定两个不同表达式的相等性(一个简单的例子是x+2
and 2+x
),有没有办法在没有大量 if 语句的情况下简化函数?