Научная библиотека GNU: не может найти минимум, несмотря на то, что находится в радиусе действия

Я пытаюсь найти минимум моей функции с помощью C ++. Однако при попытке запустить код мне возвращается следующая ошибка:

gsl: fsolver.c: 117: ОШИБКА: x_minimum должен находиться внутри интервала (ниже < Икс < верхний)

Несмотря на то, что я знаю, что мои значения 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;
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]