33 if(penalty!=NULL) *penalty=1.0;
34 for(pi=0; pi<par_nr; pi++) {
35 range=upper_p[pi]-lower_p[pi];
if(range<=0.0) range=1.0;
36 if(test_p[pi]<lower_p[pi]) {
37 if(accept_p!=NULL) accept_p[pi]=lower_p[pi];
38 if(penalty!=NULL) *penalty += (lower_p[pi]-test_p[pi])/range;
39 }
else if(test_p[pi]>upper_p[pi]) {
40 if(accept_p!=NULL) accept_p[pi]=upper_p[pi];
41 if(penalty!=NULL) *penalty += (test_p[pi]-upper_p[pi])/range;
43 if(accept_p!=NULL) accept_p[pi]=test_p[pi];
69 int pi, collision_nr=0;
70 double range, range_factor=0.00001;
72 for(pi=0; pi<par_nr; pi++) {
74 range=upper_p[pi]-lower_p[pi];
if(range<=0.0)
continue;
76 if(test_p[pi]<=lower_p[pi]) {
77 collision_nr++;
continue;
78 }
else if(test_p[pi]>upper_p[pi]) {
79 collision_nr++;
continue;
84 if(test_p[pi]<lower_p[pi]+range) {
85 if(fabs(lower_p[pi])>=1.0E-06) collision_nr++;
86 }
else if(test_p[pi]>upper_p[pi]-range) {
87 if(fabs(upper_p[pi])>=1.0E-06) collision_nr++;
132 printf(
"fitExpDecayNNLS(x, y, %d, %g, %g, %g, ...)\n", n, fittime, kmin, kmax);
135 while(x[n-1]>fittime && n>0) n--;
136 if(verbose>1) printf(
" n := %d\n", n);
138 if(kmin<1.0E-100) kmin=1.0E-100;
139 if(kmax<=kmin)
return(1);
143 int nn, mm, nnls_n, nnls_m, nnls_index[NNLS_N];
144 double *nnls_a[NNLS_N], *nnls_b, *nnls_zz, nnls_x[NNLS_N], *nnls_mat,
145 nnls_wp[NNLS_N], *dptr, nnls_rnorm;
149 nnls_mat=(
double*)malloc(((nnls_n+2)*nnls_m)*
sizeof(
double));
150 if(nnls_mat==NULL)
return(2);
151 for(nn=0, dptr=nnls_mat; nn<nnls_n; nn++) {nnls_a[nn]=dptr; dptr+=nnls_m;}
152 nnls_b=dptr; dptr+=nnls_m; nnls_zz=dptr;
157 double elnmin, elnmax;
158 elnmin=log(kmin); elnmax=log(kmax);
162 d=r/(double)(NNLS_N-1);
163 for(nn=0; nn<nnls_n; nn++) epar[nn]=-exp(elnmin+(
double)nn*d);
167 for(mm=0; mm<nnls_m; mm++) {
170 for(nn=0; nn<nnls_n; nn++)
171 for(mm=0; mm<nnls_m; mm++)
172 nnls_a[nn][mm]=exp(epar[nn]*x[mm]);
176 ret=
nnls(nnls_a, nnls_m, nnls_n, nnls_b, nnls_x, &nnls_rnorm,
177 nnls_wp, nnls_zz, nnls_index);
179 if(verbose>0) fprintf(stderr,
"Error: NNLS solution not possible.\n");
183 if(verbose>0) fprintf(stderr,
"Warning: max iteration count exceeded in NNLS.\n");
186 printf(
"NNLS results:\n");
187 for(nn=0; nn<nnls_n; nn++)
188 printf(
"\t%e\t%g\t%g\n", epar[nn], nnls_x[nn], nnls_wp[nn]);
191 printf(
"Reasonable NNLS results:\n");
192 for(nn=0; nn<nnls_n; nn++)
193 if(nnls_wp[nn]==0.0) printf(
"\t%e\t%g\n", epar[nn], nnls_x[nn]);
198 if(verbose>1) printf(
"Cluster means:\n");
204 while(i<nnls_n && nnls_wp[i]<0.0) i++;
208 while(i<nnls_n && nnls_wp[i]==0.0) {nr++; ev+=epar[i]; i++;}
210 if(verbose>1) printf(
"mean_e := %e\n", ev);
217 for(mm=0; mm<nnls_m; mm++) {
220 for(nn=0; nn<nnls_n; nn++)
221 for(mm=0; mm<nnls_m; mm++)
222 nnls_a[nn][mm]=exp(epar[nn]*x[mm]);
225 ret=
nnls(nnls_a, nnls_m, nnls_n, nnls_b, nnls_x, &nnls_rnorm,
226 nnls_wp, nnls_zz, nnls_index);
228 if(verbose>0) fprintf(stderr,
"Error: NNLS solution not possible.\n");
232 if(verbose>0) fprintf(stderr,
"Warning: max iteration count exceeded in NNLS.\n");
235 printf(
"NNLS results:\n");
236 for(nn=0; nn<nnls_n; nn++)
237 printf(
"\t%e\t%g\t%g\n", epar[nn], nnls_x[nn], nnls_wp[nn]);
242 for(nn=0; nn<nnls_n; nn++) {
243 if(nnls_wp[nn]<0.0)
continue;
244 if(nr>=pnr) {nr++;
continue;}
245 if(a!=NULL) a[nr]=nnls_x[nn];
246 if(k!=NULL) k[nr]=epar[nn];
249 if(fnr!=NULL) *fnr=nr;
int fitExpDecayNNLS(double *x, double *y, int n, double fittime, double kmin, double kmax, int pnr, double *a, double *k, int *fnr, int verbose)
Estimate initial values for sum of exponentials to be fitted on decaying x,y-data.
int nnls(double **a, int m, int n, double *b, double *x, double *rnorm, double *w, double *zz, int *index)