←to practical programming

Ordinary least-squares fit

Objective

Fit a linear combination Fc(x) of given functions fk(x),

F(x)=∑k=1…mckfk(x) ,
to a (measured) data set
{xi, yi, δyi}i=1…n ,
where δyi are the uncertainties of the measurement (error-bars).

Hints

You can pass around a set of functions {fi(x)}k=1…m in a variable of the type Func<double,double>[] (that is, an array of functions). For example,

var fs = new Func<double,double>[] { z => 1.0, z => z, z => z*z };
Tasks
  1. (6 points) Ordinary least-squares fit by QR-decomposition

    • Make sure that your QR-decomposition routines work for tall matrices.

    • Implement a routine that makes a least-squares fit—using your QR-decomposition routines—of a given data-set,

    {xi, yi, δyi}i=1…n ,
    with a linear combination
    Fc(x) ≐ ∑k=1…m ck fk(x)
    
    of given functions fk(x)|k=1..m . The interface could be something like
    vector lsfit(Func<double,double>[] fs, vector x, vector y, vector dy) 
    The routine takes as arguments the data to fit, {xi, yi, δyi}, and the set of functions, {fk}, the linear combination of which should fit the data. The routine must calculate and return the vector of the best fit coefficients, {ck}.

    • Investigate the law of radioactive decay: In 1902 [Rutherford and Soddy] measured the radioactivity of the (then not well explored) element, called ThX at the time, and obtained the following results,

    Time t (days)                     : 1,  2,  3, 4, 6, 9,   10,  13,  15
    Activity y of ThX (relative units): 117,100,88,72,53,29.5,25.2,15.2,11.1
    

    From this data they correctly deduced that radioactive decay follows exponentil law, y(t)=ae-λt (equation (1) in the article).

    Now, assume that the incertainty δy of the measurement (which is actually nowhere to find in the article – those were the days) was determined by the last-but-one digit of the measurement, let's say about 5%,

     δy: 6,5,4,4,4,3,3,2,2 
    and fit the data with exponential function in the usual logarithmic way,
    ln(y)=ln(a)-λt .
    The uncertainty of the logarithm should be taken as δln(y)=δy/y (prove it).

    • Plot the experimental data (with error-bars) and your best fit. From your fit find out the half-life time, T½ = ln(2)/λ, of ThX. This isotope is known today as 224Ra – compare your result with the modern value.

  2. (3 points) Uncertainties of the fitting coefficients

    • Modify you least-squares fitting function such that it also calculates the covariance matrix and the uncertainties of the fitting coefficients.

    (vector,matrix) lsfit(Func<double,double>[] fs, vector x, vector y, vector dy) 
    • Estimate the uncertainty of the half-life value for ThX from the given data – does it agree with the modern value within the estimated uncertainty?
  3. (1 points) Evaluation of the quality of the uncertainties on the fit coefficients

    • Plot your best fit,

    Fc(x)=∑k=1…mck fk(x),
    together with the fits where you change the fit coefficients by the estimated δc, that is,
    Fc±δc(x)=∑k=1…m(ck±δck)fk(x).
    You can either add/subtract δck to all coefficients at once, or individually.