Program to fit a model to a vector of data.  The model is given by a
symbolic expression, with parameters to be estimated.

Usage: 1dNLfit OPTIONS

Options: [all but '-meth' are actually mandatory]

 -expr eee   = The expression for the fit.  It must contain one symbol from
               'a' to 'z' which is marked as the independent variable by
               option '-indvar', and at least one more symbol which is
               a parameter to be estimated.
               ++ Expressions use the same syntax as 3dcalc, ccalc, and 1deval.
               ++ Note: expressions and symbols are not case sensitive.

 -indvar c d = Indicates which variable in '-expr' is the independent
               variable.  All other symbols are parameters, which are
               either fixed (constants) or variables to be estimated.
               ++ Then, read the values of the independent variable from
                  1D file 'd' (only the first column will be used).
               ++ If the independent variable has a constant step size,
                  you can input it via with 'd' replaced by a string like
                    '1D: 100%0:2.1'
                  which creates an array with 100 value, starting at 0,
                  then adding 2.1 for each step:
                    0 2.1 4.2 6.3 8.4 ...

 -param ppp  = Set fixed value or estimating range for a particular
               ++ For a fixed value, 'ppp' takes the form 'a=3.14', where the
                  first letter is the symbol name, which must be followed by
                  an '=', then followed by a constant expression.  This
                  expression can be symbolic, as in 'a=cbrt(3)'.
               ++ For a parameter to be estimated, 'ppp' takes the form of
                  two constant expressions separated by a ':', as in
               ++ All symbols in '-expr' must have a corresponding '-param'
                  option, EXCEPT for the '-indvar' symbol (which will be set
                  by its data file).

 -depdata v  = Read the values of the dependent variable (to be fitted to
               '-expr') from 1D file 'v'.
               ++ File 'v' must have the same number of rows as file 'd'
                  from the '-indvar' option!
               ++ File 'v' can have more than one column; each will be fitted
                  separately to the expression.

 -meth m     = Set the method for fitting: '1' for L1, '2' for L2.
               (The default method is L2, which is usually better.)

Create a sin wave corrupted by logistic noise, to file ss.1D.
Create a cos wave similarly, to file cc.1D.
Put these files together into a 2 column file sc.1D.
Fit both columns to a 3 parameter model and write the fits to file ff.1D.
Plot the data and the fit together, for fun and profit(?).

1deval -expr 'sin(2*x)+lran(0.3)' -del 0.1 -num 100 > ss.1D
1deval -expr 'cos(2*x)+lran(0.3)' -del 0.1 -num 100 > cc.1D
1dcat ss.1D cc.1D > sc.1D ; \rm ss.1D cc.1D
1dNLfit -depdata sc.1D -indvar x '1D: 100%0:0.1' -expr 'a*sin(b*x)+c*cos(b*x)' \
        -param a=-2:2 -param b=1:3 -param c=-2:2  > ff.1D
1dplot -one -del 0.1 -ynames sin:data cos:data sin:fit cos:fit - sc.1D ff.1D

* PLOT YOUR RESULTS!  There is no guarantee that you'll get a good fit.

* This program is not particularly efficient, so using it on a large
  scale (e.g., for lots of columns, or in a shell loop) will be slow.

* The results (fitted time series models) are written to stdout,
  and should be saved by '>' redirection (as in the example).
  The first few lines of the output from the example are:
   # 1dNLfit output (meth=L2)
   # expr = a*sin(b*x)+c*cos(b*x)
   # Fitted parameters:
   # A =      1.0828     0.12786
   # B =      1.9681      2.0208
   # C =     0.16905      1.0102
   #     ----------- -----------
             0.16905      1.0102
             0.37753      1.0153
             0.57142     0.97907

* Coded by Zhark the Well-Fitted - during Snowzilla 2016.