14 #ifndef NONLINEAR_FIT_H 15 #define NONLINEAR_FIT_H 18 #include "blitz/tinyvec.h" 19 #include "blitz/array.h" 23 template<
int M,
typename ModelType>
53 template<
int M,
typename ModelType>
60 assert(y.
size() ==
N);
61 assert(sigma.
size() ==
N);
62 Model.SetParams(params);
65 for (
int i = 0; i <
N; i++)
67 double val = Model(x(i));
71 chi2 += (val - y(i)) * (val - y(i)) / (sigma(i) * sigma(i));
76 template<
int M,
typename ModelType>
82 Model.SetParams(params);
84 assert(y.
size() ==
N);
85 assert(sigma.
size() ==
N);
87 for (
int k = 0; k < M; k++)
90 for (
int l = 0; l < M; l++)
94 for (
int i = 0; i <
N; i++)
96 double val = Model(x(i));
98 for (
int k = 0; k < M; k++)
99 Beta[k] += grad[k] * (y(i) - val) / (sigma(i) * sigma(i));
101 for (
int i = 0; i <
N; i++)
103 double val = Model(x(i));
105 for (
int k = 0; k < M; k++)
106 for (
int l = 0; l < M; l++)
107 Alpha(k, l) += grad[k] * grad[l] / (sigma(i) * sigma(i));
113 template<
int M,
typename ModelType>
116 for (
int i = 0; i < M; i++)
119 for (
int j = 0; j < M; j++)
120 AlphaInv(i, j) = Alpha(i, j);
126 for (
int i = 0; i < M; i++)
127 for (
int j = 0; j < M; j++)
128 for (
int k = 0; k < M; k++)
129 id(i, j) += AlphaInv(i, k) * Alpha(k, j);
131 for (
int i = 0; i < M; i++)
132 for (
int j = 0; j < M; j++)
133 dParams[i] += AlphaInv(i, j) * Beta(j);
152 template<
int M,
typename ModelType>
158 double chiNow = Chi2(x, y, sigma, params);
159 double lambda = 0.01;
163 int numSmallDecrease = 0;
170 CalcAlphaBeta(x, y, sigma, params);
171 for (
int i = 0; i < M; i++)
172 Alpha(i, i) *= (1.0 + lambda);
180 double chiNew = Chi2(x, y, sigma, params + dParams);
181 if (chiNew <= chiNow)
184 params = params + dParams;
185 if ((chiNow - chiNew) < 0.001)
187 if (numSmallDecrease > 4)
198 CalcAlphaBeta(x, y, sigma, params);
199 for (
int i = 0; i < M; i++)
200 for (
int j = 0; j < M; j++)
201 AlphaInv(i, j) = Alpha(i, j);
209 Model.SetParams(params);
double GJInverse(Array< double, 2 > &A)
void CalcAlphaBeta(const Array< double, 1 > &x, const Array< double, 1 > &y, const Array< double, 1 > &sigma, TinyVector< double, M > params)
TinyVector< double, M > Params
double Chi2(const Array< double, 1 > &x, const Array< double, 1 > &y, const Array< double, 1 > &sigma, TinyVector< double, M > params)
TinyVector< double, M > Beta
void resize(const std::array< SIZET, D > &dims)
Resize the container.
TinyVector< double, M > dParams
TinyMatrix< double, M, M > Alpha
NonlinearFitClass(ModelType model)
Array< double, 2 > & GetCovariance()
void Fit(const Array< double, 1 > &x, const Array< double, 1 > &y, const Array< double, 1 > &sigma, TinyVector< double, M > ¶ms)
Array< double, 2 > AlphaInv