提问人:PaulM 提问时间:6/8/2021 最后编辑:Will NessPaulM 更新时间:6/30/2021 访问量:92
Common Lisp 中数值函数的近似导数和二阶导数 - 未按预期工作
Approximating derivatves and second derivatives of numerical functions in Common Lisp - not working as expected
问:
我尝试了一种非常幼稚的方法来逼近 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
任何提示将不胜感激!
谢谢。
答:
3赞
PaulM
6/8/2021
#1
哈哈。好消息,坏消息...... 好消息是,我写的口齿伶俐正在做我以为我告诉它做的事情。 坏消息是我是个白痴。
(defparameter *delta-x* 1/10000)
使其按预期工作。浮点运算 101.
2赞
Svante
6/8/2021
#2
我认为这没关系,但是您处于单个浮点数的粒度极限。你可以用 .trace
尝试使用双浮点数或比率。
评论