2010-10-18 74 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文件中運行它。