python - Scipy 的复数最小平方

标签 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]) 该函数运行,但我得到了错误的答案(真实的答案)。

最佳答案

由于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/

相关文章:

python - 在 Gephi 中可视化 networkx 图

python - Python 列表中的组合

python - 从 pandas 数据框中重新排列条形图中的分组

python - Pandas 一行数据透视表返回一个系列而不是数据框

python - Numpy 规范化代码出奇地慢

带有函数参数的 Python 装饰器

python - Savitzky-Golay 过滤在 1D 中给出不正确的导数

python - PIL属性错误: Shape when creating an array

python - 无法存储numpy.ndarray'对象没有属性 'save'

python - 如何用 numpy 计算统计信息 "t-test"