Пример #1
0
        /// <summary>
        /// 求无加权最小二乘解。
        /// </summary>
        /// <param name="rowCount">行数(方程数)。</param>
        /// <param name="columnCount">列数(未知数数)。</param>
        /// <param name="coefficients">系数矩阵(用向量表示)。</param>
        /// <param name="constants">常数项向量。</param>
        /// <returns>无加权最小二乘解。</returns>
        static public double[] OrdinaryLeastSquares(int rowCount, int columnCount, double[] coefficients, double[] constants)
        {
            DenseMatrix a = Matrix.Create(rowCount, columnCount, coefficients, MatrixElementOrder.ColumnMajor);
            DenseVector b = Vector.Create(constants);

            LeastSquaresSolver solver = new LeastSquaresSolver(a, b);

            try
            {
                solver.SolutionMethod = LeastSquaresSolutionMethod.NormalEquations;
                return(solver.Solution.ToArray());
            }
            catch
            {
                solver.SolutionMethod = LeastSquaresSolutionMethod.SingularValueDecomposition;
                return(solver.Solution.ToArray());
            }

            //#region 输出到文件
            //StreamWriter coefficientFile = new StreamWriter("Output/ + Constant.Gold + "/" + Coefficients.csv", false, Encoding.Default);
            //coefficientFile.Write(doubleArrayToString(coefficients));
            //coefficientFile.Close();

            //StreamWriter constantFile = new StreamWriter("Output/ + Constant.Gold + "/" + Constants.csv", false, Encoding.Default);
            //constantFile.Write(doubleArrayToString(constants));
            //constantFile.Close();
            //#endregion
        }
Пример #2
0
        static void ExtremeLeastSquares()
        {
            //DenseMatrix a = Matrix.Create(6, 2, new double[]
            //    {
            //        1, 2, 1,1, 2, 1,
            //        1, 1, 2,1, 1, 2,
            //    }, MatrixElementOrder.ColumnMajor);
            //DenseVector b = Vector.Create(1, -2, 4, 5, 8, 6);

            DenseMatrix a = Matrix.Create(3, 2, new double[]
            {
                1, 2, 1,
                1, 1, 1,
            }, MatrixElementOrder.ColumnMajor);
            DenseVector b = Vector.Create(1, 2, 3);

            LeastSquaresSolver solver = new LeastSquaresSolver(a, b);

            solver.SolutionMethod = LeastSquaresSolutionMethod.NormalEquations;
            //Vector x = solver.Solve();

            double[] result = solver.Solution.ToArray();

            //DenseMatrix m = Matrix.Create(2, 2, new double[]
            //    {
            //        1, 1,
            //        1, 1,
            //    }, MatrixElementOrder.ColumnMajor);
            //DenseVector b1 = Vector.Create(1, 3);
            //Vector x1 = m.Solve(b1, false);
        }