Common Lisp高階函數實現初等函數求導

甲:創建高階函數。 閉包

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

相關文章
相關標籤/搜索