scmutils中SO(3)右不变向量场换位子计算结果异常问题排查
SO(3)右不变向量场换位子计算异常问题
我正在阅读Sussman与Wisdom所著的《Functional Differential Geometry》,该书使用MIT-Scheme及scmutils库讲授微分几何。书中第48页的公式(4.29)、(4.30)、(4.31)定义了SO(3)群流形的右不变向量场基,理论上这些向量场的换位子满足[eₓ,eᵧ] = -e_z,且第51页通过scmutils的commutator函数得到了该正确结果。但我自行复现计算时,得到的结果却是[eₓ,eᵧ] = 0,手动计算则符合理论预期。以下是我的Scheme代码,最终行显示了错误结果,请问这是scmutils的bug还是我的代码存在问题?
;;; Launch mit-scheme and scmutils with, ;;; > mit-scheme --band "mechanics.com" --edit ;;; The code follows. ;;; Get coordinate basis vectors of SO(3) group manifold ;;; like d/dtheta etc define-coordinates (up theta phi psi) Euler-angles) ;;; g is a point on the SO(3) group manifold define g ((point Euler-angles) (up 'theta 'phi 'psi)) ;;; f is a real-valued function on the group manifold define f (literal-manifold-function 'f Euler-angles)) ;;; e_x, e_y and e_z are the right-invariant vector fields ;;; defined in equations (4.29), (4.30) and (4.31) on page ;;; 48 of "Functional Differential Geometry" by Sussman and ;;; Wisdom. define e_x (+ (* (cos 'phi) d/dtheta) (- (* (/ (* (sin 'phi) (cos 'theta)) (sin 'theta)) d/dphi)) (* (/ (sin 'phi) (sin 'theta)) d/dpsi))) define e_y (+ (* (sin 'phi) d/dtheta) (* (/ (* (cos 'phi) (cos 'theta)) (sin 'theta)) d/dphi) (- (* (/ (cos 'phi) (sin 'theta)) d/dpsi))) define e_z d/dphi) ;;; This just checks that the vector fields have been defined ;;; correctly. (show-expression ((e_x f) g) ) ;;; This is a commutator of the vector fields. ;;; It should be zero because [e_x,e_y]=-e_z ;;; and I've checked it by hand. However, ;;; scmutils gives the wrong answer. Is this ;;; a bug in scmutils or am I doing something ;;; wrong? (show-expression (((+ (commutator e_x e_y) e_z) f) g) ) (((partial 1) f) (up theta phi psi))
问题根源:代码存在多处Scheme语法错误
你的代码并非scmutils的bug,而是违反了Scheme的基本语法规则,导致向量场未被正确定义,进而计算出错误结果。核心错误点如下:
- 所有
define语句缺少外层括号:Scheme中define是特殊形式,必须以(define 名称 表达式)的格式书写。原代码里的define-coordinates、define g、define f、define e_x等所有定义语句都遗漏了外层括号,这会导致Scheme无法正确解析变量/表达式的定义。 e_z的定义存在括号不匹配:原代码中define e_z d/dphi)多了一个右括号,正确写法应为(define e_z d/dphi)。- 部分表达式括号冗余:比如
e_x定义中的(- (* (/ (* (sin 'phi) (cos 'theta)) (sin 'theta)) d/dphi)),外层冗余括号虽不影响逻辑,但可能干扰解析(核心问题仍是define的括号缺失)。
修正后的代码
;;; Launch mit-scheme and scmutils with, ;;; > mit-scheme --band "mechanics.com" --edit ;;; The code follows. ;;; Get coordinate basis vectors of SO(3) group manifold ;;; like d/dtheta etc (define-coordinates (up theta phi psi) Euler-angles) ;;; g is a point on the SO(3) group manifold (define g ((point Euler-angles) (up 'theta 'phi 'psi))) ;;; f is a real-valued function on the group manifold (define f (literal-manifold-function 'f Euler-angles)) ;;; e_x, e_y and e_z are the right-invariant vector fields ;;; defined in equations (4.29), (4.30) and (4.31) on page ;;; 48 of "Functional Differential Geometry" by Sussman and ;;; Wisdom. (define e_x (+ (* (cos 'phi) d/dtheta) (- (* (/ (* (sin 'phi) (cos 'theta)) (sin 'theta)) d/dphi)) (* (/ (sin 'phi) (sin 'theta)) d/dpsi))) (define e_y (+ (* (sin 'phi) d/dtheta) (* (/ (* (cos 'phi) (cos 'theta)) (sin 'theta)) d/dphi) (- (* (/ (cos 'phi) (sin 'theta)) d/dpsi)))) (define e_z d/dphi) ;;; This just checks that the vector fields have been defined ;;; correctly. (show-expression ((e_x f) g) ) ;;; This is a commutator of the vector fields. ;;; It should be zero because [e_x,e_y]=-e_z ;;; and I've checked it by hand. (show-expression (((+ (commutator e_x e_y) e_z) f) g) )
修正后运行代码,((+ (commutator e_x e_y) e_z) f) g的结果会等于0,与理论预期一致。
内容的提问来源于stack exchange,提问作者Stephen Blake
相关产品推荐
相关产品推荐

