Gerry Sussman 的scmutils系统被移植到 Clojure可能会让本主题的读者感兴趣。这是一个非常先进的 CAS,提供诸如自动微分、文字函数等功能,非常类似于Maple。它在麻省理工学院用于动力学和微分几何的高级程序,以及相当多的电气工程材料。它也是 Sussman&Wisdom 的SICP、SICM(经典力学的结构和解释)的“续集”(LOL)中使用的系统。虽然最初是一个 Scheme 程序,但这不是直接翻译,而是为了利用 Clojure 的最佳特性而进行的彻底重写。它被命名为sicmutils, 既是为了纪念原著,也是为了纪念这本书。这项出色的工作是 Colin Smith 的作品,您可以在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 文件中运行它。
=========
PS。顺便说一句,要直接回答原始问题,是的,sicmutils确实支持符号结构:您可以设置一个矩阵表示,其中条目是公式,例如旋转矩阵,然后针对给定坐标评估(乘以)它。它以这种方式非常灵活。