简而言之:我对一些Clojure代码感兴趣,这些代码允许我指定x的变换(例如,排列、旋转),在这些变换下,函数f(x)的值是不变的,这样我就可以有效地生成满足r= f(x)的x序列。Clojure在计算机代数方面有什么进展吗?举个(微不足道的)例子
(defn #^{:domain #{3 4 7}
:range #{0,1,2}
:invariance-group :full}
f [x] (- x x))
我可以调用(preimage f #{0}),它将有效地返回#{3 4 7}。当然,它也能够正确地注释共域。有什么建议吗?
更长的版本:我有一个特定的问题,这让我有兴趣了解Clojure的计算机代数的开发。有谁能给我指个这样的项目吗?我的具体问题涉及找到满足F(x) = r的所有单词组合,其中F是排名函数,r是正整数。在我的特殊情况下,f可以作为一个和来计算
F(x) = f(x) + f(x1) + ...f(xN-1)
此外,我还有一组不相交的集合s = { s_i },使得f(a)=f(b)对于a,b在S中,s在S中。因此,生成所有x的策略使得F(x) =r应该依赖于F的因子分解和每个s_i下f的不变性。换句话说,我计算包含S元素的所有排列,并将它们与每个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 as key value pairs
rank-partitions (integer-partition r (disj image-A 0))
]
(apply concat (for [part rank-partitions]
(let [k (- N (reduce + (vals part)))
rank-map (if (pos? k) (assoc part 0 k) part)
all-buckets (lex-permutations (expand-counter rank-map))
]
(apply concat (for [bucket all-buckets]
(let [val-bucket (map M bucket)
filled-buckets (apply cartesian-product val-bucket)]
(map vec filled-buckets)))))))))
这就完成了工作,但忽略了基本情况。例如,如果关联运算是一个乘积而不是一个和,我将不得不重写部分。
发布于 2017-01-14 11:17:03
下面的系统还不支持组合学,尽管添加它们不会是一个巨大的努力,但已经存在大量的好代码,这可能是一个很好的移植它的平台,因为基础是相当健全的。我希望短插头在这里不是不合适的,这是我所知道的唯一严肃的Clojure CAS,但是,嘿,这是一个多么好的系统……
=======
这个帖子的读者可能会对Gerry Sussman的Clojure scmutils系统被移植到感兴趣。这是一个非常高级的CAS,提供了自动微分、文字函数等功能,非常类似于Maple风格。在麻省理工学院,它被用于动力学和微分几何的高级程序,以及相当多的电气工程方面的东西。它也是Sussman&Wisdom的SICP,SICM (经典力学的结构和解释)的“续集”(LOL)中使用的系统。虽然最初是Scheme程序,但这不是直接翻译,而是为了利用Clojure的最佳特性而重新编写。它被命名为sicmutils,既是为了纪念原著,也是为了纪念这本书。这是科林·史密斯的杰作,你可以在https://github.com/littleredcomputer/sicmutils上找到它。
我相信这可以形成一个令人惊叹的Clojure计算机代数系统的基础,与任何其他可用的系统竞争。尽管它是一个巨大的野兽,正如你可以想象的那样,还有大量的东西需要移植,但基本的东西已经很多了,系统将会有所区别,并且可以很好地处理文字和文字函数。这是一项正在进行的工作。该系统还使用了Sussman倡导的“通用”方法,由此可以将操作应用于函数,从而创建了一个伟大的抽象,从而无休止地简化了符号。
这是一个品尝者:
> (def unity (+ (square sin) (square cos)))
> (unity 2.0) ==> 1.0
> (unity 'x) ==> 1 ;; yes we can deal with symbols
> (def zero (D unity)) ;; Let's differentiate
> (zero 2.0) ==> 0
SicmUtils引入了两种新的向量类型“向上”和“向下”(称为“结构”),它们的工作方式与您期望的向量非常相似,但它们具有一些特殊的数学(协变、逆变)属性和一些编程属性,因为它们是可执行的!
> (def fnvec (up sin cos tan)) => fnvec
> (fnvec 1) ==> (up 0.8414709848078965 0.5403023058681398 1.5574077246549023)
> ;; differentiated
> ((D fnvec) 1) ==> (up 0.5403023058681398 -0.8414709848078965 3.425518820814759)
> ;; derivative with symbolic argument
> ((D fnvec) 'θ) ==> (up (cos θ) (* -1 (sin θ)) (/ 1 (expt (cos θ) 2)))
完全支持偏导
> (defn ff [x y] (* (expt x 3)(expt y 5)))
> ((D ff) 'x 'y) ==> (down (* 3 (expt x 2) (expt y 5)) (* 5 (expt x 3) (expt y 4)))
> ;; i.e. vector of results wrt to both variables
该系统还支持TeX输出、多项式分解和许多其他功能。然而,许多可以轻松实现的东西并不是纯粹因为缺乏人力资源而完成的。图形输出和“记事本/工作表”界面(使用Clojure的Gorilla)也在开发中。
我希望这已经在某种程度上刺激了你的胃口,让你有足够的胃口访问这个网站,并尝试一下。您甚至不需要Clojure,您可以在提供的jar文件上运行它。
发布于 2010-10-19 20:24:28
还有Clojuratica,Clojure和Mathematica之间的一个接口:
http://clojuratica.weebly.com/
另请参阅此mailing list post,作者为Clojuratica。
虽然不是一个CAS,但Incanter也有几个非常好的功能,可能是一个很好的参考/基础,以建立自己的想法。
关于“例如,如果关联运算是乘积而不是和,我将不得不重写部分”:如果您相应地构造代码,难道不能通过使用高阶函数并传入关联运算来实现这一点吗?想想map-reduce吧。
发布于 2010-10-19 16:06:42
我不知道有任何用Clojure编写的计算机代数系统。但是,出于我相当简单的数学需要,我发现使用Maxima非常有用,它是用lisp编写的。可以使用s表达式或更高级别的表示与Maxima进行交互,这真的很方便。Maxima也有一些基本的组合学函数,这可能是你正在寻找的。
如果您执意要使用Clojure,那么在短期内,在Maxima和Clojure之间来回传递数据可能会帮助您实现您的目标。
从长远来看,我很有兴趣看看你能想出什么!
https://stackoverflow.com/questions/3963556
复制相似问题