1#include "polynomialfit.h"
4#include <gsl/gsl_fit.h>
5#include <gsl/gsl_vector.h>
6#include <gsl/gsl_min.h>
7#include <ekos_focus_debug.h>
12PolynomialFit::PolynomialFit(
int degree_, uint8_t maxCount,
const QVector<double> &x_,
const QVector<double> &y_)
13 : degree(degree_), x(x_), y(y_)
17 for (
int i = 0; i < x.count(); i++)
25 while(values.
count() > maxCount)
31 for (
const auto &onePoint : values)
41 : degree(degree_), y(y_)
44 for (
int i = 0; i < x_.
size(); ++i)
46 x.push_back(
static_cast<double>(x_[i]));
54 coefficients = gsl_polynomial_fit(x.
data(), y.
data(), x.
count(), degree, chisq);
57double PolynomialFit::polynomialFunction(
double x,
void *params)
59 PolynomialFit *instance =
static_cast<PolynomialFit *
>(params);
61 if (instance && !instance->coefficients.empty())
62 return instance->f(x);
67double PolynomialFit::f(
double x)
69 const int order = coefficients.size() - 1;
71 for (
int i = 0; i <= order; ++i)
72 sum += coefficients[i] * pow(x, i);
76bool PolynomialFit::findMinimum(
double expected,
double minPosition,
double maxPosition,
double *position,
double *value)
79 int iter = 0, max_iter = 100;
80 const gsl_min_fminimizer_type *T;
81 gsl_min_fminimizer *s;
85 F.function = &PolynomialFit::polynomialFunction;
89 gsl_set_error_handler_off();
91 T = gsl_min_fminimizer_brent;
92 s = gsl_min_fminimizer_alloc(T);
93 status = gsl_min_fminimizer_set(s, &F, expected, minPosition, maxPosition);
95 if (status != GSL_SUCCESS)
97 qCWarning(KSTARS_EKOS_FOCUS) <<
"Focus GSL error:" << gsl_strerror(status);
104 status = gsl_min_fminimizer_iterate(s);
106 m = gsl_min_fminimizer_x_minimum(s);
107 minPosition = gsl_min_fminimizer_x_lower(s);
108 maxPosition = gsl_min_fminimizer_x_upper(s);
110 status = gsl_min_test_interval(minPosition, maxPosition, 0.01, 0.0);
112 if (status == GSL_SUCCESS)
115 *value = polynomialFunction(m,
this);
118 while (status == GSL_CONTINUE && iter < max_iter);
120 gsl_min_fminimizer_free(s);
121 return (status == GSL_SUCCESS);
Ekos is an advanced Astrophotography tool for Linux.
QAction * solve(const QObject *recvr, const char *slot, QObject *parent)
NETWORKMANAGERQT_EXPORT NetworkManager::Status status()
qsizetype count() const const
qsizetype size() const const