/// <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 }
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); }