Python 寻根代码的类型错误(QuantEcon 包)

Python TypeError for Root-Finding Code(QuantEcon Package)

所以初学者 Python,用它来进行经济研究。我目前正在尝试 运行 使用 Newton-Ralphson 方法 (https://quanteconpy.readthedocs.io/en/latest/optimize/root_finding.html) 编写代码来查找 CES 函数的根。

但是,我 运行 在这里遇到一个错误

“TypeError:不支持的操作数类型 -:'CPUDispatcher' 和 'int'”。我不知道这意味着什么(我在 Python 3.8 中使用 Spyder)所以任何帮助将不胜感激。我的代码附在下面。

###QuantEcon Method###
from quantecon.optimize.root_finding import newton
from numba import jit

@jit 
def ces(x,y,s):
    U = (x**s + y**s)**(1/s)
    return U

@jit
def ces_d(x,y,s):
    U_x = (x**(s-1))*(x**s + y**s)**((1-s)/s) #analytical form hand-derived
    return U_x

@jit
def ces_d2(x,y,s):
    U_xx = (s-1)*x**(s-2)*y**s*(x**s + y**s)**(1/s-2)
    return U_xx

#root/inv of ces
def ces_inv(y,s,ud):
 args = (y,s) #order must be preserved
 x_bar = newton(ces_d - ud, 0 ,ces_d2, args)
 return x_bar

print(ces_inv(2,3,4))

我得到的错误是

"TypeError: unsupported operand type(s) for -: 'CPUDispatcher' and 'int'"

编辑:感谢您让我知道所有,我忘记附上 stracktrace。我已经把它贴在下面了(我还是个初学者所以如果正确请告诉我)。

    runcell(0, 'C:/Users/Orphanides/Documents/XXXX Projects/XXXX/Python/Draft.py')
    Traceback (most recent call last):

    File "C:\Users\Orphanides\Documents\XXXX\XXXX\Python\Draft.py", line 27, in <module>
print(ces_inv(2,3,4))

    File "C:\Users\Orphanides\Documents\XXXX Projects\XXXX\Python\Draft.py", line 24, in ces_inv
x_bar = newton(ces_d - ud, 0 ,ces_d2, args)

    TypeError: unsupported operand type(s) for -: 'CPUDispatcher' and 'int'

EDIT2:谢谢大家帮我解决这个问题。我已经修复了如下代码,但现在唯一的问题是 jitted 函数 ces_d2:

代码:

###QuantEcon Method###
from quantecon.optimize.root_finding import newton
from numba import jit

@jit 
def ces(x,y,s):
    U = (x**s + y**s)**(1/s)
    return U

@jit
def ces_d(x,y,s):
    U_x = (x**(s-1))*(x**s + y**s)**((1-s)/s) #analytical form hand-derived
    return U_x

@jit
def ces_dd(x,y,s,ud):
    U_xd = ces_d(x,y,s) - ud
    return U_xd 

@jit
def ces_d2(x,y,s):
    U_xx = (s-1)*x**(s-2)*y**s*(x**s + y**s)**(1/s-2) 
    return U_xx

#root/inv of ces
def ces_inv(y,s,ud):
 args = (y,s,ud) #order must be preserved
 x_bar = newton(ces_dd, 0 ,ces_d2, args)
 return x_bar

print(ces_inv(2,3,4))

堆栈跟踪: 运行文件('C:/Users/Orphanides/Documents/RA Projects/Isabella/Python/CES Functions/untitled1.py', wdir='C:/Users/Orphanides/Documents/RA Projects/Isabella/Python/CES Functions') 追溯(最近一次通话最后一次):

  File "C:\Users\Orphanides\Documents\RA Projects\Isabella\Python\CES Functions\untitled1.py", line 32, in <module>
    print(ces_inv(2,3,4))

  File "C:\Users\Orphanides\Documents\RA Projects\Isabella\Python\CES Functions\untitled1.py", line 29, in ces_inv
    x_bar = newton(ces_dd, 0 ,ces_d2, args)

  File "C:\Users\Orphanides\anaconda3\lib\site-packages\numba\core\dispatcher.py", line 415, in _compile_for_args
    error_rewrite(e, 'typing')

  File "C:\Users\Orphanides\anaconda3\lib\site-packages\numba\core\dispatcher.py", line 358, in error_rewrite
    reraise(type(e), e, None)

  File "C:\Users\Orphanides\anaconda3\lib\site-packages\numba\core\utils.py", line 80, in reraise
    raise value.with_traceback(tb)

TypingError: Internal error at <numba.core.typeinfer.CallConstraint object at 0x000001A489CE40D0>.
too many positional arguments
During: resolving callee type: type(CPUDispatcher(<function ces_d2 at 0x000001A488BF3670>))
During: typing of call at C:\Users\Orphanides\anaconda3\lib\site-packages\quantecon\optimize\root_finding.py (89)

Enable logging at debug level for details.

仅凭您提供的信息(即没有堆栈跟踪)很难确定,但我想我知道发生了什么。我猜测错误是由这行代码引发的:

x_bar = newton(ces_d - ud, 0 ,ces_d2, args)

查看您的其余代码,ces_d 是一个函数引用,ud 是一个 int。从函数引用中减去整数值没有意义。这就是此错误消息告诉您的内容。我不明白为什么 ces_d 函数被报告为 CPUDispatcher 类型,但我希望它与 @jit 装饰器有关。在任何情况下,表达式 ces_d - ud 都没有意义。

我看了一下 newton 方法,它接受的第一个参数是可调用的,因此您将 ces_d 作为第一个参数传递似乎很有意义。但是,为什么要在将 ud 传递给 newton 方法之前尝试从中减去它?正如我之前解释的那样,这似乎不正确,并且在逻辑上没有任何意义。