【问题标题】:Cannot cast array data from dtype('complex128') to dtype('float64') according to the rule 'safe'无法根据规则“安全”将数组数据从 dtype('complex128') 转换为 dtype('float64')
【发布时间】:2018-08-15 20:23:59
【问题描述】:

我正在尝试解决如下所示的优化问题。但每次我收到错误Cannot cast array data from dtype('complex128') to dtype('float64') according to the rule 'safe'。 谁能帮我看看代码中有什么问题?

def func(vec):

    linspec = -(kx**2)+((1.-nu)*(kx**4))
    lin = linspec*np.fft.fft(vec)
    nlin = np.zeros_like(lin)
    nlinre = vec*vec
    nlinspec = np.fft.fft(nlinre)
    nlin = (0.5*1j*kx*nlinspec)
    sol = lin+nlin
    rhs = np.zeros_like(sol, dtype='complex')
    sol -= rhs
    sol = np.fft.ifft(sol).real

    return sol

def kssol(u0):

    u1 = np.ones((2*Mx,), dtype='complex')
    #u1 = 100.*u0
    u = scipy.optimize.fsolve(func, u1)

    return u 

【问题讨论】:

    标签: python numpy optimization scipy complex-numbers


    【解决方案1】:

    scipy.optimize.fsolve 从 Rn ↦ R 中找到函数的根。你的函数 func 似乎是 Cn ↦ R,尤其是起点 @ 987654325@ 具有显式复杂类型(尽管它的值是真实的),而这正是错误所说的。

    如果您的输入始终是真实的,只需将dtype='float' 设置为u1。否则,您必须使用不同的功能进行优化,例如mpmath.findroot 来自 sympy。

    【讨论】: