【发布时间】:2017-11-04 04:52:10
【问题描述】:
在 Haskell 中,我使用以下函数来查找多项式的根:
polyNewton :: (Fractional a, Ord a) => Poly a -> a -> a`
polyNewton p s = if (abs(polyValue p s) <= (0 + 1e-10)) then s else polyNewton
p (s - (polyValue p s) / (polyValue (polyDeriv p) s))
其中 polyValue 是一个函数,用于查找多项式 p 的 y 值、一个 x 值 x,而 polyDeriv 是一个返回多项式 p 的导数的函数。
此代码在大多数情况下都运行良好,除非多项式没有任何实际根(函数在 x 轴上方)或给出错误的初始猜测。有没有办法预先确定牛顿法是否会失败,这样我的函数就不会无限期地运行?
【问题讨论】:
-
你如何确定它是否在 Haskell 以外的其他语言中失败?
-
我知道如果多项式有奇数次,它将穿过 x 轴。我不确定如何判断偶数多项式是否会穿过 x 轴。我可以考虑使用中值定理,但在哪个域上?
-
我投票结束这个问题,因为它实际上是关于数学而不是编程。您可以尝试在 math.stackexchange.com 上提问。如果您在执行答案时遇到问题,可以回到这里。
-
您的回答表明您实际上也没有设法处理奇怪的情况。牛顿法需要一个初始值,但是如何设置初始值呢?在奇怪的情况下,您一定会得到解决方案,但如果有很多解决方案,您要找哪一个?
标签: haskell math functional-programming polynomial-math newtons-method