uint32_t rseqf(rst *rs) { #if RSEQMETHOD==0 return ((rs->i = (rs->i) * 2110005341UL + 2531011UL) >> 3) * 445223UL; #elif RSEQMETHOD==1 /* double d = 1. / (double)MBIG;*/ uint32_t mj; if(++rs->pk1 == rs->k_ma_end) rs->pk1 = &rs->k_ma[1]; if(++rs->pk2 == rs->k_ma_end) rs->pk2 = &rs->k_ma[1]; if((mj = *rs->pk1 - *rs->pk2) < 0) mj += MBIG; return (*rs->pk1 = mj); #elif RSEQMETHOD==2 return SHR3((rs->jsr)); #elif RSEQMETHOD==3 return FIB((rs->a),(rs->b)); #elif RSEQMETHOD==6 return rseq(rs); #else return MWC((rs->z),(rs->w)); #endif }
static int _mwc_Cmd_ (ClientData clientData, Tcl_Interp *interp, int argc, char **argv) { /* Command line definition */ char * options[] = { "SSSs", "-fit","S", NULL }; char * helpMsg = { ( " Fit the data by with a mwc model (model for tensio-actif membrane).\n" " (y=f0*prefactor*(85*(h0/x-0.5 +0.1 -x^5/(h0^5*320)- 0.5 + x^2/(h0^2*8.))\n" " + 0.5*(h0-x/2.+h0*log(2.*h0/x)) - (h0-x/2.)/10. + (64.*h0^6 - x^6)/(3840.*h0^5)\n" " + (h0-x/2.)/2. - (8*h0^3-x^3)/(48*h0^2)).\n" "\n" "Arguments :\n" " 3 signals - signal to fit, \n" " signal containing the incertaity for each point, \n" " signal containing the initial values (h0,f0).\n" " string - name of the result (h0,f0,chisq,goodness,covar --> size=8)\n." "\n" "Options :\n" " -fit : signal containing the x-value (REALY)\n" " --> return the mwc fit in this signal (REALXY).\n" ) }; Signal *datasignal,*sigmasignal, *valsignal; Signal *result, *xsignal = NULL; char *resultName; int i,j,size; real *X; int ma; int *ia; real *a,**covar,**alpha; real chisq; int u; if (arg_init(interp, argc, argv, options, helpMsg)) return TCL_OK; if (arg_get(0, &datasignal, &sigmasignal, &valsignal, &resultName) == TCL_ERROR) return TCL_ERROR; if (arg_get(1, &xsignal) == TCL_ERROR) return TCL_ERROR; size = datasignal->size; if(sigmasignal->size != size) { Tcl_AppendResult (interp, "The sigma signal should be of the same size as the input signal.", (char *) NULL); return TCL_ERROR; } if (datasignal->type == REALY) { X = (float *) malloc(sizeof(float)*size); for(i=0;i<size;i++) X[i] = datasignal->x0 + i*datasignal->dx; } else if (datasignal->type == REALXY) { X = (float *) malloc(sizeof(float)*size); for(i=0;i<size;i++) X[i] = datasignal->dataX[i]; } else { Tcl_AppendResult (interp, "Bad type for the signal (only REALY or REALXY).", (char *) NULL); return TCL_ERROR; } ma = valsignal->size; if (ma != 2) { Tcl_AppendResult (interp, "Bad number of initial value (we need 2 values h0 and f0).", (char *) NULL); return TCL_ERROR; } NonLinFitInit(&a,&ia,ma,&covar,&alpha); for(i=0;i<valsignal->size;i++) { a[i+1]=valsignal->dataY[i]; ia[i+1] = 1; } NonLinFit(X-1,datasignal->dataY-1,sigmasignal->dataY-1,size,a,ia,ma,covar,alpha, &chisq,&MWC); result = sig_new (REALY, 0, ma+ma*ma+1); result->x0 = 0.0; result->dx = 1; u =0; for(i=1;i<=ma;i++) { result->dataY[u]=a[i]; u=u+1; } result->dataY[u++]=chisq; result->dataY[u++]=NonLinFitConfidence(chisq,size,ma); for(i=1;i<=ma;i++) { for(j=1;j<=ma;j++) { result->dataY[u++]=covar[i][j]; } } if (!result) return TCL_ERROR; store_signal_in_dictionary(resultName, result); if (arg_present(1)) { if (xsignal->type != REALY) { Tcl_AppendResult (interp, "Type for xsignal must be REALY!!", (char *) NULL); return TCL_ERROR; } else { sig_realy2realxy(xsignal); sig_put_y_in_x(xsignal); for (i=0;i<xsignal->size;i++) MWC(xsignal->dataX[i],a,&(xsignal->dataY[i]),NULL,ma); } } NonLinFitDelete(a,ia,ma,covar,alpha); return TCL_OK; }