首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Clojure的计算机代数

Clojure的计算机代数
EN

Stack Overflow用户
提问于 2010-10-19 05:28:42
回答 3查看 2.5K关注 0票数 15

简而言之:我对一些Clojure代码感兴趣,这些代码允许我指定x的变换(例如,排列、旋转),在这些变换下,函数f(x)的值是不变的,这样我就可以有效地生成满足r= f(x)的x序列。Clojure在计算机代数方面有什么进展吗?举个(微不足道的)例子

代码语言:javascript
运行
复制
(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中的元素的所有组合组合在一起。这是非常草率的,如下所示:

代码语言:javascript
运行
复制
(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)))))))))

这就完成了工作,但忽略了基本情况。例如,如果关联运算是一个乘积而不是一个和,我将不得不重写部分。

EN

回答 3

Stack Overflow用户

发布于 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倡导的“通用”方法,由此可以将操作应用于函数,从而创建了一个伟大的抽象,从而无休止地简化了符号。

这是一个品尝者:

代码语言:javascript
运行
复制
> (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引入了两种新的向量类型“向上”和“向下”(称为“结构”),它们的工作方式与您期望的向量非常相似,但它们具有一些特殊的数学(协变、逆变)属性和一些编程属性,因为它们是可执行的!

代码语言:javascript
运行
复制
> (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)))  

完全支持偏导

代码语言:javascript
运行
复制
> (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文件上运行它。

票数 5
EN

Stack Overflow用户

发布于 2010-10-19 20:24:28

还有Clojuratica,Clojure和Mathematica之间的一个接口:

http://clojuratica.weebly.com/

另请参阅此mailing list post,作者为Clojuratica。

虽然不是一个CAS,但Incanter也有几个非常好的功能,可能是一个很好的参考/基础,以建立自己的想法。

关于“例如,如果关联运算是乘积而不是和,我将不得不重写部分”:如果您相应地构造代码,难道不能通过使用高阶函数并传入关联运算来实现这一点吗?想想map-reduce吧。

票数 2
EN

Stack Overflow用户

发布于 2010-10-19 16:06:42

我不知道有任何用Clojure编写的计算机代数系统。但是,出于我相当简单的数学需要,我发现使用Maxima非常有用,它是用lisp编写的。可以使用s表达式或更高级别的表示与Maxima进行交互,这真的很方便。Maxima也有一些基本的组合学函数,这可能是你正在寻找的。

如果您执意要使用Clojure,那么在短期内,在Maxima和Clojure之间来回传递数据可能会帮助您实现您的目标。

从长远来看,我很有兴趣看看你能想出什么!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3963556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档