Module Jacobian
In: bigdecimal/jacobian.rb

jacobian.rb

Computes Jacobian matrix of f at x

Methods

dfdxi   isEqual   jacobian  

Public Instance methods

[Source]

    # File bigdecimal/jacobian.rb, line 21
21:   def dfdxi(f,fx,x,i)
22:     nRetry = 0
23:     n = x.size
24:     xSave = x[i]
25:     ok = 0
26:     ratio = f.ten*f.ten*f.ten
27:     dx = x[i].abs/ratio
28:     dx = fx[i].abs/ratio if isEqual(dx,f.zero,f.zero,f.eps)
29:     dx = f.one/f.ten     if isEqual(dx,f.zero,f.zero,f.eps)
30:     until ok>0 do
31:       s = f.zero
32:       deriv = []
33:       if(nRetry>100) then
34:          raize "Singular Jacobian matrix. No change at x[" + i.to_s + "]"
35:       end
36:       dx = dx*f.two
37:       x[i] += dx
38:       fxNew = f.values(x)
39:       for j in 0...n do
40:         if !isEqual(fxNew[j],fx[j],f.zero,f.eps) then
41:            ok += 1
42:            deriv <<= (fxNew[j]-fx[j])/dx
43:         else
44:            deriv <<= f.zero
45:         end
46:       end
47:       x[i] = xSave
48:     end
49:     deriv
50:   end

[Source]

    # File bigdecimal/jacobian.rb, line 7
 7:   def isEqual(a,b,zero=0.0,e=1.0e-8)
 8:     aa = a.abs
 9:     bb = b.abs
10:     if aa == zero &&  bb == zero then
11:           true
12:     else
13:           if ((a-b)/(aa+bb)).abs < e then
14:              true
15:           else
16:              false
17:           end
18:     end
19:   end

[Source]

    # File bigdecimal/jacobian.rb, line 52
52:   def jacobian(f,fx,x)
53:     n = x.size
54:     dfdx = Array::new(n*n)
55:     for i in 0...n do
56:       df = dfdxi(f,fx,x,i)
57:       for j in 0...n do
58:          dfdx[j*n+i] = df[j]
59:       end
60:     end
61:     dfdx
62:   end

Search

Google

Ruby API Docs

Links