#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. Большое вам спасибо, я проверю все, на что вы указали!