Ruby 2.4

Jacobian

module Jacobian

要求'bigdecimal / jacobian'

提供方法来计算点x处的一组方程的雅可比矩阵。在下面的方法中:

f是用于计算方程的雅可比矩阵的对象。它必须提供以下方法:

f.values(x)

返回x处所有函数的值

f.zero

returns 0.0

f.one

returns 1.0

f.two

returns 2.0

f.ten

returns 10.0

f.eps

返回用于确定两个值是否相等的收敛准则(ε值)。如果| ab | ε,这两个值被认为是相等的。

x是计算雅可比矩阵的点。

fx is f.values(x).

公共实例方法

dfdxi(f,fx,x,i) 显示源文件

计算x在f处的导数。fx是x处f的值。

# File ext/bigdecimal/lib/bigdecimal/jacobian.rb, line 44 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) Show source

通过比较零或使用epsilon值确定两个数字的相等性

# File ext/bigdecimal/lib/bigdecimal/jacobian.rb, line 27 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) 显示源文件

计算x处的f的雅可比矩阵。fx是x处f的值。

# File ext/bigdecimal/lib/bigdecimal/jacobian.rb, line 76 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