Newton方法类型类Haskell
尝试了两种不同的方法来实现牛顿方法,但我似乎无法让它工作。这很可能是一个非常简单的解决方案,但我只需要有人指出我做错了什么。是的,我知道我的代码很难看,只是现在在胡闹 在这个例子中,我只是试着为xn+1建立一个方程,它不起作用Newton方法类型类Haskell,haskell,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 it
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”时,我得到一个错误,上面写着“使用newtons不会产生二重积分”。我应该使用什么类型类来完成这项工作?只需要更通用的类型。没有看到迭代函数,这是算法的核心,因此我尝试围绕现有代码对其进行调整:
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
function::Num a=>a->a
函数x=98-x^98
函数“::Num a=>a->a
函数'x=(-98)*(x^97)
席:双
席=1.04
牛顿::(分数a,Ord a)=>(a->a)->(a->a)->a->a
牛顿f'x
|(abs(fx))
这是一个简单的实现,如果您需要性能和数值稳定性,那么最适合使用。为什么要实现一个典型的微积分,即基于实数的整数算法?这显然是浮点数的情况。问题是,
xi
是一个双精度
,但您要将它传递给newtons
,它需要一个整型Double
不是一种积分类型。你为什么要转换成积分呢?它和牛顿的方法没有关系,我忘了我有这个。但是,当我为牛顿创建类型类(numa)时,它告诉我“无法从牛顿的类型签名绑定的(numa)上下文中推断出使用div时产生的(积分a)”,因此我假设div只能处理整数。这是因为div
的类型签名。您可能需要使用分数
而不是Num
,因为这样您就可以使用/
。