43 printf(
"%s('%s', %d, p[], %d, x[], y[], %d)\n", __func__, fid, parNr, sampleNr, verbose);
46 if(parNr<1 || p==NULL || sampleNr<1 || x==NULL || y==NULL)
return(1);
48 if(strcasecmp(fid,
"step")==0) {
50 if(parNr<2 || parNr&1)
return(2);
51 for(
int i=0; i<sampleNr; i++) {
53 for(
int j=0; j<parNr; j+=2)
if(x[i]>=p[j]) y[i]=p[j+1];
58 if(strcasecmp(fid,
"level")==0) {
59 for(
int i=0; i<sampleNr; i++) y[i]=p[0];
63 if(strcasecmp(fid,
"fengm2")==0) {
64 if(parNr<6)
return(2);
65 double delayt=0.0;
if(parNr>6) delayt=p[6];
66 for(
int i=0; i<sampleNr; i++) {
67 double xt=x[i]-delayt; y[i]=0.0;
if(!(xt>0.0))
continue;
68 y[i] += (p[0]*xt-p[2]-p[4])*exp(p[1]*xt);
69 y[i] += p[2]*exp(p[3]*xt);
70 y[i] += p[4]*exp(p[5]*xt);
74 if(strcasecmp(fid,
"fengm2s")==0) {
75 if(parNr<4)
return(2);
76 double delayt=0.0;
if(parNr>4) delayt=p[4];
77 for(
int i=0; i<sampleNr; i++) {
78 double xt=x[i]-delayt; y[i]=0.0;
if(!(xt>0.0))
continue;
79 y[i] += (p[0]*xt-p[2])*exp(p[1]*xt);
80 y[i] += p[2]*exp(p[3]*xt);
84 if(strcasecmp(fid,
"fengm2e")==0) {
85 if(parNr<8)
return(2);
86 double delayt=0.0;
if(parNr>8) delayt=p[8];
87 for(
int i=0; i<sampleNr; i++) {
88 double xt=x[i]-delayt; y[i]=0.0;
if(!(xt>0.0))
continue;
89 y[i] += (p[0]*xt-p[2]-p[4]-p[6])*exp(p[1]*xt);
90 y[i] += p[2]*exp(p[3]*xt);
91 y[i] += p[4]*exp(p[5]*xt);
92 y[i] += p[6]*exp(p[7]*xt);
97 if(strcasecmp(fid,
"gammav")==0) {
98 if(parNr<3)
return(2);
99 double delayt=0.0;
if(parNr>3) delayt=p[3];
100 for(
int i=0; i<sampleNr; i++) {
101 double xt=x[i]-delayt; y[i]=0.0;
102 if(!(xt>0.0) || fabs(p[2])<1.0E-10)
continue;
103 y[i] = p[0]*pow(xt, p[1])*exp(-xt/p[2]);
108 if(strcasecmp(fid,
"1exp")==0) {
109 if(parNr<2)
return(2);
110 for(
int i=0; i<sampleNr; i++) {
112 y[i] += p[0]*exp(p[1]*x[i]);
117 if(strcasecmp(fid,
"2exp")==0) {
118 if(parNr<4)
return(2);
119 for(
int i=0; i<sampleNr; i++) {
121 y[i] += p[0]*exp(p[1]*x[i]);
122 y[i] += p[2]*exp(p[3]*x[i]);
127 if(strcasecmp(fid,
"3exp")==0) {
128 if(parNr<6)
return(2);
129 for(
int i=0; i<sampleNr; i++) {
131 y[i] += p[0]*exp(p[1]*x[i]);
132 y[i] += p[2]*exp(p[3]*x[i]);
133 y[i] += p[4]*exp(p[5]*x[i]);
138 if(strcasecmp(fid,
"4exp")==0) {
139 if(parNr<8)
return(2);
140 for(
int i=0; i<sampleNr; i++) {
142 y[i] += p[0]*exp(p[1]*x[i]);
143 y[i] += p[2]*exp(p[3]*x[i]);
144 y[i] += p[4]*exp(p[5]*x[i]);
145 y[i] += p[6]*exp(p[7]*x[i]);
150 if(strcasecmp(fid,
"5exp")==0) {
151 if(parNr<10)
return(2);
152 for(
int i=0; i<sampleNr; i++) {
154 y[i] += p[0]*exp(p[1]*x[i]);
155 y[i] += p[2]*exp(p[3]*x[i]);
156 y[i] += p[4]*exp(p[5]*x[i]);
157 y[i] += p[6]*exp(p[7]*x[i]);
158 y[i] += p[8]*exp(p[9]*x[i]);
164 if(strcasecmp(fid,
"ppfigamc")==0) {
165 if(parNr<4)
return(2);
166 double delayt=0.0;
if(parNr>4) delayt=p[4];
169 double c=p[2];
if(c<0.0)
return(2);
170 double d=p[3];
if(d<=0.0)
return(2);
171 for(
int i=0; i<sampleNr; i++) {
172 double t=x[i]-delayt;
if(t<0.0) t=0.0;
173 y[i]=a*(1.0-b*
igam(d, c*t));
179 if(strcasecmp(fid,
"weibullcdfd")==0) {
180 if(parNr<4)
return(2);
182 for(
int i=0; i<sampleNr; i++) {
183 double xt=x[i]-delayt; y[i]=0.0;
184 if(!(xt>0.0))
continue;
185 y[i] = p[1]*(1.0-exp(-pow(xt/p[2], p[3])));
191 if(strcasecmp(fid,
"weibullcdfdd")==0) {
192 if(parNr<5)
return(2);
194 for(
int i=0; i<sampleNr; i++) {
195 double xt=x[i]-delayt; y[i]=0.0;
196 if(!(xt>0.0))
continue;
197 double a=exp(-pow(xt/p[2], p[3]));
198 double b=(p[3]/p[2]) * pow(xt/p[2], p[3]-1.0) * a;
199 y[i] = p[1]*(b + p[4]*(1.0-a));
206 if(strcasecmp(fid,
"surge")==0) {
207 if(parNr<2)
return(2);
208 double f=p[0]*(p[1]*p[1]);
209 for(
int i=0; i<sampleNr; i++) {
210 double xt=x[i]; y[i]=0.0;
211 if(!(xt>0.0))
continue;
212 y[i] = f*xt*exp(-p[1]*xt);
218 if(strcasecmp(fid,
"tradsurge")==0) {
219 if(parNr<2)
return(2);
220 for(
int i=0; i<sampleNr; i++) {
221 double xt=x[i]; y[i]=0.0;
222 if(!(xt>0.0))
continue;
223 y[i] = p[0]*xt*exp(-p[1]*xt);
230 if(strcasecmp(fid,
"surgerecirc")==0) {
231 if(parNr<2)
return(2);
234 for(
int i=0; i<sampleNr; i++) {
235 double xt=x[i]; y[i]=0.0;
236 if(!(xt>0.0))
continue;
237 double e=exp(-p[1]*xt);
238 y[i] = xt*e + (c/(p[1]*p[1]))*(1.0 - (p[1]*xt+1.0)*e);
246 if(strcasecmp(fid,
"surgerecircd")==0) {
247 if(parNr<2)
return(2);
248 double c=0.0;
if(parNr>=3) c=p[2];
249 double delayt=0.0;
if(parNr>=4) delayt=p[3];
250 for(
int i=0; i<sampleNr; i++) {
251 double xt=x[i]-delayt; y[i]=0.0;
252 if(!(xt>0.0))
continue;
253 double e=exp(-p[1]*xt);
254 y[i] = xt*e + (c/(p[1]*p[1]))*(1.0 - (p[1]*xt+1.0)*e);
263 if(strcasecmp(fid,
"p2bsrc")==0) {
264 if(parNr<3)
return(2);
265 double c=0.0;
if(parNr>=4) c=p[3];
269 for(
int i=0; i<sampleNr; i++) {
270 double xt=x[i];
if(!(xt>0.0)) {y[i]=1.0/(1.0-HCT);
continue;}
272 double r=a*(xt*e + (c/(b*b))*(1.0 - (b*xt+1.0)*e));
273 y[i] = 1.0/(1.0-HCT*(1.0-r));
280 if(strcasecmp(fid,
"p2bfm2")==0) {
281 if(parNr<3)
return(2);
285 double A2=0.0;
if(parNr>3) A2=p[3];
286 double L2=0.0;
if(parNr>4) L2=p[4];
287 double A3=0.0;
if(parNr>5) A3=p[5];
288 double L3=0.0;
if(parNr>6) L3=p[6];
289 for(
int i=0; i<sampleNr; i++) {
290 double xt=x[i];
if(!(xt>0.0)) {y[i]=1.0/(1.0-HCT);
continue;}
291 double r=(A1*xt - A2 - A3)*exp(-L1*xt) + A2*exp(-L2*xt) + A3*exp(-L3*xt);
292 y[i] = 1.0/(1.0-HCT*(1.0-r));
298 if(strcasecmp(fid,
"surgefdgaif")==0) {
299 if(parNr<5)
return(2);
301 for(
int i=0; i<sampleNr; i++) {
302 double xt=x[i]-delayt; y[i]=0.0;
303 if(!(xt>0.0))
continue;
304 y[i] = p[2]*(p[3]*xt*exp(-p[4]*p[1]*xt) + exp(-p[1]*xt));
310 if(strcasecmp(fid,
"erlangpdf")==0) {
311 if(parNr<3)
return(2);
312 double A=p[0], k=p[1];
if(!(k>=0.0))
return(2);
313 int N=(int)round(p[2]);
if(!(N>0))
return(2);
315 for(
int i=0; i<sampleNr; i++) {
316 y[i]=0.0;
if(!(x[i]>=0.0))
continue;
317 y[i] = A*pow(k, N)*pow(x[i], N-1)*exp(-k*x[i])/f;
323 if(strcasecmp(fid,
"ratf11")==0) {
324 if(parNr<4)
return(2);
325 for(
int i=0; i<sampleNr; i++) {
326 double a=p[0]+p[2]*x[i];
327 double b=p[1]+p[3]*x[i];
332 if(strcasecmp(fid,
"ratf21")==0) {
333 if(parNr<5)
return(2);
334 for(
int i=0; i<sampleNr; i++) {
335 double a=p[0]+p[2]*x[i]+p[4]*x[i]*x[i];
336 double b=p[1]+p[3]*x[i];
341 if(strcasecmp(fid,
"ratf22")==0) {
342 if(parNr<6)
return(2);
343 for(
int i=0; i<sampleNr; i++) {
344 double sqrx=x[i]*x[i];
345 double a=p[0]+p[2]*x[i]+p[4]*sqrx;
346 double b=p[1]+p[3]*x[i]+p[5]*sqrx;
351 if(strcasecmp(fid,
"ratf32")==0) {
352 if(parNr<7)
return(2);
353 for(
int i=0; i<sampleNr; i++) {
354 double sqrx=x[i]*x[i];
355 double a=p[0]+p[2]*x[i]+p[4]*sqrx+p[6]*sqrx*x[i];
356 double b=p[1]+p[3]*x[i]+p[5]*sqrx;
361 if(strcasecmp(fid,
"ratf33")==0) {
362 if(parNr<8)
return(2);
363 for(
int i=0; i<sampleNr; i++) {
364 double sqrx=x[i]*x[i];
365 double cubx=sqrx*x[i];
366 double a=p[0]+p[2]*x[i]+p[4]*sqrx+p[6]*cubx;
367 double b=p[1]+p[3]*x[i]+p[5]*sqrx+p[7]*cubx;
372 if(strcasecmp(fid,
"p2brf")==0) {
373 if(parNr<7)
return(2);
374 for(
int i=0; i<sampleNr; i++) {
378 double sqrx=x[i]*x[i];
379 double cubx=sqrx*x[i];
380 double a=0.0+p[1]*x[i]+p[3]*sqrx+p[5]*cubx;
381 double b=1.0+p[2]*x[i]+p[4]*sqrx+p[6]*cubx;
382 y[i]=1.0/(1.0-p[0]*(1.0-(a/b)));
389 if(strcasecmp(fid,
"mpfhill")==0) {
390 if(parNr<3)
return(2);
391 for(
int i=0; i<sampleNr; i++) {
392 y[i]=p[0]*pow(x[i], p[1]) / (pow(x[i], p[1]) + p[2]);
396 if(strcasecmp(fid,
"p2bhill")==0) {
397 if(parNr<4)
return(2);
398 for(
int i=0; i<sampleNr; i++) {
399 double cpr=p[1]*pow(x[i], p[2]) / (pow(x[i], p[2]) + p[3]);
400 y[i]=1.0/(1.0-p[0]*(1.0-cpr));
406 if(verbose>1) printf(
"function '%s' not supported by %s()\n", fid, __func__);
435 printf(
"%s('%s', %d, p[], %d, x[], y[], %d)\n", __func__, fid, parNr, sampleNr, verbose);
438 if(parNr<1 || p==NULL || sampleNr<1 || x==NULL || v==NULL)
return(1);
440 if(strcasecmp(fid,
"fengm2")==0) {
441 if(parNr<6)
return(2);
442 double delayt=0.0;
if(parNr>6) delayt=p[6];
444 double A1, A2, A3, L1, L2, L3;
445 A1=p[0]; L1=p[1]; A2=p[2]; L2=p[3]; A3=p[4]; L3=p[5];
446 if(fabs(L1)<1.0E-20 || fabs(L2)<1.0E-20 || fabs(L3)<1.0E-20) {
447 if(verbose>1) printf(
"too small L parameter(s)\n");
450 for(
int i=0; i<sampleNr; i++) {
451 double xt=x[i]-delayt; v[i]=0.0;
if(!(xt>0.0))
continue;
454 v[i] += (A1+L1*(A2+A3))*(1.0-a)/(L1*L1);
455 v[i] += (A1/L1)*xt*a;
457 if(L2!=0.0) v[i]-=(A2/L2)*(1.0-exp(L2*xt));
else v[i]+=A2*xt;
458 if(L3!=0.0) v[i]-=(A3/L3)*(1.0-exp(L3*xt));
else v[i]+=A3*xt;
462 if(strcasecmp(fid,
"fengm2e")==0) {
463 if(parNr<8)
return(2);
464 double delayt=0.0;
if(parNr>8) delayt=p[8];
466 double A1, A2, A3, A4, L1, L2, L3, L4;
467 A1=p[0]; L1=p[1]; A2=p[2]; L2=p[3]; A3=p[4]; L3=p[5]; A4=p[6]; L4=p[7];
468 if(fabs(L1)<1.0E-20 || fabs(L2)<1.0E-20 || fabs(L3)<1.0E-20 || fabs(L4)<1.0E-20) {
469 if(verbose>1) printf(
"too small L parameter(s)\n");
472 for(
int i=0; i<sampleNr; i++) {
473 double xt=x[i]-delayt; v[i]=0.0;
if(!(xt>0.0))
continue;
476 v[i] += (A1+L1*(A2+A3+A4))*(1.0-a)/(L1*L1);
477 v[i] += (A1/L1)*xt*a;
479 if(L2!=0.0) v[i]-=(A2/L2)*(1.0-exp(L2*xt));
else v[i]+=A2*xt;
480 if(L3!=0.0) v[i]-=(A3/L3)*(1.0-exp(L3*xt));
else v[i]+=A3*xt;
481 if(L4!=0.0) v[i]-=(A4/L4)*(1.0-exp(L4*xt));
else v[i]+=A4*xt;
485 if(strcasecmp(fid,
"fengm2s")==0) {
486 if(parNr<4)
return(2);
487 double delayt=0.0;
if(parNr>4) delayt=p[4];
489 double A1, A2, L1, L2;
490 A1=p[0]; L1=p[1]; A2=p[2]; L2=p[3];
491 if(fabs(L1)<1.0E-20 || fabs(L2)<1.0E-20) {
492 if(verbose>1) printf(
"too small L parameter(s)\n");
495 for(
int i=0; i<sampleNr; i++) {
496 double xt=x[i]-delayt; v[i]=0.0;
if(!(xt>0.0))
continue;
499 v[i] += (A1+L1*A2)*(1.0-a)/(L1*L1);
500 v[i] += (A1/L1)*xt*a;
502 if(L2!=0.0) v[i]-=(A2/L2)*(1.0-exp(L2*xt));
else v[i]+=A2*xt;
507 if(strcasecmp(fid,
"gammav")==0 && parNr>=3 && fabs(p[1]-1.0)<1.0E-10) {
508 if(parNr<3)
return(2);
509 double delayt=0.0;
if(parNr>3) delayt=p[3];
510 for(
int i=0; i<sampleNr; i++) {
511 double xt=x[i]-delayt; v[i]=0.0;
512 if(!(xt>0.0) || fabs(p[2])<1.0E-10)
continue;
513 v[i] = p[0]*p[2]*(p[2] - (p[2]+xt)*exp(-xt/p[2]));
519 if(strcasecmp(fid,
"surge")==0) {
520 if(parNr<2)
return(2);
521 for(
int i=0; i<sampleNr; i++) {
522 double xt=x[i]; v[i]=0.0;
523 if(!(xt>0.0))
continue;
524 v[i] = p[0]*(1.0 - (p[1]*xt + 1.0)*exp(-p[1]*xt));
530 if(strcasecmp(fid,
"tradsurge")==0) {
531 if(parNr<2)
return(2);
532 double f=p[0]/(p[1]*p[1]);
533 for(
int i=0; i<sampleNr; i++) {
534 double xt=x[i]; v[i]=0.0;
535 if(!(xt>0.0))
continue;
536 v[i] = f*(1.0 - (p[1]*xt + 1.0)*exp(-p[1]*xt));
542 if(strcasecmp(fid,
"surgefdgaif")==0) {
543 if(parNr<5)
return(2);
545 for(
int i=0; i<sampleNr; i++) {
546 double xt=x[i]-delayt; v[i]=0.0;
547 if(!(xt>0.0))
continue;
548 v[i] += p[3]*(1.0-(p[4]*p[1]*xt + 1.0)*exp(-p[4]*p[1]*xt))/(p[1]*p[1]*p[4]*p[4]);
549 v[i] += (1.0-exp(-p[1]*xt))/p[1];
556 if(strcasecmp(fid,
"erlangpdf")==0 && p[2]<20.5) {
557 if(parNr<3)
return(2);
558 double A=p[0], k=p[1];
if(!(k>=0.0))
return(2);
559 int N=(int)round(p[2]);
if(!(N>=0) || N>20)
return(2);
561 for(
int i=0; i<sampleNr; i++) {
562 if(x[i]>=0.0) v[i]=A;
else v[i]=0.0;
565 for(
int i=0; i<sampleNr; i++) {
566 if(x[i]>=0.0) v[i]=A*(1.0-exp(-k*x[i]));
else v[i]=0.0;
569 for(
int i=0; i<sampleNr; i++) {
570 if(x[i]>=0.0) v[i]=A*(1.0 - exp(-k*x[i]) - k*x[i]*exp(-k*x[i]));
else v[i]=0.0;
573 for(
int i=0; i<sampleNr; i++) {
574 if(!(x[i]>=0.0)) {v[i]=0.0;
continue;}
576 for(
int j=2; j<N; j++) s+=pow(k*x[i], j)/
lfactorial(j);
577 v[i]=A*(1.0-s*exp(-k*x[i]));
585 if(strcasecmp(fid,
"1exp")==0) {
586 if(parNr<2)
return(2);
587 double A=p[0], k=p[1];
588 if(fabs(k)<1.0E-20) {
589 for(
int i=0; i<sampleNr; i++) v[i]=A*x[i];
591 for(
int i=0; i<sampleNr; i++) v[i]=(A/k)*(exp(k*x[i]) - 1.0);
595 if(strcasecmp(fid,
"2exp")==0) {
596 if(parNr<4)
return(2);
597 for(
int i=0; i<sampleNr; i++) v[i]=0.0;
598 for(
int n=0; n<=1; n++) {
599 double A=p[n*2], k=p[n*2+1];
600 if(fabs(k)<1.0E-20) {
601 for(
int i=0; i<sampleNr; i++) v[i]+=A*x[i];
603 for(
int i=0; i<sampleNr; i++) v[i]+=(A/k)*(exp(k*x[i]) - 1.0);
608 if(strcasecmp(fid,
"3exp")==0) {
609 if(parNr<6)
return(2);
610 for(
int i=0; i<sampleNr; i++) v[i]=0.0;
611 for(
int n=0; n<=2; n++) {
612 double A=p[n*2], k=p[n*2+1];
613 if(fabs(k)<1.0E-20) {
614 for(
int i=0; i<sampleNr; i++) v[i]+=A*x[i];
616 for(
int i=0; i<sampleNr; i++) v[i]+=(A/k)*(exp(k*x[i]) - 1.0);
621 if(strcasecmp(fid,
"4exp")==0) {
622 if(parNr<8)
return(2);
623 for(
int i=0; i<sampleNr; i++) v[i]=0.0;
624 for(
int n=0; n<=3; n++) {
625 double A=p[n*2], k=p[n*2+1];
626 if(fabs(k)<1.0E-20) {
627 for(
int i=0; i<sampleNr; i++) v[i]+=A*x[i];
629 for(
int i=0; i<sampleNr; i++) v[i]+=(A/k)*(exp(k*x[i]) - 1.0);
634 if(strcasecmp(fid,
"5exp")==0) {
635 if(parNr<10)
return(2);
636 for(
int i=0; i<sampleNr; i++) v[i]=0.0;
637 for(
int n=0; n<=4; n++) {
638 double A=p[n*2], k=p[n*2+1];
639 if(fabs(k)<1.0E-20) {
640 for(
int i=0; i<sampleNr; i++) v[i]+=A*x[i];
642 for(
int i=0; i<sampleNr; i++) v[i]+=(A/k)*(exp(k*x[i]) - 1.0);
648 if(verbose>1) printf(
"function '%s' not supported by %s()\n", fid, __func__);
677 printf(
"%s('%s', %d, p[], %d, x[], y[], %d)\n", __func__, fid, parNr, sampleNr, verbose);
680 if(parNr<1 || p==NULL || sampleNr<1 || x==NULL || v==NULL)
return(1);
683 double xt, delayt=0.0;
685 if(strcasecmp(fid,
"fengm2")==0) {
686 if(parNr<6)
return(2);
687 if(parNr>6) delayt=p[6];
688 double A1, A2, A3, L1, L2, L3;
689 A1=p[0]; L1=p[1]; A2=p[2]; L2=p[3]; A3=p[4]; L3=p[5];
690 if(fabs(L1)<1.0E-06 || fabs(L2)<1.0E-06 || fabs(L3)<1.0E-06) {
691 if(verbose>1) printf(
"too small L parameter(s)\n");
694 for(i=0; i<sampleNr; i++) {
695 xt=x[i]-delayt; v[i]=0.0;
if(!(xt>0.0))
continue;
697 v[i] += (((A1*xt-A2-A3)*L1 - 2.0*A1) * exp(L1*xt) + 2.0*A1)/(L1*L1*L1);
698 v[i] += (A1*xt+A2+A3)/(L1*L1);
699 v[i] += (A2*xt+A3*xt)/L1;
701 if(L2!=0.0) v[i] -= (A2/(L2*L2))*(1.0 - exp(L2*xt)) + A2*xt/L2;
702 if(L3!=0.0) v[i] -= (A3/(L3*L3))*(1.0 - exp(L3*xt)) + A3*xt/L3;
706 if(strcasecmp(fid,
"fengm2e")==0) {
707 if(parNr<8)
return(2);
708 if(parNr>8) delayt=p[8];
709 double A1, A2, A3, A4, L1, L2, L3, L4;
710 A1=p[0]; L1=p[1]; A2=p[2]; L2=p[3]; A3=p[4]; L3=p[5]; A4=p[6]; L4=p[7];
711 if(fabs(L1)<1.0E-15 || fabs(L2)<1.0E-15 || fabs(L3)<1.0E-15 || fabs(L4)<1.0E-15) {
712 if(verbose>1) printf(
"too small L parameter(s)\n");
715 for(i=0; i<sampleNr; i++) {
716 xt=x[i]-delayt; v[i]=0.0;
if(!(xt>0.0))
continue;
717 v[i] = A4*L1*L1*L1*L2*L2*L3*L3*L4*xt +
718 A4*L1*L1*L1*L2*L2*L3*L3*(1-exp(L4*xt)) +
719 L4*L4*(A3*L1*L1*L1*L2*L2*L3*xt + A3*L1*L1*L1*L2*L2*(1.0-exp(L3*xt)) +
720 L3*L3*(A2*L1*L1*L1*L2*xt + A2*L1*L1*L1*(1.0-exp(L2*xt)) -
721 L2*L2*((A2+A3+A4)*xt*L1*L1 + (A1*xt+A2+A3+A4)*L1 +
722 ((A1*xt-A2-A3-A4)*L1-2.0*A1)*exp(L1*xt) + 2.0*A1)));
723 v[i] /= -(L1*L1*L1*L2*L2*L3*L3*L4*L4);
728 if(strcasecmp(fid,
"gammav")==0 && parNr>=3 && fabs(p[1]-1.0)<1.0E-10) {
729 if(parNr<3)
return(2);
730 if(parNr>3) delayt=p[3];
731 for(i=0; i<sampleNr; i++) {
732 xt=x[i]-delayt; v[i]=0.0;
733 if(!(xt>0.0) || fabs(p[2])<1.0E-10)
continue;
734 v[i] = p[0]*p[2]*p[2]*((p[2]+p[2]+xt)*exp(-xt/p[2]) - p[2] - p[2] + xt);
739 if(verbose>1) printf(
"function '%s' not supported by %s()\n", fid, __func__);
769 printf(
"%s('%s', %d, p[], %d, x1[], x2[], y[], %d)\n", __func__, fid, parNr, sampleNr, verbose);
772 if(parNr<1 || p==NULL || sampleNr<1 || x1==NULL || x2==NULL || y==NULL)
return(1);
775 double xt1, xt2, v, fd, delayt=0.0;
777 if(strcasecmp(fid,
"fengm2")==0) {
778 if(parNr<6)
return(2);
779 if(parNr>6) delayt=p[6];
780 double A1, A2, A3, L1, L2, L3;
781 A1=p[0]; L1=p[1]; A2=p[2]; L2=p[3]; A3=p[4]; L3=p[5];
782 if(fabs(L1)<1.0E-12 || fabs(L2)<1.0E-12 || fabs(L3)<1.0E-12) {
783 if(verbose>1) printf(
"too small L parameter(s)\n");
786 for(i=0; i<sampleNr; i++) {
787 xt1=x1[i]-delayt; xt2=x2[i]-delayt; y[i]=0.0;
788 if(xt1>xt2) {v=xt1; xt1=xt2; xt2=v;}
789 if(!(xt2>0.0))
continue;
793 ret=
mfEvalY(fid, parNr, p, 1, x2+i, y+i, verbose);
794 if(ret!=0)
return(ret);
796 if(!(xt1>0.0)) xt1=0.0;
798 y[i] = A3*L1*L1*L2*(exp(L3*xt1) - exp(L3*xt2)) +
799 L3*( A2*L1*L1*(exp(L2*xt1) - exp(L2*xt2)) +
800 L2*(((A1*xt1-A2-A3)*L1-A1)*exp(L1*xt1) -
801 ((A1*xt2-A2-A3)*L1-A1)*exp(L1*xt2)
804 y[i] /= -(L1*L1*L2*L3);
810 if(strcasecmp(fid,
"fengm2e")==0) {
811 if(parNr<8)
return(2);
812 if(parNr>8) delayt=p[8];
813 double A1, A2, A3, A4, L1, L2, L3, L4;
814 A1=p[0]; L1=p[1]; A2=p[2]; L2=p[3]; A3=p[4]; L3=p[5]; A4=p[6]; L4=p[7];
815 if(fabs(L1)<1.0E-20 || fabs(L2)<1.0E-20 || fabs(L3)<1.0E-20 || fabs(L4)<1.0E-20) {
816 if(verbose>1) printf(
"too small L parameter(s)\n");
819 for(i=0; i<sampleNr; i++) {
820 xt1=x1[i]-delayt; xt2=x2[i]-delayt; y[i]=0.0;
821 if(xt1>xt2) {v=xt1; xt1=xt2; xt2=v;}
822 if(!(xt2>0.0))
continue;
826 ret=
mfEvalY(fid, parNr, p, 1, x2+i, y+i, verbose);
827 if(ret!=0)
return(ret);
829 if(!(xt1>0.0)) xt1=0.0;
831 y[i] = A4*L1*L1*L2*L3*(exp(L4*xt1) - exp(L4*xt2)) +
832 L4*( A3*L1*L1*L2*(exp(L3*xt1) - exp(L3*xt2)) +
833 L3*( A2*L1*L1*(exp(L2*xt1) - exp(L2*xt2)) +
834 L2*(((A1*xt1-A2-A3-A4)*L1-A1)*exp(L1*xt1) -
835 ((A1*xt2-A2-A3-A4)*L1-A1)*exp(L1*xt2)
837 y[i] /= -(L1*L1*L2*L3*L4);
844 if(strcasecmp(fid,
"gammav")==0 && parNr>=3 && fabs(p[1]-1.0)<1.0E-10) {
845 if(parNr<3)
return(2);
846 if(parNr>3) delayt=p[3];
847 for(i=0; i<sampleNr; i++) {
848 xt1=x1[i]-delayt; xt2=x2[i]-delayt; y[i]=0.0;
849 if(fabs(p[2])<1.0E-10)
continue;
850 if(xt1>xt2) {v=xt1; xt1=xt2; xt2=v;}
851 if(!(xt2>0.0))
continue;
855 ret=
mfEvalY(fid, parNr, p, 1, x2+i, y+i, verbose);
856 if(ret!=0)
return(ret);
858 if(!(xt1>0.0)) xt1=0.0;
860 y[i] = p[0]*p[2]*( (p[2]+xt1)*exp(-xt1/p[2]) - (p[2]+xt2)*exp(-xt2/p[2]) );
867 if(verbose>1) printf(
"function '%s' not supported by %s()\n", fid, __func__);