Python TypeError для кода поиска корня (пакет QuantEcon)

Итак, новичок в 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.

У вас есть трассировка стека, связанная с этой ошибкой, которую вы можете предоставить? Если да, добавьте его к своему вопросу. Это должно сказать нам, какая строка вызывает эту ошибку, что было бы очень полезно знать.

CryptoFool 24.12.2020 08:17

В строке x_bar = newton(ces_d - ud, 0 ,ces_d2, args) - нет ли - операции между функциональным объектом (ces_d) и ud, который предположительно является целым числом?

Aivar Paalberg 24.12.2020 08:34

@Steve, я добавил трассировку стека, большое спасибо, что сообщили мне

GildedCrowEscapee 24.12.2020 10:05

@ Айвар Паалберг, да, спасибо, что указали на это! тогда мне придется переделывать эту функцию

GildedCrowEscapee 24.12.2020 10:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Трудно сказать наверняка только по предоставленной вами информации (т.е. без трассировки стека), но я думаю, что понимаю, что происходит. Я предполагаю, что ошибка вызвана этой строкой кода:

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 — просто константа. Теперь я вижу свою ошибку, поскольку первый аргумент тоже должен быть функцией. Я изменю свой код по сравнению с предыдущим и посмотрю, чем это закончится. Еще раз большое спасибо за помощь новичку в этом деле.

GildedCrowEscapee 24.12.2020 10:06

Возможно, вы также знаете источник ошибки jit? Похоже, что это происходит с ces_d2 в связи с ошибкой CPUDispatcher.

GildedCrowEscapee 24.12.2020 10:47

Я не понимаю, о чем вы спрашиваете... что вы подразумеваете под "ошибкой jit".

CryptoFool 24.12.2020 17:44

Извините, я имел в виду ошибку, связанную с джиттингом моей функции ces_d2.

GildedCrowEscapee 25.12.2020 04:50

Другие вопросы по теме