Python 优化非线性方程组-处理复数

Python 优化非线性方程组-处理复数,python,numpy,complex-numbers,Python,Numpy,Complex Numbers,我试图解一个非线性方程组。问题是,解决方案很复杂,根据Octave/Matlab,虚部很小。我正试图将这一点转移到python上,但不幸的是,我不确定应该如何优雅地处理这一点 在倍频程中,我可以直接使用fsolve,然后通过“real”函数传递解,得到数字的实部。问题是,它可以轻松地解决问题,而不会返回任何错误 不幸的是,在python中使用numpy在尝试求解方程时会返回错误。以下是用Python编写的方程式: import numpy as np from scipy.optimize im

我试图解一个非线性方程组。问题是,解决方案很复杂,根据Octave/Matlab,虚部很小。我正试图将这一点转移到python上,但不幸的是,我不确定应该如何优雅地处理这一点

在倍频程中,我可以直接使用fsolve,然后通过“real”函数传递解,得到数字的实部。问题是,它可以轻松地解决问题,而不会返回任何错误

不幸的是,在python中使用numpy在尝试求解方程时会返回错误。以下是用Python编写的方程式:

import numpy as np
from scipy.optimize import fsolve
import scipy.io as spio

params = dict()
params['cbeta'] = 0.96
params['cdelta'] = 0.1
params['calpha'] = 0.33
params['cgamma'] = 1.2
params['clambda']= 1.0
params['csigma'] = 0.8
params['etau'] = 0.0

def steady_s(vars0):
    # unpacking paramters
    cbeta = params['cbeta']
    cdelta = params['cdelta']
    calpha = params['calpha']
    cgamma = params['cgamma']
    clambda= params['clambda']
    csigma = params['csigma']

    # guesses for initial values
    c = vars0[0]
    y = vars0[1]
    k = vars0[2]
    g = vars0[3]
    r = vars0[4]

    # == functions to minimize to find steady states == #
    f = np.empty((5,))

    # HH Euler
    f[0] = (1.0/c)*cbeta*(r + 1.0 - cdelta) - (1.0+g)/c

    # Goods market clearing
    f[1] = y - c - k*(1.0 + g) + k*(1.0-cdelta)

    # Capital Market clearing
    f[2] = r - (k)**(calpha-1.0)*calpha**2.0

    # production function for final good
    f[3] = y - k**calpha

    # growth rate
    pi = (calpha - 1.0) * k**calpha #small pi, this isnt actual profits
    f[4] = g - (cgamma - 1.0) * clambda * (csigma*clambda*pi)**(csigma/(1.0-csigma))

    return f

# == Initial Guesses == #
vars0 = np.ones((5,))

# == Solving for Steady State == #

xss = fsolve(steady_s, vars0)
在倍频程中实现同样的功能可以提供以下解决方案:

 Columns 1 through 3:

   0.7851388 + 0.0000000i   0.8520544 + 0.0000000i   0.6155938 + 0.0000000i

 Columns 4 and 5:

   0.0087008 - 0.0000000i   0.1507300 - 0.0000000i
我把这个解通过“实”函数的倍频程,得到我想要的结果

特别是,python甚至在一次求解方程时都有困难。特别是,如果我尝试在定义了所有参数的函数外部运行f[4],它将返回一个nan值

任何帮助都将不胜感激


事先向我错过的/格式错误的任何内容道歉。

事实上,scipy正在与复数作斗争。然而,一个名为mpmath的项目可以解决您的问题。此处:。它过去常与sympy(sympy.org)一起提供。您可以找到文档:此解决方案适用于我:

from mpmath import findroot
import numpy as np
import scipy.io as spio

params = dict()
params['cbeta'] = 0.96
params['cdelta'] = 0.1
params['calpha'] = 0.33
params['cgamma'] = 1.2
params['clambda']= 1.0
params['csigma'] = 0.8
params['etau'] = 0.0

def steady_s(c,y,k,g,r):
    # unpacking paramters
    cbeta = params['cbeta']
    cdelta = params['cdelta']
    calpha = params['calpha']
    cgamma = params['cgamma']
    clambda= params['clambda']
    csigma = params['csigma']

    # guesses for initial values
    #c = vars0[0]
    #y = vars0[1]
    #k = vars0[2]
    #g = vars0[3]
    #r = vars0[4]

    # == functions to minimize to find steady states == #
    f = [0,0,0,0,0]

    # HH Euler
    f[0] = (1.0/c)*cbeta*(r + 1.0 - cdelta) - (1.0+g)/c

    # Goods market clearing
    f[1] = y - c - k*(1.0 + g) + k*(1.0-cdelta)

    # Capital Market clearing
    f[2] = r - (k)**(calpha-1.0)*calpha**2.0

    # production function for final good
    f[3] = y - k**calpha

    # growth rate
    pi = (calpha - 1.0) * k**calpha #small pi, this isnt actual profits
    f[4] = g - (cgamma - 1.0) * clambda * (csigma*clambda*pi)**(csigma/(1.0-csigma))

    return f

# == Initial Guesses == #
vars0 = list(np.ones((5,)))

# == Solving for Steady State == #
xss = findroot(steady_s, vars0)

工作起来很有魅力!谢谢你