Module: Num4SimDiffLib

Extended by:
FFI::Library
Defined in:
lib/num4simdiff.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.cnvPt2RbAry(n, pt) ⇒ double[]

FFI::Pointer型からruby配列に変換

Parameters:

  • n (int)

    配列の個数

  • pt (pointer)

    FFI::Pointer

Returns:

  • (double[])

    yiの値(配列)



102
103
104
105
106
107
# File 'lib/num4simdiff.rb', line 102

def cnvPt2RbAry(n, pt)
  rbAry = n.times.map { |i|
     pt.get_double(i * Fiddle::SIZEOF_DOUBLE)
  }
  return rbAry  
end

.cnvRbAry2pt(n, ary) ⇒ pointer

ruby配列からFFI::Pointer型に変換

Parameters:

  • n (int)

    配列の個数

  • ary (double[])

    yiの値(配列)

Returns:

  • (pointer)

    FFI::Pointer



89
90
91
92
93
94
95
# File 'lib/num4simdiff.rb', line 89

def cnvRbAry2pt(n, ary)
    yi_ptr = FFI::MemoryPointer.new(:double, n)
    n.times.map { |i|
        yi_ptr.put_double(i * Fiddle::SIZEOF_DOUBLE, ary[i].to_f)
    }
    return yi_ptr   
end

.eulerMethod(yi, h, func) ⇒ double[]

オイラー法による数値計算

yi_1 = eulerMethod(yi, h, func)

Parameters:

  • yi (double[])

    xiに対するyiの値(配列)

  • h (double)

    刻み幅

  • func (callback)

    xiに対する傾きを計算する関数

Returns:

  • (double[])

    xi+hに対するyi_1の値(配列)



43
44
45
46
47
48
49
# File 'lib/num4simdiff.rb', line 43

def eulerMethod(yi, h, func)
  n = yi.size
  yi_ptr = cnvRbAry2pt(n, yi)
  yi_1_ptr = eulerMethodFFI(n, yi_ptr, h, func)
  yi_1 = cnvPt2RbAry(n, yi_1_ptr)
  return yi_1
end

.heunMethod(yi, h, func) ⇒ double[]

ホイン法による数値計算

yi_1 = heunMethod(yi, h, func)

Parameters:

  • yi (double[])

    xiに対するyiの値(配列)

  • h (double)

    刻み幅

  • func (callback)

    xiに対する傾きを計算する関数

Returns:

  • (double[])

    xi+hに対するyi_1の値(配列)



59
60
61
62
63
64
65
# File 'lib/num4simdiff.rb', line 59

def heunMethod(yi, h, func)
  n = yi.size
  yi_ptr = cnvRbAry2pt(n, yi)
  yi_1_ptr = heunMethodFFI(n, yi_ptr, h, func)
  yi_1 = cnvPt2RbAry(n, yi_1_ptr)
  return yi_1
end

.rungeKuttaMethod(yi, h, func) ⇒ double[]

4次のルンゲ=クッタ法による数値計算

yi_1 = rungeKuttaMethod(yi, h, func)

Parameters:

  • yi (double[])

    xiに対するyiの値(配列)

  • h (double)

    刻み幅

  • func (callback)

    xiに対する傾きを計算する関数

Returns:

  • (double[])

    xi+hに対するyi_1の値(配列)



75
76
77
78
79
80
81
# File 'lib/num4simdiff.rb', line 75

def rungeKuttaMethod(yi, h, func)
  n = yi.size
  yi_ptr = cnvRbAry2pt(n, yi)
  yi_1_ptr = rungeKuttaMethodFFI(n, yi_ptr, h, func)
  yi_1 = cnvPt2RbAry(n, yi_1_ptr)
  return yi_1
end

Instance Method Details

#f(n, yn) {|n, yn| ... } ⇒ pointer

dy = f(n, yn)

Yields:

  • (n, yn)

    dy = f(n, yn)

Yield Parameters:

  • n (int)

    ynの個数

  • yn (pointer)

    FFI::Pointer

Returns:

  • (pointer)

    xiに対するyの値(FFI::Pointer)



16
# File 'lib/num4simdiff.rb', line 16

callback   :f, [:int, :pointer], :pointer