Sha256: d4b83c3b05d49d76f87ee6f8c4e822517aeae9f0e6348b81034796c68071a0de

Contents?: true

Size: 917 Bytes

Versions: 1

Compression:

Stored size: 917 Bytes

Contents

module Dydx
  class Integrand
    attr_accessor :function, :var
    def initialize(function, var)
      @function = function
      @var = var
    end

    def [](a, b, n = 1000)
      raise ArgumentError, 'b should be greater than a' if a > b
      f = function
      # HOT FIX: should implement Infinity class
      a = - 1000 if a == - Float::INFINITY
      b = 1000 if b == Float::INFINITY

      a, b = [a, b].map(&:to_f)
      n = [n, (b - a) * 2].max
      n += 1 if n.to_i.odd?
      h = (b - a) / n
      x = ->(i){ a + h * i }

      odd_sum = (1..n - 1).to_a.select(&:odd?).inject(0) { |sum, i| sum += f(x.(i))}
      even_sum = (1..n - 1).to_a.select(&:even?).inject(0) { |sum, i| sum += f(x.(i))}
      round_8( (h / 3) * (f(a) + f(b) + 2 * even_sum + 4 * odd_sum) )
    end

    def round_8(num)
      return num if num.abs == Float::INFINITY
      (num * 10 ** 8).round * 10.0 ** (-8)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dydx-0.1.31 lib/dydx/integrand.rb