2016-04-19 12 views
1

私は複素数でscipy.optimize.leastsqを使用しようとしています。私はすでにこれについていくつかの質問があることを知っていますが、私はまだ複雑な数から実数へのキャストに不平を言う私の簡単な例を得ることができません。私はそれをしなかった場合Scipyの複素数の最小値

権利を解決するには、以下のx=[1+1j,2j]次のようになります。

import numpy as np 
from scipy.optimize import leastsq 

def cost_cpl(x,A,b): 
    return np.abs(np.dot(A,x)-b) 

A=np.array([[1,1],[2j,0]],dtype=np.complex128) 
b=np.array([1+3j,-2+2j],dtype=np.complex128) 
x,r=leastsq(cost_cpl,np.array([0+0j,0+0j]),args=(A,b)) 
print x 
print r 

しかし、私は

TypeError: Cannot cast array data from dtype('complex128') to dtype('float64') according to the rule 'safe' 

EDITを取得しています:私はnp.array([0+0j,0+0j])からnp.array([0,0])に最初の推測を変更した場合関数が実行されますが、私は間違った答え(実際のもの)を取得します。

答えて

2

leastsq()は実数のみを受け入れることができるので、実際の配列と複素数配列を変換するには.view()メソッドを使用する必要があります。

import numpy as np 
from scipy.optimize import leastsq 

def cost_cpl(x, A, b): 
    return (np.dot(A, x.view(np.complex128)) - b).view(np.double) 

A = np.array([[1,1],[2j,0]],dtype=np.complex128) 
b = np.array([1+3j,-2+2j],dtype=np.complex128) 
init = np.array([0.0, 0.0, 0.0, 0.0]) 
x, r = leastsq(cost_cpl, init, args=(A, b)) 
print(x.view(np.complex128)) 

出力:

array([ 1.00000000e+00+1.j, 4.96506831e-16+2.j]) 
関連する問題