Scipy最简单的复杂数字

时间:2016-04-19 10:01:03

标签: python numpy scipy complex-numbers least-squares

我试图使用复杂数字的scipy.optimize.leastsq。我知道已经有一些关于这方面的问题,但我仍然无法让我的简单示例工作,这是抱怨从复杂到实数的转换。

如果我做对了,下面的解决方案应该是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'

编辑:如果我将第一个猜测从np.array([0+0j,0+0j])更改为np.array([0,0]),则该函数会运行,但我得到了错误的答案(真实答案)。

1 个答案:

答案 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])