【发布时间】:2021-11-08 17:47:53
【问题描述】:
我正在尝试在我生成的 C++ 代码中使用 GSL Monte Carlo 集成。
这个想法是有一个布朗运动函数 (brownian),它用于另一个函数 (g) 以执行 4-dim 数值积分。
double brownian(const double &x,const double &x0,const double & sigma,const double & t) {
double a1 = (1/sqrt(2.0 * M_PI * sigma * t));
double b1 = exp(-((x - x0) * (x - x0))/(2.0 * sigma * t));
double res = a1 * b1;
return res;
}
double g(double *k, size_t dim, void *p[]){
const double& xA0 = *(double *)p[0];
const double& xB0 = *(double *)p[1];
const double& yA0 = *(double *)p[2];
const double& yB0 = *(double *)p[3];
const double& sigma = *(double *)p[4];
const double& t1 = *(double *)p[5];
double temp_pbxA = brownian(k[0], xA0, sigma,t1);
double temp_pbxB = brownian(k[1], xB0, sigma, t1);
double temp_pbyA = brownian(k[2], yA0, sigma,t1);
double temp_pbyB = brownian(k[3], yB0, sigma, t1);
return (temp_pbxB * temp_pbyB) * (temp_pbxA * temp_pbyA);
}
double integrate_test(const double xl, const double xu, const double& xA0, const double& xB0, const double& yA0, const double& yB0, const double& t1, const double& sigma){
double res, err;
const gsl_rng_type *T;
gsl_rng *r;
gsl_monte_function G;
G.f = &g;
G.dim = 4;
G.params = { xA0, xB0, yA0, yB0, sigma, t1};
size_t calls = 500000;
gsl_rng_env_setup ();
T = gsl_rng_default;
r = gsl_rng_alloc (T);
gsl_monte_plain_state *s = gsl_monte_plain_alloc (4);
gsl_monte_plain_integrate (&G, xl, xu, 4, calls, r, s,
&res, &err);
gsl_monte_plain_free (s);
return res;
}
但是,当我尝试编译代码时,出现以下错误:
error: assigning to 'double (*)(double *, size_t, void *)' (aka 'double (*)(double *, unsigned long, void *)') from incompatible type 'double (*)(double *, size_t, void **)' (aka 'double (*)(double *, unsigned long, void **)'): type mismatch at 3rd parameter ('void *' vs 'void **')
G.f = &g;
我不明白为什么它使用void *p[],因为它是void**。
有什么建议吗?
【问题讨论】:
-
我不明白为什么它需要 void p[] -- 仔细查看您的代码:
double g(double *k, size_t dim, void *p[])-- 那是void* p[],而不是 @ 987654330@. -
抱歉,我的输入有误。我的意思是为什么它把 void *p[] 当作一个 void ** 对象。
-
这就是 C++ 的工作原理。
T*[]作为参数与T**相同,不管T是什么。 -
好的,清楚。但是,如果我希望 void *p 是函数 g 的多个参数的数组,我应该指定什么?
-
首先,你为什么设计
g来取void*?有更好的类型安全方法来实现这一点。看起来你正在踏入XY Problem 领域。
标签: c++ montecarlo gsl numerical-integration