Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Newton方法类型类Haskell_Haskell - Fatal编程技术网

Newton方法类型类Haskell

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

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

在这个例子中,我只是试着为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”时,我得到一个错误,上面写着“使用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
,因为这样您就可以使用
/