尝试使用几种不同的方法来实现牛顿方法,但我似乎无法让它工作。这很可能是一个非常简单的修复,但我只需要有人指出我做错了什么。是的,我知道我的代码很难看,只是现在搞乱了。
在这个例子中,我只是尝试为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的实例”。我应该使用什么类型的类来完成这项工作?
答案 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最适合这个。