Example 1: Non-negative Least Squares

Consider the following problem:

\begin{bmatrix}1 & -3 & 2\\ -3 & 10 & -5\\ 2 & -5 & 6\end{bmatrix} \begin{bmatrix}x_1\\ x_2\\ x_3\end{bmatrix} = \begin{bmatrix}27\\ -78\\ 64\end{bmatrix}

Subject to the constraint x \ge 0. The NonNegativeLeastSquares class is used to compute a solution, which is compared to the exact solution of {1, -4, 7}.

using System;
using Imsl.Math;
public class NonNegativeLeastSquaresEx1
{
    public static void  Main(String[] args)
    {
        double[,] a = {{1, - 3, 2}, {- 3, 10, - 5} , {2, - 5, 6}};
        double[] b = {27, - 78, 64};
        
        NonNegativeLeastSquares nnls = 
            new NonNegativeLeastSquares(a, b);
        nnls.Solve();
        double[] x = nnls.GetSolution();
        
        new PrintMatrix("Solution").Print(x);
        
        // compare solution with exact answer
        double[,] compare = new double[2, 3];
        double[] tmp1 = Matrix.Multiply(a, x);
        double[] tmp2 = Matrix.Multiply(a, new double[]{1, - 4, 7});
        for (int i = 0; i < compare.GetLength(1); i++)
        {
            compare[0, i] = tmp1[i];
            compare[1, i] = tmp2[i];
        }
        
        PrintMatrixFormat pmf = new PrintMatrixFormat();
        pmf.SetColumnLabels(new String[]{"x >= 0", "exact"});
        PrintMatrix pm = new PrintMatrix("Comparison of 'b'");
        pm.Print(pmf, Matrix.Transpose(compare));
    }
}

Output

      Solution
          0          
0  18.4492753623188  
1   0                
2   4.5072463768116  

      Comparison of 'b'
        x >= 0        exact  
0   27.463768115942     27   
1  -77.8840579710145   -78   
2   63.9420289855073    64   


Link to C# source.