我正在尝试将 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])
该函数运行,但我得到了错误的答案(真实的答案)。
最佳答案
由于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])
关于python - Scipy 的复数最小平方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36715067/