在 Haskell 中计算左手黎曼和
Computing left handed Riemann Sums in Haskell
我创建了这个应该计算左手黎曼和的函数,但每次调用该函数时我得到的答案都是无穷大。我很困惑为什么我会返回无穷大,即使我正在计算有限列表的总和并将其乘以 deltaX。
theFunc :: Float -> Float
theFunc x = 1 / x^2
--aBound, bBound, function, numIntervals
leftSum :: Float -> Float -> (Float -> Float) -> Float -> Float
leftSum a b f n =
let dx = (b-a) / n
in dx * (sum [f x | x <- [a,a+dx..b-dx]])
只有当 Reimann 和的左区间从 0 开始时才会发生此错误,因为以下行:
in dx * (sum [f x | x <- [a,a+dx..b-dx]])
f x
鉴于您的 theFunc
函数变为 theFunc 0
并且 1/0^2
为 infinity
因为从数学上讲在 0 处有一条渐近线,所以这种行为是正确的。
如果你想假装 0 的值对积分没有贡献,那么我们可以像这样为零添加一个守卫:
theFunc :: Float -> Float
theFunc x
| x == 0.0 = 0.0
| otherwise = 1.0 / x^2
被称为:
leftSum 0 2 theFunc 1000
我创建了这个应该计算左手黎曼和的函数,但每次调用该函数时我得到的答案都是无穷大。我很困惑为什么我会返回无穷大,即使我正在计算有限列表的总和并将其乘以 deltaX。
theFunc :: Float -> Float
theFunc x = 1 / x^2
--aBound, bBound, function, numIntervals
leftSum :: Float -> Float -> (Float -> Float) -> Float -> Float
leftSum a b f n =
let dx = (b-a) / n
in dx * (sum [f x | x <- [a,a+dx..b-dx]])
只有当 Reimann 和的左区间从 0 开始时才会发生此错误,因为以下行:
in dx * (sum [f x | x <- [a,a+dx..b-dx]])
f x
鉴于您的 theFunc
函数变为 theFunc 0
并且 1/0^2
为 infinity
因为从数学上讲在 0 处有一条渐近线,所以这种行为是正确的。 如果你想假装 0 的值对积分没有贡献,那么我们可以像这样为零添加一个守卫:
theFunc :: Float -> Float
theFunc x
| x == 0.0 = 0.0
| otherwise = 1.0 / x^2
被称为:
leftSum 0 2 theFunc 1000