【问题标题】:How to manipulate mathematical symbols?如何操作数学符号?
【发布时间】:2011-07-17 14:56:05
【问题描述】:

这更像是一个“教育”问题。 :)

虽然,我最终可能想做这样的事情。

所以,假设我有一个方程式。可以是任何方程,只要不是荒谬的,并且是一个擅长数学的人都可以解。

假设... 0 = (x-1)(x+2)

或... y = (x^2), y = 1/x

或者正弦函数等。基本上,就像我们在学校做的那样做数学。

问题是,我将如何编写一个计算机程序来解决这个问题?我知道这是可能的,因为 Mathematica、Maple 等程序已经这样做了几十年!但我找不到任何关于如何制作简单方程求解器的好的文档。

我不希望答案告诉我“这正是你的做法”,因为这样的事情当然是一个完整的大程序,而不仅仅是一个代码 sn-p。

但只是一般概述,或一些好的文档的链接?那太好了!谢谢:)

尤其是所需的数据结构和算法。

如果做不到这一点,我只需要弄清楚我是如何求解方程的,然后对其进行编码。但这确实需要几个月的时间才能做到正确(我以前做过这种事情,将我自己的思维过程形式化为代码,它有效但速度很慢)。

【问题讨论】:

  • 这是一个非常棘手的问题……什么是人类“擅长数学”?学校形式和国家之间的“学校数学”差异很大......当然,如果您将自己限制在应该可行的二次方程中。 Mathematica 处理复杂性的部分方式似乎是如何将 everything 转换为列表列表,以至少以连贯的方式表示方程。例如。 0=(x-1)(x+2) 将是 Equals(0,Product(Sum(x,-1),Sum(x,+2))) 或类似...

标签: math equation-solving


【解决方案1】:

看看symbolic manipulation上的一些论文。

Peter Norvig 的 PAIP 书涵盖了一个非常简单的系统,用于符号操作和方程求解,因此值得一读。它介绍了名为MacSyma 的人工智能程序的基础知识,该程序最终形成了Mathematica 的基础。

【讨论】:

  • 彼得·诺维格是个天才。人写的任何东西都值得一看。我很乐意提供更多,但 +1 是他们所允许的。感谢您发布它。
  • 我强烈推荐 PAIP。我通过将 Common LISP 中的示例转换为类似于 Clojure 的东西来学习 Clojure。从那本书中学到的东西比我看过的任何其他教科书都多。
【解决方案2】:

Wolfram Alpha 将是您最容易获得的基准。

您的输入是字符串,因此第一步是编写一个词法分析器/解析器将这些字符串分解为标记并将它们放入抽象语法树 (AST)。

你没有说你想用什么语言来实现它,但我建议你看看ANTLR。它是一个解析器生成器,可以帮助您创建 AST。你必须为你的方程想出一个语法。

拥有 AST 后,您的求解器将遍历树并将更具体的操作与“+”、“-”等符号相关联。您可以处理的操作符越多,您的求解器就会越强大和包罗万象是。

但是您必须处理或排除很多复杂性:

  1. 并非所有方程都有解。
  2. 并非所有方程都有闭式解。
  3. 并非所有方程都是线性的。
  4. 许多有趣的问题由许多耦合方程组成(想想线性代数)。
  5. 很多人需要了解很多关于数值方法的知识,以应对封闭式表格失败的情况。

我建议您从简单的算术和多项式开始,然后逐步提高。 Stephen Wolfram 不是一天写出来的。

【讨论】:

    【解决方案3】:

    基本技术是在计算机程序中表示数学方程的结构。这与编译器所做的想法非常相似,但编译器大多将其输入转换为机器可读格式,但计算机代数系统大多产生与其输入相同格式的输出,但以某种有趣的方式进行转换。在任何一种情况下,立即输出都是抽象语法树。下一步将应用一些模式匹配技术(类似于正则表达式的工作原理)以及一些机械转换,以某种有用的方式重写树。

    如果您想了解这实际上是如何完成的,SymPy 是一个 Python 符号数学库,它既是开源的,又恰好主要关注主题的符号操作方面。

    【讨论】:

    • 谢谢。我来看看 SymPy。
    【解决方案4】:

    除了其他人的有用答案:此链接似乎很有趣:http://en.wikipedia.org/wiki/Pattern_matching 此外,“抽象树语法”似乎很有趣。基本上,它是关于在语法树上进行“模式匹配”!有点像正则表达式,但用于代码。

    我实际上已经编写了自己的“抽象树语法”:) 所以我已经在通往符号操纵器的道路上走了一点路。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多