【发布时间】:2017-11-30 17:38:36
【问题描述】:
我正在尝试在 Haskell 中定义梯形规则。我创建了一个辅助函数 innerSum,它是梯形规则的总和部分。然后在积分定义中,我乘以距离并取下界、上界、一个函数和一些 n 个梯形。随着 n 的增加,答案应该变得更加准确。我的功能似乎适用于大多数情况
除了这种情况(可能还有其他情况): 定积分 (-1) 1 (\x->x^100) 20.
当我将值更改为 20 而不是我的答案偏离某个特定值并变得更准确时,数字只是随机跳跃。我似乎找不到错误
definiteIntegral :: Double -> Double -> (Double -> Double) -> Integer -> Double
definiteIntegral a b g n | a <= b = (dist a b n)*(innerSum a b g (dist a b n))
| otherwise = (dist a b n)*(innerSum b a g (dist b a n))
where dist a b n = (b-a)/(fromIntegral n::Double)
innerSum :: Double -> Double -> (Double -> Double) -> Double -> Double
innerSum a b g d | a >= b = 0
| otherwise = (((g a) + (g (a + d)))/2)+(innerSum (a + d) b g d)
【问题讨论】:
-
我不认为这是特定于 Haskell 的问题,但与浮点运算导致的数值精度和舍入误差有关。
-
它不会因此完全准确,是的,但它仍然不会跳得那么剧烈
-
另请注意,如果您增加三角形的数量
definiteIntegral (-1) 1 (^100) 100000,您将非常接近“正确答案”2/101=0.0198
标签: haskell integration