GNU科学图书馆:即使在范围内也找不到最小值 我试图用C++找到矿井函数的最小值。但是,在尝试运行代码时,返回以下错误:

GNU科学图书馆:即使在范围内也找不到最小值 我试图用C++找到矿井函数的最小值。但是,在尝试运行代码时,返回以下错误:,c++,gnu,gsl,minimization,C++,Gnu,Gsl,Minimization,gsl:fsolver.c:117:错误:x_最小值必须位于间隔内(下限d,2))/(p->f*(功率((x-p->d),2))-exp((-p->c*((功率((x-p->b1),2))/(2*p->ac~()))+(-p->质量*p->g*x); } } int main(){ 双x_lo=0.3; 双x_hi=0.5; 双m=-0.5; 参数args={1.0,0.1100.0,0.52500.0,9.8,0.3}; gsl_min_fminimizer*解算器; gsl_功能fwrapp

gsl:fsolver.c:117:错误:x_最小值必须位于间隔内(下限<上限<上限)

尽管知道我的x_lo和x_hi值肯定是封装在另一个软件位中计算的最小值

我很好奇我做错了什么——我使我的函数连续,定义了我的范围,并进行了相对接近的第一次猜测,但我仍然被这个错误所困扰。我对GSL不是很在行——事实上,我以前从未使用过它

参考代码:

#include <iostream>
#include <gsl/gsl_roots.h>
#include <gsl/gsl_min.h>

struct Params {
    double ac, b1, c, d, f, g, mass;
};
double examplefunction(double x, void* param){
    Params* p = (Params*)param;
    for (x = 0.001; x < 0.45; x += 0.01) {
        return (p->ac*((p->b1/x)+((pow(p->d,2))/(p->f*(pow((x-p->d),2)))-exp((-p->c*((pow((x-p->b1),2))/(2*p->ac)))))))+(-p->mass*p->g*x);
    }
}

int main() {
    double x_lo = 0.3;
    double x_hi = 0.5;
    double m = -0.5;
    Params args = {1.0, 0.1, 100.0, 0.5, 2500.0, 9.8, 0.3};
    gsl_min_fminimizer* solver;
    gsl_function fwrapper;
    solver = gsl_min_fminimizer_alloc(gsl_min_fminimizer_brent);
    fwrapper.function = examplefunction;
    fwrapper.params = &args;
    gsl_min_fminimizer_set(solver, &fwrapper, m, x_lo, x_hi);
    std::cout << " iter [ lower, upper] root err\n";
    int status = 1;
    for (int iter=0; status and iter < 100; ++iter) {
        gsl_min_fminimizer_iterate(solver);
        double x_rt = gsl_min_fminimizer_x_minimum(solver);
        double x_lo = gsl_min_fminimizer_x_lower(solver);
        double x_hi = gsl_min_fminimizer_x_upper(solver);
        std::cout << iter <<" "<< x_lo <<" "<< x_hi
        <<" "<< x_rt <<" "<< x_hi - x_lo << "\n";
        status = gsl_min_test_interval(x_lo,x_hi,0,0.001);
    }
    gsl_min_fminimizer_free(solver);
    return status;
}
#包括
#包括
#包括
结构参数{
双ac,b1,c,d,f,g,质量;
};
双示例函数(双x,void*param){
Params*p=(Params*)param;
对于(x=0.001;x<0.45;x+=0.01){
返回(p->ac*((p->b1/x)+((功率(p->d,2))/(p->f*(功率((x-p->d),2))-exp((-p->c*((功率((x-p->b1),2))/(2*p->ac~()))+(-p->质量*p->g*x);
}
}
int main(){
双x_lo=0.3;
双x_hi=0.5;
双m=-0.5;
参数args={1.0,0.1100.0,0.52500.0,9.8,0.3};
gsl_min_fminimizer*解算器;
gsl_功能fwrapper;
解算器=gsl\u最小值\u最小值\u alloc(gsl\u最小值\u最小值\u brent);
fwrapper.function=示例函数;
fwrapper.params=&args;
gsl_min_fminimizer_集(解算器和fwrapper,m,x_lo,x_hi);

std::cout为什么示例函数中有for循环?返回在第一次迭代时退出。我会尝试一个简单的函数,返回一个常量,以验证所有配置是否正确。实际上,示例函数仅在X=0.001时求值,因为您覆盖了循环初始值设定项中的参数值。