牛顿方法类型类Haskell

时间:2013-11-20 01:23:49

标签: haskell

尝试使用几种不同的方法来实现牛顿方法,但我似乎无法让它工作。这很可能是一个非常简单的修复,但我只需要有人指出我做错了什么。是的,我知道我的代码很难看,只是现在搞乱了。

在这个例子中,我只是尝试为xn + 1制作一个方程式,它不起作用。

function :: (Num a) => a ->  a
function x = 98 - x^98
function' :: (Num a) => a -> a
function' x = (-98)*(x^97)
xi = 1.04
iterations = 20

newtons :: (Integral a) => a -> a

newtons x = x - fromIntegral ( div (function x) (function' x) )

当我在ghci中输入'newtons xi'时,我得到一个错误,上面写着“使用牛顿时没有出现Integral Double的实例”。我应该使用什么类型的类来完成这项工作?

1 个答案:

答案 0 :(得分:2)

只需要更多一般类型。没有看到迭代函数是算法的核心,所以我试图围绕你现有的代码进行调整:

function :: Num a => a -> a
function x = 98 - x^98

function' :: Num a => a -> a
function' x = (-98)*(x^97)

xi :: Double
xi = 1.04

newton :: (Fractional a, Ord a) => (a -> a) -> (a -> a) -> a -> a
newton f f' x
    | (abs (f x)) < epsilon = x
    | otherwise = newton f f' (x - (f x / f' x))
  where
    epsilon = 1e-4

main :: IO ()
main = do
  -- Prints out the two extrema
  print $ newton function function' xi    --  1.0478970878235732
  print $ newton function function' (-xi) -- -1.0478970878235732

这是一个天真的实现,如果你需要性能和数值稳定性,那么ad package最适合这个。