Как интегрировать комплексную (не в реальном или сложном определении) функцию
У меня есть это выражение монстра для распределения давления вокруг сферы, выражение где Re[A] - действительная компонента предопределенного коэффициента, P - многочлены Легендры, а j и n - сферические функции Бесселя и Неймана. Я хочу интегрировать это через тета, поэтому я определил функцию для уравнения выше следующим образом
def P_rms_calc(k,a,n_max,theta): # Return the P_rms function
# Obtain Coefficients
A_m = A_m_coeff(k,a,P_a,l,z0,n_max)
P_t = []
for m in range(n_max):
for l in range(m+1):
P_t.append(0.5*numpy.real(A_m[l])*numpy.real(A_m[m-l])*(legendre(l)(numpy.cos(theta)))*(legendre(m-l)(numpy.cos(theta)))*((spherical_jn(l,k*r)*spherical_jn(m-l,k*r))+
(spherical_yn(l,k*r)*spherical_yn(m-l,k*r))))
P_rms = numpy.sqrt(sum(P_t))
return P_rms
Тем не менее, когда я пытаюсь интегрировать с помощью scipy.integrate.quad, вот так,
a0, err = quad(P_rms_calc(k,a,n_max,theta),-numpy.pi,numpy.pi)
он выдает "error: quad: первый аргумент не может быть вызван". И если я не приведу аргументы функции, как это,
a0, err = (1/(2*numpy.pi))*quad(P_rms_calc,-numpy.pi,numpy.pi)
он дает 'TypeError: P_rms_calc() принимает ровно 8 аргументов (1 дано)'
Я скучаю по чему-то простому в использовании инструмента интеграции Quad? Если нет, то есть ли лучший способ попробовать и интегрировать это выражение? Не стесняйтесь также рекомендовать более эффективный способ определения среднеквадратичного выражения давления. Для справки, я суммирую только от m=0 до 6 или около того, так что время вычислений не страшно при использовании циклов for. Спасибо за помощь!
1 ответ
Использование args
аргумент для передачи дополнительных аргументов подынтегрального выражения:
>>> def func(x, a, b):
... return a * x**b
...
>>> quad(func, 0, 1, args=(1., 2.))
(0.33333333333333337, 3.700743415417189e-15)