将参数传递给GSL_function时,“值转义局部范围”

时间:2019-02-26 01:52:27

标签: c++ gsl numerical-integration

我遇到的问题如下。我正在使用GSL在较大的C ++程序中执行函数的数值积分。我用于数字积分的代码如下

struct psi_params
{
    double d_s;
    double yav_s;
    double sig_s;
    double dE_s;
};

/* Function to define the psi function appearing in the first-passage time formulas. Note that this function holds only
 * for the special potential made by an exponential plus a sigmoid
 */
double psi(double y, void * p)
{
    auto * params = (struct psi_params *) p;
    double d = (params->d_s);
    double yav = (params->yav_s);
    double sig = (params->sig_s);
    double dE = (params->dE_s);
    return pow(M_E, d / pow(M_E, pow(y - yav, 2) / (2. * pow(sig, 2))) - (dE * (1 + (y - yav) / (sig * sqrt(1 + pow(y - yav, 2) / pow(sig, 2))))) / 2.);
}

/* Function to numerically evaluate the integrals of the psi function with the gsl.Note that this function holds only 
 * for the special potential made by an exponential plus a sigmoid
 */
double Integral_I(double d,
                  double yav,
                  double sig,
                  double dE,
                  double a,
                  double b)
{
    struct psi_params parameters = { d, yav, sig, dE };
    gsl_function Psi;
    Psi.function = ψ
    Psi.params = &parameters;
    double result, error;
    gsl_integration_workspace *w = gsl_integration_workspace_alloc(1000);
    gsl_integration_qags(&Psi, a, b, 0, 1e-7, 1000, w, &result, &error);
    return result;
}

问题是我的IDE(clion)告诉我变量&parameters在行中转义了本地范围

Psi.params = &parameters;

实际上我不明白为什么会这样,原因如下:

1)C ++从来不是我的强项,而我上次使用它是7年前。

2)我给出的MWE是对GLS参考手册(here)提供的示例的较小修改,同时带有参数(here)的GSL_function的定义。另外,GSL人员here提供了与上述方法类似的MWE,以执行带有参数的函数的数值积分。我希望这些例子都是防犯规的。

3)我发现了一个旧线程(here),其中讨论了退出变量范围的问题,但是我不确定它们是否与我的问题有关(请参阅第1点)。最重要的是,没有提供最低限度的工作示例,因此我不知道如何进行。

欢迎您提供任何解决此问题的帮助。

0 个答案:

没有答案