甲:创建高阶函数。 闭包
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