这更像是一个“教育”问题。 :)
虽然,我可能最终想做这样的事情。
所以,让我说我得到了一个等式。可以是任何类型的等式,只要它不是荒谬的,也是一个擅长数学的人,可以解决它。
假设...... 0 =(x-1)(x + 2)
或... y =(x ^ 2),y = 1 / x
或正弦函数等。基本上,像在学校一样做数学。
问题是,如何编写计算机程序来解决这个问题?我知道这是可能的,因为像Mathematica,Maple等程序已经这样做了几十年!但是我找不到任何关于如何制作简单的方程求解器的好文档。我不希望答案告诉我“这正是你做的”,因为当然这样的事情是一个完整的大型程序,而不仅仅是一个代码片段。
但只是概述,或链接到一些好的文件?那太好了!谢谢:))
特别需要的数据结构和算法。
如果做不到这一点,我只需要弄清楚我如何解决方程,并对其进行编码。但是这需要几个月的时间才能做到正确(我以前做过这种事情,将我自己的思维过程形式化为代码,它可以工作,但速度很慢)。
答案 0 :(得分:3)
Wolfram Alpha将是您最容易获得的基准。
您的输入是字符串,因此第一步是编写词法分析器/解析器以将这些字符串分解为标记并将它们放入抽象语法树(AST)中。
您没有说出要实现此功能的语言,但我建议您查看ANTLR。它是一个解析器生成器,可以帮助您创建AST。你必须为你的方程式提出一个语法。
一旦你拥有了AST,你的求解器就会走在树上,并将更具体的操作与“+”,“ - ”等符号联系起来。你可以处理的算子越多,你的解算器就会越强大,包罗万象。是
但是你需要处理或排除许多复杂问题:
我建议您从简单的算术和多项式开始,然后按照自己的方式进行操作。斯蒂芬沃尔夫勒姆在一天内没有写过Mathematica。
答案 1 :(得分:3)
查看symbolic manipulation上的一些论文。
Peter Norvig的PAIP书涵盖了一个非常简单的符号操作和方程求解系统,因此值得一读。它介绍了一个名为MacSyma的AI程序的基础知识,它最终形成了Mathematica的基础。答案 2 :(得分:1)
基本技术是在计算机程序中表示数学方程的结构。这与编译器的作用非常相似,但编译器主要将其输入转换为机器可读格式,但计算机代数系统主要生成与输入格式相同的输出,但以一些有趣的方式进行转换。在任何一种情况下,立即输出都是抽象语法树。下一步将应用一些模式匹配技术(类似于正则表达式的工作方式)以及一些机械转换,以某种有用的方式重写树。
如果你想看看这实际上是如何实现的,SymPy是一个python符号数学库,它既是开源的,也恰好主要关注主题的符号操作方面。
答案 3 :(得分:0)
除了其他人的有用答案之外:这个链接看起来很有趣:http://en.wikipedia.org/wiki/Pattern_matching,“抽象树语法”似乎很有趣。基本上,它是关于在语法树上进行“模式匹配”!有点像正则表达式,但代码。
我实际上已经编写了自己的“抽象树语法”:)所以我已经走上了通向符号操纵器的道路。