用函数a.cos(b-psi)+ c导出雅可比行列式得到0

时间:2014-03-07 11:59:03

标签: python scipy mathematical-optimization

我有一个具有cosinus形状的数据集。我尝试用这个函数拟合这个数据集:

a.cos(b-psi)+c

我的目标是估算最适合我的数据的参数a,b和c。所以我尝试使用scipy.leastsq来最小化这个:data-a.cos(b-psi)+c

(psi与数据一起找到)。

我的首字母参数是ndarray x (x=np.array([a0,b0,c0])),我的数据存储在元组args=(psi,data)中,我有我的功能:

def func(x, *args):
psi = args[0].ravel()
data = args[1].ravel()
return np.array(data - (x[0]*np.cos(x[1]-psi) + x[2]))

然后我使用以下行启动scipy.leastsq:

xopt = leastsq(coreg.func,x0,args,full_output=1)

(带初始参数:)

Out[30]: array([ 3.8,  1.3,  0. ])

但结果如下:

(array([ 3.8,  1.3,  0. ]),
None,
{'fjac': array([[ nan,  nan,  nan, ...,  nan,  nan,  nan],
       [ nan,  nan,  nan, ...,  nan,  nan,  nan],
       [ nan,  nan,  nan, ...,  nan,  nan,  nan]]),
  'fvec': array([-3.17913524, -2.19610415, -2.06748506, ...,  1.76355583,
    2.32077375,  2.89394884]),
  'ipvt': array([1, 2, 3], dtype=int32),
  'nfev': 4,
  'qtf': array([ nan,  nan,  nan])},
 'The cosine of the angle between func(x) and any column of the\n  Jacobian is at most     0.000000 in absolute value',
4)

我不知道为什么它无法计算雅可比行列式,我认为这就是为什么它给了我与我最初相同的参数。

如果它可以提供帮助,则每个对象的值都是:

Variable   Type        Data/Info
--------------------------------
args       tuple       n=2
np         module      <module 'numpy' from '/us<...>ages/numpy/__init__.pyc'>
psi        ndarray     1201x1201: 1442401 elems, type `float64`, 11539208 bytes (11 Mb)
data     ndarray     1201x1201: 1442401 elems, type `float64`, 11539208 bytes (11 Mb)
x          ndarray     3: 3 elems, type `float64`, 24 bytes

2 个答案:

答案 0 :(得分:0)

您的函数的雅可比矩阵易于分析写出。提供给最小呼叫。

答案 1 :(得分:0)

感谢您的回答!

所以我像这样进入jacobian? (抱歉,我是python的初学者)

def jacobi(x,*args):
  psi = args[0].ravel()
  target = args[1].ravel()
  return -x[0]*np.sin(x[1]-psi)

但是这里有什么回来:

/usr/lib64/python2.7/site-packages/scipy/optimize/minpack.pyc in leastsq(func, 
x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, 

epsfcn,factor,diag)                                              
367             _check_func('leastsq', 'Dfun', Dfun, x0, args, n,  (n,m))                              
368         else:                                                                                     
--> 369             _check_func('leastsq', 'Dfun', Dfun, x0, args, n, (m,n))                              
370         if (maxfev == 0):                                                                         
371             maxfev = 100*(n + 1)                                                                  

/usr/lib64/python2.7/site-packages/scipy/optimize/minpack.pyc in _check_func
(checker, argname, thefunc, x0, args, numinputs,   
output_shape)                                                                          
     28             else:
     29                 msg += "."
---> 30             raise TypeError(msg)
     31     if issubdtype(res.dtype, inexact):
     32         dt = res.dtype

TypeError: leastsq: there is a mismatch between the input and output shape of the  
'Dfun' argument 'jacob'.