有没有人知道有关计算机代数系统一般理论的任何资源(书籍,课程,讲义或任何内容)(例如mathematica,sympy)?
"介绍性"材料是首选,但我意识到,对于这样一个专门的主题,任何东西都必定相当先进.
math symbolic-math computer-algebra-systems symbolic-computation
我需要操作像1 + sqrt(3)这样的表达式,并进行加法,减法和除法等基本算法.我希望结果是某种规范形式,以便它可以用作地图中的键.由于舍入问题,将1 + sqrt(3)转换为浮点是不可行的.
我在Python中使用SymPy来完成这项任务.Haskell有一个等效的本机库吗?
我有一些表达,比如x^2+y^2我想用于一些数学计算.我想做的一件事就是采用表达式的偏导数.
所以,如果f(x,y) = x^2 + y^2再偏的f相对于x会2x,部分相对于y会2y.
我使用有限差分方法编写了一个极小的函数,但我遇到了浮点精度的许多问题.例如,我最终得到了1.99234而不是2.有没有支持符号差异化的图书馆?还有其他建议吗?
我非常感兴趣的是数学和编程,并计划从头开始创建符号数学项目.
这个好项目的想法吗?
从哪儿开始?
如何处理这个项目?
有什么好资源吗?
提前致谢.
网上有很多代数求解器和简化器(例如,algebra.com上的正确代数).但是,我正在寻找一些可以插入C#的东西,作为一个更大的项目的一部分(我正在制作我自己的计算器,但显然我会请求许可等).
理想情况下,我使用的代码如下:
String s = MathLib.Simplify("5x*(500/x^2*(sqrt(3)/4)+1)+2x^2+(sqrt(3)/2)*x^2");
Run Code Online (Sandbox Code Playgroud)
并且's'将简化为: "1082.532/x+5*x+2.866*x^2"
(那里的3dp准确性,但如果需要可以改变).
解决特定变量也会很好.我需要一些轻量级和快速的东西(如上所述的计算最好在5ms左右,包括启动延迟).
经过一些研究,像Sage,Octave或Mathematica这样的程序可能有点过分(我的应用程序可能只是一个小的<200k exe).Dotnumerics.com或Mathdotnet.com可能是合适的,但前者似乎没有提到代数简化,后者缺乏文档和示例是关闭的.我想知道是否有任何合适的替代方案.可在此处找到大型列表:http: //en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems
简短版本:我对一些Clojure代码很感兴趣,它允许我指定x的变换(例如置换,旋转),在该变换下函数f(x)的值是不变的,这样我就可以有效地生成x的序列满足r = f(x).Clojure的计算机代数有一些发展吗?对于(一个微不足道的)例子
(defn #^{:domain #{3 4 7}
:range #{0,1,2}
:invariance-group :full}
f [x] (- x x))
Run Code Online (Sandbox Code Playgroud)
我可以打电话(preimage f#{0}),它会有效地返回#{3 4 7}.当然,它也能够正确地注释codomain.有什么建议?
更长的版本:我有一个特定的问题让我有兴趣了解Clojure计算机代数的开发.谁能指点我这样的项目?我的具体问题涉及找到满足F(x)= r的所有单词组合,其中F是排名函数,ra是正整数.在我的特定情况下,f可以作为总和来计算
F(x)= f(x [0])+ f(x [1])+ ... f(x [N-1])
此外,我有一组不相交的集合S = {s_i},使得f(a)= f(b)表示a,b表示s,s表示S.所以生成所有x的策略使得F(x)= r应该依赖于F的这种因式分解和每个s_i下f的不变性.换句话说,我计算包含S元素的站点的所有排列,这些元素总和为r,并用每个s_i中元素的所有组合组成它们.以下内容非常简单:
(use 'clojure.contrib.combinatorics)
(use 'clojure.contrib.seq-utils)
(defn expand-counter [c]
(flatten (for [m c] (let [x (m 0) y (m 1)] (repeat y x)))))
(defn partition-by-rank-sum [A N f r]
(let [M (group-by f A)
image-A (set (keys M))
;integer-partition computes restricted integer partitions,
;returning a multiset …Run Code Online (Sandbox Code Playgroud) 让我们说我采取的计算只涉及加法和乘法:
(a+b)*(c+d)
Run Code Online (Sandbox Code Playgroud)
这可以通过许多其他方式完成,例如.
a*(c+d) + b*(c+d)
a*c + a*d + b*c + b*d
Run Code Online (Sandbox Code Playgroud)
在加法和乘法方面,所示三个例子中每一个所需的操作数分别为(2,1)(3,2)(3,4).显然,如果目标是减少操作的总数,那么第一个是优越的.有没有办法,给定一个任意表达式来查找需要最少操作次数的计算顺序?
注意: 这个问题正在从SE.math重新询问CS人群的见解和观点.
我有一个功能f(t)=2/(2-t).在2^(-r)*r!没有使用Mathematica的情况下,在t = 0(即)得到第r个导数并不是那么困难 .在Mathematica计算的情况下,我可以得到r = 4时的r次导数,如下所示:D[2/(2-t), {t, 4}].但是当r是任意整数时,如何在Mathematica中获得t = 0的rth导数?我试图使用这个表达式,但它没有按预期工作:
Simplify[D[2/(2 - t), {t, r}], Assumptions -> Element[r, Integers]] /. {t->0}
Run Code Online (Sandbox Code Playgroud)
是否有可能像人类一样在Mathematica中象征性地进行上述数学运算?
我似乎无法理解其中的差异.对我而言,看起来两者都只是通过一个表达并应用链规则.我错过了什么?
根据维基:
在数学和计算机科学中,计算机代数,也称为符号计算或代数计算,是指研究和开发用于操纵数学表达式和其他数学对象的算法和软件的科学领域.
符号计算是否专注于符号操作和计算?Lisp程序以AST的形式编写,原子为叶子.据说Lisp是符号计算的语言.这是否意味着在符号计算中,它是:
根据这个问题,符号计算的反面是数值计算.这两者之间的主要区别是什么?当我使用Octave(我正在研究它)时,我必须经常使用数字并且必须多次猜测这些魔术数字的含义.这是数值计算的焦点吗?