using System; namespace Extreme.Mathematics.QuickStart.CSharp { // The GeneralMatrix and LeastSquaresSolver classes reside in the // Extreme.Mathematics.LinearAlgebra namespace. using Extreme.Mathematics.LinearAlgebra; /// <summary> /// Illustrates solving least squares problems using the /// LeastSquaresSolver class in the Extreme.Mathematics.LinearAlgebra /// namespace of the Extreme Optimization Mathematics Library /// for .NET. /// </summary> class LinearEquations { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(string[] args) { // A least squares problem consists in finding // the solution to an overdetermined system of // simultaneous linear equations so that the // sum of the squares of the error is minimal. // // A common application is fitting data to a // curve. See the CurveFitting sample application // for a complete example. // Let's start with a general matrix. This will be // the matrix a in the left hand side ax=b: GeneralMatrix a = new GeneralMatrix(6, 4, new double[] { 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 4, 9, 16, 25, 36, 1, 2, 1, 2, 1, 2 }); // Here is the right hand side: Vector b = new GeneralVector(1, 3, 6, 11, 15, 21); Matrix b2 = new GeneralMatrix(6, 2, new double[] { 1, 3, 6, 11, 15, 21, 1, 2, 3, 4, 5, 7 }); Console.WriteLine("a = {0}", a); Console.WriteLine("b = {0}", b); // // The LeastSquaresSolver class // // The following creates an instance of the // LeastSquaresSolver class for our problem: LeastSquaresSolver solver = new LeastSquaresSolver(a, b); // We can specify the solution method: normal // equations or QR decomposition. In most cases, // a QR decomposition is the most desirable: solver.SolutionMethod = LeastSquaresSolutionMethod.QRDecomposition; // The Solve method calculates the solution: Vector x = solver.Solve(); Console.WriteLine("x = {0}", x.ToString("F4")); // The Solution property also returns the solution: Console.WriteLine("x = {0}", solver.Solution.ToString("F4")); // More detailed information is available from // additional methods. // The values of the right hand side predicted // by the solution: Console.WriteLine("Predictions = {0}", solver.GetPredictions().ToString("F4")); // The residues (errors) of the solution: Console.WriteLine("Residuals = {0}", solver.GetResidues().ToString("F4")); // The total sum of squares of the residues: Console.WriteLine("Residual square error = {0}", solver.GetResidualSumOfSquares().ToString("F4")); // // Direct normal equations // // Alternatively, you can create a least squares // solution by providing the normal equations // directly. This may be useful when it is easy // to calculate the normal equations directly. // // Here, we'll just calculate the normal equation: SymmetricMatrix aTa = SymmetricMatrix.FromOuterProduct(a); Vector aTb = b * a; // We find the solution by solving the normal equations // directly: x = aTa.Solve(aTb); Console.WriteLine("x = {0}", x.ToString("F4")); // However, properties of the least squares solution, such as // error estimates and residuals are not available. Console.Write("Press Enter key to exit..."); Console.ReadLine(); } } }