Я пытаюсь численно оценить многомерный интеграл с использованием пакета Cubature в Python. My goal is to compute a rate function that should be constant in time, but the output varies with time.
Here’s a summary of what I’m doing:
The integral has three levels:
Innermost: angular integration over θ and φ
Middle: radial integration over momentum q
Внешний: энергетическая интеграция в течение ω < /p>
Интеграция включает в себя термин скорости vlab (t), который изменяется со временем, но физическая величина (скорость), как ожидается, будет постоянной из -за изотропии. Численная нестабильность. < /p>
Я использую вложенные вызовы на кабину. Несмотря на то, что функция теоретически независимо от времени после интеграции, я наблюдаю за изменяющимися во времени результатами.
Вот соответствующая часть моего кода: < /p>
import numpy as np
from scipy.special import erf
from cubature import cubature
sec = 1/(365*24*60*60) #year
ev = 1.78*(1e-36) #kg
cm = (1e7)/197 #1/eV
g = (1e33)/1.78 #eV
d = 3.35/(1970) #1/eV
c = 3*(1e5) #km/s
conv = (1e58)*2.7
rhox=0.4*(1e9)*(1/cm**3)
mx = 25*(1e3)
me = 0.5109*(1e6)
sigmaT = 1.53*(1e-7)*g*(1/(cm**2))
sigmaXe = (1e-38)*(cm**2)
uxe = (mx*me)/(mx+me)
a = 1/137
qo = a*me
pi = np.pi
vo = 230/c
ve = 240/c
vesc = 500/c
No=(pi**(3/2))*(vo**2)*(vo*erf(vesc/vo) - ((2*vesc)/(pi**(1/2)))*np.exp(-(vesc**2)/(vo**2)))
def vlab(t):
psi = (2*pi*t)/24
thetae = (42*pi)/180
return ve*np.array([np.sin(thetae)*np.sin(psi), np.sin(thetae)*np.cos(thetae)*(np.cos(psi)-1), \
np.cos(thetae)**2 + np.sin(thetae)**2*np.cos(psi)])
def g(qunit, q, w, t):
vminus = w/q + q/(2*mx) + np.dot(qunit, vlab(t))
if vminus > vesc:
return 0
return (np.pi * vo**2 / (q * No)) * (np.exp(-vminus**2 / vo**2) - np.exp(-vesc**2 / vo**2))
def integrand(q2d, q, w, t):
theta = q2d[0]
phi = q2d[1]
qvec = np.array([q*np.sin(theta)*np.cos(phi), q*np.sin(theta)*np.sin(phi),
q*np.cos(theta)])
qunit = qvec/q
jacobian = q**2*np.sin(theta)
val = sigmaXe * g(qunit, q, w, t) * jacobian * (qo**2/q**4) *(pi/(2*pi)**3)*(1/(uxe**2))*(rhox/(sigmaT*mx))*conv
return val
def angular_integral(q, w, t):
qr = q[0]
angular_min = np.array([0.0, 0.0])
angular_max = np.array([np.pi, 2*np.pi])
ang_int, error = cubature(integrand, 2, 1, angular_min, angular_max, args=(qr, w, t),
adaptive='h', relerr=1e-6, maxEval=1e6)
return ang_int[0]
def radial_integral(ww, t):
w = ww[0]
qmin = np.array([0.1])
qmax = np.array([500.0])
rad_int, err = cubature(angular_integral, 1, 1, qmin, qmax, args=(w, t),
adaptive='h', relerr=1e-6, maxEval=1e6)
return rad_int[0]
def rate(t):
rate_val, _ = cubature(radial_integral, 1, 1, np.array([0.1]), np.array([0.8]), args=(t,), relerr=1e-6, maxEval=1e6)
return rate_val[0]
< /code>
То, что я попробовал:
Увеличение максимального и уменьшения Relerr и Abserr. < /p>
Подробнее здесь: https://stackoverflow.com/questions/796 ... e-non-cons
Почему моя зависящая от времени интеграция с использованием кабатуры в Python дает непостоянные результаты для независим ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение