| Module | Jacobian |
| In: |
bigdecimal/jacobian.rb
|
Public Instance methods
# 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
# 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