Module: Jacobian
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Included In:
| |
Defined in: | ext/bigdecimal/lib/bigdecimal/jacobian.rb |
Class Method Summary
- .dfdxi(f, fx, x, i) mod_func
-
.isEqual(a, b, zero = 0.0, e = 1.0e-8)
mod_func
Determines the equality of two numbers by comparing to zero, or using the epsilon value.
-
.jacobian(f, fx, x)
mod_func
Computes the
Jacobian
of f at x.
Class Method Details
.dfdxi(f, fx, x, i) (mod_func)
[ GitHub ]# File 'ext/bigdecimal/lib/bigdecimal/jacobian.rb', line 48
def dfdxi(f,fx,x,i) nRetry = 0 n = x.size xSave = x[i] ok = 0 ratio = f.ten*f.ten*f.ten dx = x[i].abs/ratio dx = fx[i].abs/ratio if isEqual(dx,f.zero,f.zero,f.eps) dx = f.one/f.ten if isEqual(dx,f.zero,f.zero,f.eps) until ok>0 do deriv = [] nRetry += 1 if nRetry > 100 raise "Singular Jacobian matrix. No change at x[" + i.to_s + "]" end dx = dx*f.two x[i] += dx fxNew = f.values(x) for j in 0...n do if !isEqual(fxNew[j],fx[j],f.zero,f.eps) then ok += 1 deriv <<= (fxNew[j]-fx[j])/dx else deriv <<= f.zero end end x[i] = xSave end deriv end
.isEqual(a, b, zero = 0.0, e = 1.0e-8) (mod_func)
Determines the equality of two numbers by comparing to zero, or using the epsilon value
# File 'ext/bigdecimal/lib/bigdecimal/jacobian.rb', line 31
def isEqual(a,b,zero=0.0,e=1.0e-8) aa = a.abs bb = b.abs if aa == zero && bb == zero then true else if ((a-b)/(aa+bb)).abs < e then true else false end end end
.jacobian(f, fx, x) (mod_func)
Computes the Jacobian
of f at x. fx is the value of f at x.
# File 'ext/bigdecimal/lib/bigdecimal/jacobian.rb', line 80
def jacobian(f,fx,x) n = x.size dfdx = Array.new(n*n) for i in 0...n do df = dfdxi(f,fx,x,i) for j in 0...n do dfdx[j*n+i] = df[j] end end dfdx end