7#ifndef GEMMI_LEVMAR_HPP_
8#define GEMMI_LEVMAR_HPP_
30 for (
int i = 0;
i < n;
i++) {
34 for (
int j =
i;
j < n;
j++) {
35 double aji = std::fabs(a[n *
j +
i]);
45 for (
int j =
i;
j < n;
j++)
46 if (a[n *
i +
j] != 0. || b[
i] != 0.)
47 fail(
"Trying to reverse singular matrix. Column ", std::to_string(
i),
" is zeroed.");
52 for (
int j =
i;
j < n;
j++)
53 std::swap(a[n *
maxnr +
j], a[n *
i +
j]);
57 double c = 1.0 / a[
i * n +
i];
58 for (
int j =
i;
j < n;
j++)
62 for (
int k = 0;
k < n;
k++)
64 double d = a[
k * n +
i];
65 for (
int j =
i;
j < n;
j++)
66 a[
k * n +
j] -= a[
i * n +
j] *
d;
72inline void jordan_solve(std::vector<double>& a, std::vector<double>& b) {
73 assert(a.size() == b.size() * b.size());
84template<
typename Target>
87 for (
const auto&
p :
target.points)
92template<
typename Target>
95 for (
unsigned i = 0;
i < n; ++
i)
97 std::vector<double>
dy_da(n);
98 for (
const auto&
p :
target.points) {
99 double y =
target.compute_value_and_derivatives(
p,
dy_da);
100 double dy =
p.get_weight() * (
p.get_y() - y);
102 for (
unsigned i = 0;
i < n; ++
i)
108 std::vector<double> x =
target.get_parameters();
110 for (
unsigned i = 0;
i < n; ++
i) {
112 double h = std::max(std::fabs(x[
i]), 1
e-6) * 1
e-3;
134template<
typename Target>
136 std::vector<double>& alpha,
137 std::vector<double>& beta) {
139 assert(alpha.size() == beta.size() * beta.size());
140 long double wssr = 0;
141 size_t na = beta.size();
142 std::fill(alpha.begin(), alpha.end(), 0.0);
143 std::fill(beta.begin(), beta.end(), 0.0);
145 for (
const auto&
p :
target.points) {
146 double y =
target.compute_value_and_derivatives(
p,
dy_da);
147 double weight =
p.get_weight();
148 double dy_sig = weight * (
p.get_y() - y);
149 for (
size_t j = 0;
j !=
na; ++
j) {
152 for (
size_t k =
j+1;
k-- != 0;)
161 for (
size_t j = 1;
j <
na;
j++)
162 for (
size_t k = 0;
k <
j;
k++)
163 alpha[
na *
k +
j] = alpha[
na *
j +
k];
164 return (
double)
wssr;
188 template<
typename Target>
191#ifdef GEMMI_DEBUG_LEVMAR
214 for (
size_t j = 0;
j <
na;
j++)
221 for (
size_t i = 0;
i <
na;
i++)
228#ifdef GEMMI_DEBUG_LEVMAR
229 fprintf(
stderr,
" #%d WSSR=%.8g %+g%% (%+.4g%%) lambda=%g\n",
fail(), unreachable() and __declspec/__attribute__ macros
Math utilities. 3D linear algebra.
void print_parameters(const std::string &name, std::vector< double > &a)
double compute_gradients(const Target &target, unsigned n, double *grad)
double compute_lm_matrices(const Target &target, std::vector< double > &alpha, std::vector< double > &beta)
constexpr float sq(float x)
double compute_wssr(const Target &target)
void fail(const std::string &msg)
void jordan_solve(double *a, double *b, int n)
This function solves a set of linear algebraic equations using Gauss-Jordan elimination with partial ...
std::vector< double > alpha
double fit(Target &target)
double lambda_down_factor
std::vector< double > beta
std::vector< double > temp_alpha
std::vector< double > temp_beta