Я программирую на C ++
Мне нужно интегрировать функцию двух переменных, скажем, f (x, y), только по одной из двух:
I (y) = int f (x, y) dx
Я использую библиотеки из числовых рецептов. однако, если я использую процедуры quadrature.h, такие как qsimp, qtrap, они только одномерные; Если вместо этого я использую quad3d.h, он содержит только трехмерную версию.
вот (упрощенная версия) мой код:
Doub NFW_rho(Doub variable,double angle) {
return 1 / (pow(variable,2) + ... + cos(angle)) ;
}
int main ()
{
...
for (double angle = pi/36; angle < fi_max; angle += incr) {
double min = D * cos(angle) - sqrt(pow(rt,2.) - pow(D * sin(angle),2.)) ;
double max = D * cos(angle) + sqrt(pow(rt,2.) - pow(D * sin(angle),2.)) ;
...
Doub NFW_int = qsimp(NFW_rho,min,max) ;
double NFW = NFW_const * NFW_int ;
}
При компиляции я получаю сообщение об ошибке относительно вызова qsimp, в котором говорится, что вызов qsimp неправильный (ясно, что NFW_rho является 2D-функцией).
Есть ли у кого-нибудь умный и простой выход?
большое спасибо
В старом C ++ у вас были такие вещи, как std::bind2nd
это дало бы новый объект функции путем «привязки» второго аргумента к предоставленному постоянному значению; в C ++ 11 это просто std::bind
(который использует заполнители для обозначения того, что еще не связано).
Так что у вас может быть что-то вроде
bind2nd(NFW_rho, 0.75); //older
bind(NFW_rho, _1, 0.75); //newer
где 0,75 — ваш угол (если вам нужны разные значения y по мере продвижения, вам нужно будет снова связать). Я остановил много std::
вещи.
Других решений пока нет …