Как исправить тип » int » без len()?

#python #numpy #scipy #quad

Вопрос:

Я не могу понять, что не так с этим кодом. Кто-нибудь может мне помочь, пожалуйста? Это подынтегральное выражение типа Парето II от 1 до бесконечности, а a и b являются параметрами распределения. Ошибка типа: объект типа » int » не имеет len() -> это ошибка, когда я пытаюсь вычислить E

 import numpy as np
from scipy.integrate import quad
from mpmath import *

def integrand(a, b, x):
    return x*a(b**a)/((x 1)**a)

a = 3                                                                                     
b = 2

E = quad(integrand, 1, np.inf, args=(a, b))
E
 

Комментарии:

1. Куда ты звонишь Лену ()? Кроме того, я бы избегал использования имен переменных из одной буквы, так как это значительно затрудняет чтение и понимание кода. Действительно трудно сказать, что вы на самом деле здесь делаете, и я не могу дать отличный ответ.

2. Это статистическая проблема. Это интергранд типа II по Парето от 1 до бесконечности, а a и b-параметры распределения. Ошибка типа: объект типа » int » не имеет len() -> это ошибка, когда я пытаюсь вычислить E

3. Зачем импортировать mpmath ?

Ответ №1:

Это похоже на ошибку импорта для меня ,и scipy,и mpmath имеют реализацию для метода quad, поэтому, чтобы код работал, придется удалить инструкцию импорта mpmath. Я мог бы запустить код, как показано ниже..получение переполнения при большом значении верхнего предела

 import numpy as np
from scipy import integrate
#from scipy.integrate import quad
from mpmath import *

def intergrand(a, b, x):
    return x*a*(b**a)/((x b)**a)
a = 3                                                                                     
b = 2

E = integrate.quad(intergrand,1, 100, args=(a, b))
print(E)
 

Ответ №2:

Удалите строку

 from mpmath import *
 

из вашего кода.

mpmath имеет quad функцию, поэтому , когда вы это делаете from mpmath import * , вы перезаписываете имя, импортированное из SciPy. Вы получили ошибку TypeError: object of type 'int' has no len() mpmath , потому что версия s quad ожидает, что второй аргумент будет иметь форму [a, b] , но вы ее передали 1 .

Комментарии:

1. Спасибо вам за ваш ответ. Если я это сделаю, это даст мне еще одну ошибку: ошибка типа: подынтегральное выражение() принимает 2 позиционных аргумента, но было дано 3

2. Есть и другие проблемы; было бы полезно, если бы вы протестировали функцию, показанную в вопросе, чтобы убедиться, что она правильно возвращает значение при вызове. Когда я это делаю integrand(1, 2, 3) , я получаю ошибку, потому что в вычисляемом выражении есть ошибка (возможно, отсутствует * ).

3. Кроме того, еще раз взгляните на строку документа для scipy.integrate.quad . Вы увидите, что он ожидает, что переменная интеграции будет первым параметром подынтегральной функции, поэтому сигнатура вашей подынтегральной функции должна быть def integrand(x, a, b) такой .

4. Большое вам спасибо, я проверю все, на что вы указали!