首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个基本数学表达式简化器的实现

一个基本数学表达式简化器的实现
EN

Stack Overflow用户
提问于 2014-03-21 13:52:04
回答 2查看 360关注 0票数 4

我正在为我的calc类做一个附带项目,该项目区分了Javascript中的y=x^2这样的简单函数。为此,我将表达式解析为抽象语法树,然后硬编码派生规则,如积规则和链规则。

唯一要用到的函数是AP微积分/第一年微积分问题,所以trig,日志,指数都在发挥作用。

我的程序很好地接受了导数,但我最终得到的是以一种非常不简化的方式编写的函数。

例如,区分x^2给出了(2*(x^(2-1))),这在技术上是正确的,但是编写起来比2*x容易得多。到目前为止,我有一个基本的简化器,它基本上是反复分析树的,并应用了一些基本规则。

我的一般步骤是用递归下降来分析它。

如果当前树没有变量,则对其进行评估,并将当前节点替换为结果。

否则,应用大量的if语句来简化它。包括这样的东西

  • 如果要乘以零,则将表达式替换为零。
  • 如果要乘一个,则用另一个操作数替换该表达式。
  • 如果要提高到零的幂,请用1替换表达式。

以此类推。如果我真的想得到任何真正的简化,像合并一样的术语,这将很快失去控制。另外,如果我想确定任何两个表达式是否等价,最好的解决方案就是在函数的域中生成随机数,看看它们是否相等。然而,这似乎不太有效。

我如何更有效地确定两个不同表达式的相等性(简单的例子是x+22+x),有没有一种方法可以在没有大量if语句的情况下简化函数?

EN

回答 2

Stack Overflow用户

发布于 2014-08-22 00:02:57

我实际上正在开发一个使用二叉树的计算机代数系统。它有一个比较函数来确定两个表达式(树)在数学上是否相等,以便将它们分解。例如:

  • sin(x+1) + sin(1+x) = 2*sin(x+1)
  • 不能添加sin(x-1)和sin(1-x)
  • X+ x^2 = x*(1+x)

算法是这样的:

每个节点都签署了一个侧(左或右)。搜索树中的每个操作符,如果是+或*,则子节点的两边并不重要。但是,如果运算符是/,则^或-儿童的两侧都很重要。在除法中,谁是分子,谁是分母。因此,使用这个算法,x+2将等于2+x。

对不起我的英语不好:P

票数 0
EN

Stack Overflow用户

发布于 2015-12-13 20:02:35

我将在下面的一系列步骤中解决这个问题

  1. 用“规范”的方式编写所有多项式节点
    • 例如,通过使用字典顺序和程度对它们的单引号进行排序(这样1 + x总是被表示为x + 1,等等)

  1. 以“规范”的方式编写所有rational节点
    • 有理表达式是两个多项式的商,所以这里使用1。

  1. 拥有每个特定函数的标识列表
    • 例如,ln(xy) = ln(x) + ln(y)等。

  1. 有一个内射性降低的列表
    • 例如,sin x = sin y当且仅当x = y + 2*k*Pi对于kln(x) = ln(y)的某些整数值,当且仅当x = y等。

  1. 等。

这些只是几个让你开始的想法。这个项目很有雄心。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22560721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档