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