甲:建立高阶函数。
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处的实际导数值为:
CL-USER> (cos 1.5)
0.0707372
相对误差:
CL-USER> (abs (/ (- 0.07072091 0.0707372) 0.0707372))
2.3024618e-4
丁:提高精度。当然,可以通过缩短步长的方式进一步降低误差,请自试之。