由于要做各种代数推导于演算,不只是单纯个科学计算,要定义一些类,来进行形式上的逻辑推导。大名鼎鼎的科学软件Maxima, 就是由Lisp写成,参考其中的一些思想和我研究的问题,我开始定义了如下类。找不到Lisp 模版,先借用Pascal的。
(defclass c-const () ((cvalue :accessor cvalue :initarg :cvalue :initform 1 :type number ) (root-i :accessor root-i :initarg :root-i :initform 0 :type number) (magnitude :accessor magnitude :initarg :magnitude :initform 0 :type number)))
这是一个常数(或者数)的类,属于基本类(或者原子类)。 cvalue 是它的值,root-i表明是不是虚数,这里要注明一个复数有两个 c-const产生, 一个root-i为0,表示是实数;另一个的root-i为1(或者其他非零值),是纯虚数部分。magnitude 表示量级,这个在物理计算的推导中常用:比如有一个量,目前还不知道它的值,但我们大概知道它的量级,它的作用是为了删繁就简,把那些小量级的项可以删掉,简化推导的公式,这个magnitude 就是这个意思,它可以让很多计算可以有幂指数般的简化。但在数学来看,就有些不那么纯粹。因为实际的物理计算,是要做些妥协的。
(defclass c-coeff () ((layer :accessor layer :initarg :layer) (n :accessor n :initarg :n) (m :accessor m :initarg :m) (k :accessor k :initarg :k) (var :accessor var :initarg :var :initform (incf *variable*))))
这个量是一个系数矩阵中的指示器
a1 X1 + a2 X2 + a3 X3 = Y1
其中c-coeff中的 var就是指示X1 X2 X3 中的1,2,3,的 ,也就是第几个未知量,注意这里不是指那个未知量,而是指这个未知量是第几个未知量。
(var :accessor var :initarg :var :initform (incf *variable*))
意思是每产生一个c-coeff类的实例,它就等于在全局变量*variable*+1,当然这个全局变量也自己+1. 这个全局变量标明是第几个未知系数。c-coeff中的layer标明几层,n,m是球谐函数的阶次,k是幂函数或者切比雪夫函数的阶,这些在后文的叙述中会提到。
(defclass t-coeff () ((layer :accessor layer :initarg :layer) (n :accessor n :initarg :n) (m :accessor m :initarg :m) (k :accessor k :initarg :k) (var :accessor var :initarg :var :initform (incf *trial-variable*))))
t-coeff与c-coeff是类似的,只不过它是标注对偶未知数用的。这是因为采用的Galerkin方法,需要要一组试探函数取乘对象方程,t-coeff就是指第几个试探函数。
(defclass c-func () ((func :accessor func :initarg :func :initform nil) (order :accessor order :initarg :order :initform 1) (partial-which :accessor partial-which :initarg :partial-which :initform nil) (partial-order :accessor partial-order :initarg :partial-order :initform 0) (r-base-layer :accessor r-base-layer :initarg :r-base-layer :initform 0) (r-base-k :accessor r-base-k :initarg :r-base-k :initform 0)))
c-func类是用来表示函数的,通常用表示关于r的函数。其中func 如果赋值为 'r 就表示为r的函数,本文里大部分使用的是这种;另外赋值为 'chebyshev 表示为切比雪夫函数,因为此类函数有一些列优秀的功能,所以也会常用到;才外func 还可以赋值为任意的 'f(a,b) , 'g 等等都可以,但本文不常用,通常用来测试程序。
order为函数的阶数,比如 func 为'r , order等于3时 表示 r^3; order等于-1时,表示1/r
partial-which表示对谁求导,如果没有求导,则为nil。 partial-order 为求导的阶数。
r-base-layer 与r-base-k 这两个一般用不到,只有采用切比雪夫函数时才会用到,r-base-k表示阶数,也采用过勒让得函数。 r-base-layer 表示层数。
(defclass c-vector () ;; Y-R-S-T is Ynm Pnm Rnm Snm Tnm ((Y-R-S-T :accessor Y-R-S-T :initarg :Y-R-S-T :initform 'Ynm) (n :accessor n :initarg :n :initform 1 :type number ) (m :accessor m :initarg :m :initform 1 :type number) (star :accessor star :initarg :star :initform nil)))
三维空间中,标量展开成 Y_n^m(\theta,\phi) (研究如何用上下标 和希腊字母)和,而矢量场则展开成球型场和环型场 的和。c-vector就是表示这些基函数(场)的。其中 Y-R-S-T表示是哪种场,有四种: 1)为Y_n^m(\theta,\phi); 2)为R_n^m(\theta,\phi) ; 3)S_n^m(\theta,\phi); 4) T_n^m(\theta,\phi) 。 n,m表示它的阶次,star表示是否为其对耦函数(t)。