Вычисление левосторонних сумм Римана в Haskell - PullRequest
1 голос
/ 24 февраля 2020

Я создал эту функцию, которая должна вычислять суммы Римана для левой руки, но я получаю бесконечный ответ каждый раз, когда вызываю функцию. Я не понимаю, почему мне нужно вернуть бесконечность, даже если я беру сумму конечного списка и умножаю ее на 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]])

1 Ответ

1 голос
/ 24 февраля 2020

Эта ошибка произойдет только тогда, когда левый интервал суммы Реймана начинается с 0 из-за строки:

in dx * (sum [f x | x <- [a,a+dx..b-dx]])

f x, если ваша theFunc функция становится theFunc 0 и 1/0^2 is infinity

Поскольку с математической точки зрения существует асимптота в 0, это поведение является правильным. Если вместо этого вы хотите сделать вид, что значение в 0 не вносит вклад в интеграл, то мы можем добавить защиту для нуля, например, так:

theFunc :: Float -> Float
theFunc x
  | x == 0.0 = 0.0
  | otherwise = 1.0 / x^2 

Вызывается как:

leftSum 0 2 theFunc 1000
...