Common Lisp 中数值函数的近似导数和二阶导数 - 未按预期工作

Approximating derivatves and second derivatives of numerical functions in Common Lisp - not working as expected

提问人:PaulM 提问时间:6/8/2021 最后编辑:Will NessPaulM 更新时间:6/30/2021 访问量:92

问:

我尝试了一种非常幼稚的方法来逼近 Lisp 中函数的一阶导数,并得出了这样的东西:

(defparameter *delta-x* 0.00001)

(defun diff (f x)
  (/ (- (funcall f (+ x *delta-x*)) (funcall f x))
     *delta-x*))

因此,例如

(diff #'(lambda (x) (* x x x)) 2)
; 12.016296

这还不错(12 是实际结果)。所以我想......为什么不呢?并试图将其扩展到二阶导数近似,使用

(defun diff2 (f x)
  (diff #'(lambda (z) (diff f z)) x))

意识到它可能是一个数值较差的算法,我仍然期望得到某种结果,但我得到 0.0 作为我尝试的所有事情的答案,所以我的猜测是我写的 Lisp 不是我认为的那样......

(diff2 #'(lambda (x) (* x x x)) 2)
; 0.0

任何提示将不胜感激!

谢谢。

Lambda 通用 LISP 精密 数值分析

评论


答:

3赞 PaulM 6/8/2021 #1

哈哈。好消息,坏消息...... 好消息是,我写的口齿伶俐正在做我以为我告诉它做的事情。 坏消息是我是个白痴。

(defparameter *delta-x* 1/10000)

使其按预期工作。浮点运算 101.

2赞 Svante 6/8/2021 #2

我认为这没关系,但是您处于单个浮点数的粒度极限。你可以用 .trace

尝试使用双浮点数或比率。