2010-10-18 98 views
13

简短版本: 我对一些Clojure代码感兴趣,它允许我指定函数f(x)值不变的x(例如,置换,旋转)的变换,我可以有效地生成一个满足r = f(x)的x序列。 Clojure的计算机代数有一些发展吗? 对于(一个微不足道的)示例Clojure的计算机代数

(defn #^{:domain #{3 4 7} 
     :range #{0,1,2} 
     :invariance-group :full} 
      f [x] (- x x)) 

我可以调用(原像F#{0}),它会有效地返回#{3 4 7}。当然,它也能够正确地注释codomain。有什么建议么?

更长的版本: 我有一个特定的问题,让我感兴趣的是发现计算机代数的Clojure的发展。任何人都可以指点我这样的项目吗?我的具体问题包括找到满足F(x)= r的所有单词组合,其中F是排名函数,r是正整数。 f(x)= f(x [0])+ f(x [1])+ ... f(x [N-1])

(在我的具体情况下,f可以计算为一个和数

F

此外我有一组不相交的集合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))))))))) 

这将完成工作,但错过了底层的图片。例如,如果关联操作是一个产品而不是总和,我将不得不重写部分。

+0

从2013年退房[Expresso](https://github.com/clojure-numerics/expresso)。 – Zaz 2015-11-07 09:11:34

回答

1

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

如果您是使用Clojure的,在短期内也许投掷您的数据来回千里马和Clojure中之间会帮助你实现你的目标背水战。

从长期来看,我会很感兴趣地看你想出!

2

有Clojuratica,Clojure的数学和之间的接口:

http://clojuratica.weebly.com/

也是这个mailing list post见Clojuratica的作者。

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

关于“例如,如果相联操作是一个产品,而不是总和我不得不重写的部分。”:如果你相应地构造你的代码,难道你不能通过使用高阶函数并传入关联操作来完成这个任务吗?认为地图 - 减少。

1

下面的系统还不支持组合,尽管添加它们并不是一个巨大的努力,但好的代码已经存在,并且这可能是一个很好的平台,因为它的基础很完美。我希望短塞并无不当这里,这是唯一严重的Clojure CAS我知道的,但是,嘿,系统...

=======

可能感兴趣这个线程的读者Gerry Sussman的scmutils系统正在移植到Clojure。 这是一个非常先进的CAS,提供像自动分化,文字函数等,很多枫叶的风格。 它在MIT用于动力学和微分几何的高级程序,以及一些电气工程的东西。也正是在苏斯曼&智慧的“续集”(LOL)所使用的系统SICPSICM(结构和经典力学的解释)。 虽然最初是一个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的大猩猩)也正在开发中。

我希望这样做可以使您的食欲足以让您访问该网站并使其旋转。你甚至不需要Clojure,你可以从提供的jar文件中运行它。