Lisp在科学工作中的运用-1.1 定义各种类

由于要做各种代数推导于演算,不只是单纯个科学计算,要定义一些类,来进行形式上的逻辑推导。大名鼎鼎的科学软件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)。

 

你可能感兴趣的:(Lisp在科学工作中的运用-1.1 定义各种类)