lua中的高阶导数?

lua中的高阶导数?,lua,precision,Lua,Precision,我在lua上乱搞高阶导数(我没有在任何不同的语言上测试过),发现将delta设置为最低值越快,它就会输出0.0,看看这段代码,然后是输出 为什么会发生这种情况 function derivate (f, delta) delta = delta or 1e-4 return function(x) return (f(x + delta) - f(x)) / delta end end c = derivate ( math.cos ) -- c is now -sinx d = deriva

我在lua上乱搞高阶导数(我没有在任何不同的语言上测试过),发现将delta设置为最低值越快,它就会输出0.0,看看这段代码,然后是输出 为什么会发生这种情况

function derivate (f, delta)
delta = delta or 1e-4
return function(x) return (f(x + delta) - f(x)) / delta end
end

c = derivate ( math.cos )
-- c is now -sinx
d = derivate (c)
-- d is now -cosx
e = derivate (d)
-- e is now sinx
f = derivate (e)
-- f is now cosx

print(math.cos(1.23 ), c(1.23) , d(1.23) , e(1.23) , f(1.23) )
输出:

0.3342377271245 -0.94250551224695   -0.3341434795523    0.94257934790676    0.0

这个代码非常不稳定,我尝试了
delta=1E-5
,0.0变成了11102.2;但是,当
delta=1E-6
时,您是对的。看看我使用1e-5得到的结果,它输出11102.23,当使用奇数指数时,它总是会产生意外的行为,否则它只会在0.0时放弃使用相同的代码,并带有中心差异,例如
(f(x+delta)-f(x-delta))/(2*delta)
,现在您将看到偶数指数(1e-6)将变得不稳定我用简单的函数尝试了你的代码。在二阶导数之后,该方法变得不稳定。我假设在第三个或第四个导数中,
delta^3
delta^4
会导致精度损失。这可能值得一读,因为每一次导数都会降低数值精度。这段代码非常不稳定,我尝试了
delta=1E-5
,0.0变为11102.2;但是,当
delta=1E-6
时,您是对的。看看我使用1e-5得到的结果,它输出11102.23,当使用奇数指数时,它总是会产生意外的行为,否则它只会在0.0时放弃使用相同的代码,并带有中心差异,例如
(f(x+delta)-f(x-delta))/(2*delta)
,现在您将看到偶数指数(1e-6)将变得不稳定我用简单的函数尝试了你的代码。在二阶导数之后,该方法变得不稳定。我假设在第三个或第四个导数中,
delta^3
delta^4
会导致精度损失。这可能值得一读,因为每一次导数都会失去数值精度。