Итак, новичок в Python, использующий его для экономических исследований. В настоящее время я пытаюсь запустить код, чтобы найти корни функции CES, используя метод Ньютона-Ральфсона (https://quanteconpy.readthedocs.io/en/latest/optimize/root_finding.html).
Тем не менее, я сталкиваюсь с ошибкой здесь, где говорится
«TypeError: неподдерживаемые типы операндов для -: CPUDispatcher и int». Я понятия не имею, что это значит (я использую Spyder для Python 3.8), поэтому любая помощь будет очень признательна. Мой код прикреплен ниже.
###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'"
Обновлено: Спасибо, что сообщили мне все, я забыл прикрепить трассировку. Я вставил его ниже (я все еще новичок, поэтому дайте мне знать, если это правильно).
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: Спасибо всем за помощь в этом. Я исправил код, как показано ниже, но теперь единственная проблема — это перегруженная функция 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))
Трассировки стека: runfile('C:/Users/Orphanides/Documents/RA Projects/Isabella/Python/CES Functions/untitled1.py', wdir='C:/Users/Orphanides/Documents/RA Projects/Isabella/Python/CES Functions') Traceback (последний последний вызов):
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, который предположительно является целым числом?
@Steve, я добавил трассировку стека, большое спасибо, что сообщили мне
@ Айвар Паалберг, да, спасибо, что указали на это! тогда мне придется переделывать эту функцию






Трудно сказать наверняка только по предоставленной вами информации (т.е. без трассировки стека), но я думаю, что понимаю, что происходит. Я предполагаю, что ошибка вызвана этой строкой кода:
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? Это кажется неправильным и не имеет логического смысла, как я объяснял ранее.
Эй, большое спасибо за ответ! Я включил ud из-за лежащей в основе теории, согласно которой я должен найти корень функции, скажем, f( ) = ces_d - ud, где ud — просто константа. Теперь я вижу свою ошибку, поскольку первый аргумент тоже должен быть функцией. Я изменю свой код по сравнению с предыдущим и посмотрю, чем это закончится. Еще раз большое спасибо за помощь новичку в этом деле.
Возможно, вы также знаете источник ошибки jit? Похоже, что это происходит с ces_d2 в связи с ошибкой CPUDispatcher.
Я не понимаю, о чем вы спрашиваете... что вы подразумеваете под "ошибкой jit".
Извините, я имел в виду ошибку, связанную с джиттингом моей функции ces_d2.
У вас есть трассировка стека, связанная с этой ошибкой, которую вы можете предоставить? Если да, добавьте его к своему вопросу. Это должно сказать нам, какая строка вызывает эту ошибку, что было бы очень полезно знать.