符号数学Python?

时间:2009-02-03 11:21:54

标签: python algorithm math symbolic-math

我对数学和编程非常感兴趣,并计划从头开始符号数学项目

  1. 这是一个好项目的想法吗?

  2. 从哪里开始?

  3. 如何应对此问题     项目

  4. 有什么好资源吗?

  5. 提前致谢。

7 个答案:

答案 0 :(得分:19)

  1. 这是一个练习编程技巧的好项目。但是如果你想创建一个其他人想要使用的真正的库,那么这个项目你不想从头开始全部...

  2. 从哪里开始:查看已经存在的解决方案并考虑您想要做的不同之处。您的项目与其他项目有何不同?

  3. 资源:SymPy is a Python library for symbolic mathematics

答案 1 :(得分:10)

1.这个好项目的想法吗?

是;我希望它能提供无穷无尽的有趣工作源,这将很快地测试和扩展你的编程能力。

2.从哪里开始?

我接下来提出你应该看看现有工作的其他建议。 SAGE是非常令人印象深刻的,如果你问我的建议,我会建议你先写一个用数字和符号做算术的基本系统;然后看看SAGE并编写一个模块来扩展系统,换句话说,成为更大的东西的贡献者,而不是试图自己完成所有这些。另请参阅Mathematica和Maple,Macsyma和Axiom。后两者是免费的(我认为),但它们都在网上得到很好的记录,是思想和挑战的重要来源。

3.如何处理这个项目?

当人们接近吃大象时。一次咬一口。更严重的是,我认为存在一些核心问题,例如表达式的表示,以及一些基本的功能(多项式的算术),你可以削减它们。

4.有什么好的资源吗?

很多很多。 google for'computer algebra','term rewriting'。看看亚马逊上的可用内容。并且,如果您有权访问,请查看ACM数字图书馆

祝你好运。

答案 2 :(得分:7)

符号数学是一个有趣的项目。无论是否有人使用它在您的问题中似乎都不重要,所以请深入了解。

多年来我写了两篇。最酷的是SQL for where子句 - 它对SQL进行了一些琐碎的符号操作,以便在一些额外的AND条件下折叠。不是一个完整的“求解器”或“优化器”或任何东西,只是对任何SQL where子句可能的几个符号操作。调试器不太酷;它做了复杂的数学计算(符号)叠加变量的偏移量。

首先为数学表达式的元素定义类 - 操作数,运算符,函数等。

您必须决定这些对象必须参与哪些操作。获取表达式的具体值是一个简单明了的方法。从所有变量都具有绑定的情况开始。

然后处理一些变量保持未绑定的情况,并且只能评估表达式的部分内容。

然后处理将表达式重新排列为规范形式。即,您已经进行了部分评估,并且Add( Variable(x), Add( Variable(x), Lit(3) ) )。您需要编写规则以将其转换为Add( Multiply( Lit(2), Variable(x) ), Lit(3) )

一个非常酷的练习是优化括号,以便打印输出具有捕获含义所需的最少括号。

我们在学校里都有许多其他的“表达转换”规则,用于进行代数操作。他们很多。

特别是,在某些情况下,重新排列等式来隔离变量可能非常困难。

进行衍生变换很容易,但是在很多特殊情况下,符号集成确实非常困难。

基础很有趣。根据你想要走多远,它会变得越来越难。

答案 3 :(得分:4)

@Resources:您可以查看pythonica - 这是尝试用Python实现Mathematica类型的程序(源代码可供下载)。

答案 4 :(得分:3)

这个pySym Blog也可能会让你感兴趣的是获得想法和初学者,并了解其他人在使用python&象征性的数学。

答案 5 :(得分:1)

更多资源方式:SympyCore

  

SympyCore项目的目标是寻找新的高性能解决方案来表示和操纵Python编程语言中的符号表达式,并尝试新的符号模型,以实现基本一致且足够通用的符号模型,这将很容易扩展到计算机代数系统(CAS)。

答案 6 :(得分:1)

我认为这对于任何技能水平的程序员来说都是一个很棒的项目。实现一个功能强大的符号计算器非常容易。如果你继续在广度上工作,那么有很多有趣的功能可以添加,你可以长时间使用它。如果你选择深入了解,你会发现事情很快就会变得很难。如果你喜欢的话,你可以无限期地挑战自己。

有很多很棒的资源。我推荐zur Gathen和Gerhard所着的“现代计算机代数”一书,尽管它比一般的符号操作更关注特殊形式(多项式,整数,矩阵)的算术。当你刚开始时,通过查看一些Lisp或Scheme教程,你可能会得到更好的帮助,因为符号数学在概念上很容易在Lisp中完成,并且用Python构建一个符号引擎你或多或少都要以mini-Lisp为基础。

正如其他人所指出的那样,你可以看一下SymPy和sympycore的灵感或具体的算法。这两个项目的源代码有点复杂(但肯定不是很难学习)。

(如果我可以插一下,我wrote a tiny symbolic engine一会儿(作为一个周末项目 - 它非常小,我从未参与过它)。它在200左右实现了一个通用的符号引擎代码行,然后有300行代码实现符号算术和符号布尔代数,有一些非常简单的简化。也许比SymPy更容易挖掘。但是那里的所有东西都是你自己很容易发现的东西,并且可能这样做会更有乐趣。)