Ошибка четырехъядерной производной метода численного интегрирования

Ниже я определил ряд функций, вставив конечную функцию fA для численного интегрирования. Интеграция выполняется по одной переменной, поэтому другие аргументы передаются как числовые, чтобы метод интеграции (quad) мог продолжаться.

import numpy 
import math as m
import scipy
import sympy

#define constants                                                                                                                                                                    
gammaee = 5.55e-6
MJpsi = 3.096916
alphaem = 1/137
lambdasq = 0.09
Ca = 3
qOsq = 2


def qbarsq(qsq):
    return (qsq+MJpsi**2)/4


def xx(qbarsq, w):
    return 4*qbarsq/(4*qbarsq-MJpsi**2+w**2)

from sympy import *

x,NN,a,b,ktsq,qbarsq,w = symbols('x NN a b ktsq qbarsq w')


def xg(a,b,NN,ktsq,x):
    return NN*(x**(-a))*(ktsq**b)*exp(sqrt((16*Ca/9)*log(1/x)*log((log(ktsq/lambdasq))/(log(qOsq/lambdasq)))))


#prints symbolic derivative of xg                                                                                                                                                    
def func(NN,a,b,x,ktsq):
    return (-x*diff(log(xg(a,b,NN,ktsq,x)),x))
#print(func(NN,a,b,x,ktsq))                                                                                                                                                          



#prints symbolic expression for Rg                                                                                                                                                   
def Rg(NN,a,b,ktsq,x):
    return 2**(2*func(NN,a,b,x,ktsq)+3)/sqrt(m.pi)*gamma(func(NN,a,b,x,ktsq)+5/2)/gamma(func(NN,a,b,x,ktsq)+4)
#print(Rg(NN,a,b,ktsq,x))

#prints symbolic expression for Fktsq                                                                                                                                                
def FktsqDeriv(NN,a,b,x,ktsq):
    return diff(Rg(NN,a,b,ktsq,x)*xg(a,b,NN,ktsq,x),ktsq)
#print(FktsqDeriv(NN,a,b,x,ktsq))                                                                                                                                                   


def Fktsq1(qbarsq,ktsq,NN,a,b,w):
    return FktsqDeriv(NN,a,b,x,ktsq).subs(x,4*qbarsq/(4*qbarsq-MJpsi**2+w**2))
print(Fktsq1(qbarsq,ktsq,NN,a,b,w))

# symbolic expression for fA                                                                                                                                                         
def fA(qbarsq,ktsq,NN,a,b,w):
    return Fktsq1(qbarsq,ktsq,NN,a,b,w)*1/(qbarsq)*1/(qbarsq+ktsq)
#print(fA(qbarsq,ktsq,NN,a,b,w))

Теперь я хочу интегрировать эту последнюю функцию в ktsq следующим образом:

import scipy.integrate.quadrature as sciquad
def integrated_f(NN,a,b,w,qbarsq):
    return sciquad(fA,1,(w**2-MJpsi**2)/4, args=(NN, a, b, w, qbarsq))

a=0.1
NN=0.5
b=-0.2
w=89
qbarsq=5
result = integrated_f(NN,a,b,w,qbarsq)
print(result)

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

ValueError: Can't calculate 1st derivative wrt 989.426138911118.

Моя единственная интерпретация этого состоит в том, что метод не может справиться со сложностью функции (хотя я думаю, что он относительно прост по структуре), потому что я не определял больше никаких производных и уж точно не по отношению к этому значению. Есть ли простое решение? На самом деле я хочу использовать функцию integrated_f для использования в задаче оптимизации для наилучшего соответствия параметрам a,b,NN. Что-то вроде

scipy.optimize.minimize(integrated_f, x0, method='Nelder-Mead', options={'max\ iter': 1000}) подходит для функций с несколькими переменными, где x0 — это массив начальных предположений. Спасибо!


person CAF    schedule 26.01.2018    source источник
comment
Функция diff не определена в вашем коде. Это из numpy или sympy? Было бы полезно, если бы вы создали минимальный, полный и проверяемый пример, который мы могли бы скопировать и запустить, чтобы воспроизвести проблему.   -  person Warren Weckesser    schedule 26.01.2018
comment
@WarrenWeckesser diff из sympy, импортировано через from sympy import *. Что касается минимального, полного и проверяемого примера, как упоминалось в моем вопросе, проблема специфична для функций, которые я определил, потому что у меня не было проблем с кодом с другими тестами fA. Когда я говорю, что проблема «специфична», я на самом деле имею в виду «кажется», потому что я не вижу другого способа интерпретировать эти производные ошибки, которые, вероятно, возникают из-за какой-то основной проблемы дифференцируемости в моей функции или в том, как метод ее обрабатывает. . Спасибо!   -  person CAF    schedule 26.01.2018
comment
Хорошо, но код, который вы показываете, не запускается сам по себе. Можете ли вы исправить это, чтобы он работал? Я подозреваю, что проблема заключается в передаче неверного аргумента функции sympy.   -  person Warren Weckesser    schedule 26.01.2018
comment
@WarrenWeckesser Я думаю, что первый блок можно запустить (если я раскомментирую print(fA(qbarsq,ktsq,NN,a,b,w)), я получу возвращенную мне функцию), но со вторым блоком, включенным в метод интеграции, это не так. Если я закомментирую все ниже a=0.1 во втором блоке, он станет работоспособным. Вы находите то же самое? Моя проблема заключается в том, как заставить работать оператор печати (результат).   -  person CAF    schedule 26.01.2018
comment
Код в функциях имел неправильный отступ (сейчас исправлено). quad не может обрабатывать любые симпатичные выражения. Функция, которую нужно интегрировать с quad, должна принимать значение с плавающей запятой в качестве первого аргумента и возвращать значение с плавающей запятой. Любые оставшиеся аргументы, указанные с помощью args, должны быть указаны в том же порядке, что и остальные аргументы интегрируемой функции. В вашем коде сейчас вы пытаетесь интегрировать f_A с аргументом qbarsq, а args=((NN, a, b, w, qbarsq)) назначает оставшиеся аргументы как ktsq=NN, NN=a, a=b, b=w, w=qbarsg.   -  person Warren Weckesser    schedule 26.01.2018
comment
@WarrenWeckesser Ах, я этого не осознавал. Итак, я должен определить fA как fA(ktsq,qbarsq,NN,a,b,w), Integrated_f как integrated_f(qbarsq,NN,a,b,w) и args как args(qbarsq,NN,a,b,w) (если я правильно понял ваш комментарий)? С этими заменами я все еще получаю производную ошибку, которую, я думаю, можно исправить с помощью первого аргумента с плавающей запятой? Как бы я сделал это с плавающей запятой?   -  person CAF    schedule 27.01.2018
comment
@WarrenWeckesser Вероятно, ошибка связана с тем, что я определил NN, a, b и т. Д. Как символические переменные, поскольку они участвуют в дифференцировании, но теперь я хочу передать их как числовые переменные для использования в этом методе интеграции. Я думаю, это то, что вы упомянули о функции с плавающей запятой. Но как сделать переменные числовыми? Все, что я нашел в Интернете, всегда заменяет число, например, в функции .subs или lambify.   -  person CAF    schedule 30.01.2018
comment
Посмотрите, если stackoverflow. com/questions/35430479/ помогает.   -  person Warren Weckesser    schedule 30.01.2018