甲:創建高階函數。 閉包
CL-USER > (defun make-derivative (f h) #'(lambda (x) (let ((fx+ (funcall f (+ x h))) (fx- (funcall f (- x h))) (2h (* 2 h))) (/ (- fx+ fx-) 2h)))) MAKE-DERIVATIVE
乙:創建初等函數求導閉包。好比,求sin函數在某點的導數: 函數
CL-USER > (defvar df (make-derivative #'sin 0.001)) #<CLOSURE (LAMBDA (X) :IN MAKE-DERIVATIVE) {24CDEAF5}>這裏的df就是sin函數的步長爲0.001的閉包,求該函數在x=1.5處的導數能夠用下式:
CL-USER > (funcall df 1.5) 0.07072091
丙:計算相對偏差。sin函數在1.5處的實際導數值爲: spa
CL-USER> (cos 1.5) 0.0707372相對偏差:
CL-USER> (abs (/ (- 0.07072091 0.0707372) 0.0707372)) 2.3024618e-4
丁:提升精度。固然,能夠經過縮短步長的方式進一步下降偏差,請自試之。 code