Ниже я определил ряд функций, вставив конечную функцию 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
— это массив начальных предположений. Спасибо!
diff
не определена в вашем коде. Это из numpy или sympy? Было бы полезно, если бы вы создали минимальный, полный и проверяемый пример, который мы могли бы скопировать и запустить, чтобы воспроизвести проблему. - person Warren Weckesser   schedule 26.01.2018diff
из sympy, импортировано черезfrom sympy import *
. Что касается минимального, полного и проверяемого примера, как упоминалось в моем вопросе, проблема специфична для функций, которые я определил, потому что у меня не было проблем с кодом с другими тестами fA. Когда я говорю, что проблема «специфична», я на самом деле имею в виду «кажется», потому что я не вижу другого способа интерпретировать эти производные ошибки, которые, вероятно, возникают из-за какой-то основной проблемы дифференцируемости в моей функции или в том, как метод ее обрабатывает. . Спасибо! - person CAF   schedule 26.01.2018print(fA(qbarsq,ktsq,NN,a,b,w))
, я получу возвращенную мне функцию), но со вторым блоком, включенным в метод интеграции, это не так. Если я закомментирую все нижеa=0.1
во втором блоке, он станет работоспособным. Вы находите то же самое? Моя проблема заключается в том, как заставить работать оператор печати (результат). - person CAF   schedule 26.01.2018quad
не может обрабатывать любые симпатичные выражения. Функция, которую нужно интегрировать с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.2018fA(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.subs
илиlambify
. - person CAF   schedule 30.01.2018