2016-02-06 3 views
0

Имеет проблему здесь. Вот мой код:Использование nquad для двойного интеграла

from scipy import integrate 
import math 
import numpy as np 

a = 0.250 
s02 = 214.0 
a_s = 0.0163 

def integrand(r, R, s02, a_s, a): 
     return 2.0 * r * (r/a)**(-0.1) * (1.0 + (r**2/a**2))**(-2.45)\\ 
*(math.sqrt(r**2 - R**2))**(-1.0) * (a_s/(1 + (R-0.0283)**2/a_s**2)) 

def bounds_R(s02, a_s, a): 
     return [0, np.inf] 
def bounds_r(R, s02, a_s, a): 
     return [R, np.inf] 

result = integrate.nquad(integrand, [bounds_r(R, s02, a_s, a), bounds_R(s02, a_s, a)]) 

a, s02 и a_s являются константами. Мне нужно выполнить первый интеграл по r, а затем второй интеграл над R. Задача, на мой взгляд, состоит в том, что R появляется в пределах первого интеграла (что называется преобразованием Абеля). Пробовал несколько вещей и каждый раз получал ошибку, что в граничных функциях слишком мало аргументов или слишком мало.

Пожалуйста, помогите!

+1

Мне нужно вычислить преобразование Абеля, вы можете просто использовать один из уже реализованных алгоритмов в https://github.com/PyAbel/PyAbel, который будет более эффективен с точки зрения вычислительной эффективности, чем использование 'quad'. – rth

ответ

3

Если вы пишете integrate.nquad(integrand, [bounds_r(R, s02, a_s, a), bounds_R(s02, a_s, a)]), python ожидает, что вы повлияете на значение до R. Но вы этого не сделали, потому что интеграция осуществляется через R.

Этот синтаксис должен работать:

result = integrate.nquad(integrand, [bounds_r, bounds_R], args=(s02,a_s,a)) 

Посмотрите второй пример в documentation of integrate.nquad.

+0

Спасибо, это сработало в конце, но, похоже, проблема возникает, когда я действительно хочу передать значение для второго интеграла. Поэтому он работает Ok, если я ставлю числовое значение для R в определении границ, но мне нужно выполнить этот интеграл в цикле для разных значений R, и я не могу найти способ сделать это иначе, чем переопределить мои границы каждый шаг в цикле. – Anna

+1

, который, конечно же, решается путем использования этого значения в качестве одного из аргументов в подынтегральном выражении. Спасибо! – Anna

+0

Да, вам нужно определить дополнительный аргумент в ваших подынтегральных функциях и функциях границ, чтобы добавить это значение в третий аргумент nquad (args = ...). Направьте мой ответ, если это вам помогло;) – cromod