Я пытаюсь создать релятивистское распределение Войта, свертку релятивистского Breit- Распределение Вигнера и функция Гаусса.
MWE:
double relativisticBreitwigner_pdf(double energy, double width, double mass){
double massSquare = pow(mass,2);
double widthSquare = pow(width,2);
double gamma = sqrt(massSquare*(massSquare+widthSquare));
double k = (2*sqrt(2)*mass*width*gamma)/(M_PI*sqrt(massSquare + gamma) );
return k/(pow((pow(energy,2)-massSquare),2) + massSquare*widthSquare);
}
double gaussian_pdf(double energy, double sigma, double mass){
return (1.0/(sigma*sqrt(2*M_PI)))*exp(-(1.0/2.0)*pow((energy-mass)/sigma,2.0));
}
double relativisticVoigt_pdf(double energy, double width, double mass, double sigma, double range=100.0){
auto f = [&](double dummy) { return ( relativisticBreitwigner_pdf(dummy+mass,width,mass)*gaussian_pdf(energy-dummy,sigma,mass) );};
boost::math::quadrature::tanh_sinh<double> integrator;
return integrator.integrate(f,-range,range);
// return boost::math::quadrature::trapezoidal(f,-range,range,sqrt(std::numeric_limits<double>::epsilon()),10000); }
Эта функция relativisticVoigt_pdf(...) правильно создает релятивистское распределение Фойгта, однако в распределении есть много неправильных «провалов», которые связаны со значением, возвращаемым из integrator.integrate(f,-range,range); не быть правильным.
Если я уменьшу диапазон интегрирования, размер/количество этих провалов будет меньше, но тогда диапазон релятивистского распределения Фойгта будет обрезан.
Прикреплен скриншот, показывающий релятивистский войт в черном цвете с этой проблемой (по сравнению с нерелятивистским войтом в розовом, у которого нет этой проблемы, просто для проверки того, что значения за пределами провалов действительны, черная кривая должна быть близка к розовой кривой) но чуть выше его левее пика и чуть ниже правее пика, как видно бывает).
Я предполагаю, что проблема связана с ошибками округления в методе интегрирования из-за большого количества задействованных небольших чисел, но это всего лишь предположение. Есть ли более мощный/надежный интегратор, который хорошо работает в этом режиме?
M_PI
, которые вам, вероятно, следует использовать вместо того, чтобы вычислять их самостоятельно. 3. Пожалуйста, добавьте больше форматирования в свой код. Можно писать однострочники, но их сложно отлаживать. 4. Какие входные области падения? Вероятно, хорошей идеей будет вручную рассчитать/отладить, что там должно произойти. - person Sugar   schedule 11.02.2021