C#基于最小二乘法对曲线进行线性拟合,并计算斜率

        创作动力:在工控测试类项目中,经常需要对测试数据进行深度计算,其中就包含斜率的计算,为了验证计算的正确与否,需要对excel数据进行二次验证,此时需要一款能够读取excel数据并进行线性拟合计算的斜率的小工具,本项目就应运而生。文章末尾包含源码链接。

        功能介绍:1、能够获取Excel中所有sheet页的内容,并赋值到DataTable。

                          2、对获取到的数据使用最小二乘法来进行线性拟合。

                          3、对拟合后的数据进行斜率计算。

        关键代码如下:

        /// <summary>
        /// 获取Excel中所有sheet页的内容,并赋值到datatable
        /// </summary>
        /// <param name="strExcelFilePath">Excel文件路径</param>
        /// <returns></returns>
        public DataTable OpenEcxelToListDT()
        {
            List<DataTable> dataTables = new List<DataTable>();
            try
            {
                var package = new ExcelPackage(new System.IO.FileInfo(txt_ExcelPath.Text));
                ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
                ExcelWorkbook workbook = package.Workbook;

                foreach (var sheet in workbook.Worksheets)
                {
                    DataTable dt = new DataTable();
                    ExcelWorksheet workSheet = workbook.Worksheets[sheet.ToString()];
                    //判断该sheet页中是否有内容
                    if (workSheet.Dimension != null)
                    {
                        //有效内容的起始坐标
                        ExcelCellAddress start = workSheet.Dimension.Start;
                        //有效内容的终止坐标
                        ExcelCellAddress end = workSheet.Dimension.End;
                        for (int col = start.Column; col <= end.Column; col++)
                        {
                            dt.Columns.Add(workSheet.Cells[1, col].Value != null ? workSheet.Cells[1, col].Value.ToString() : col.ToString());
                        }
                        for (int row = 2; row <= end.Row; row++)
                        {
                            DataRow dataRow = dt.NewRow();
                            int x = 0;
                            for (int col = start.Column; col <= end.Column; col++)
                            {
                                dataRow[x++] = workSheet.Cells[row, col].Value?.ToString();
                            }
                            dt.Rows.Add(dataRow);
                        }
                        dt.TableName = workSheet.Name;
                    }
                    dataTables.Add(dt);
                }
            }
            catch (Exception ex) { }

            return dataTables.Where(o => o.TableName == "Sheet1").FirstOrDefault();
        }

        /// <summary>
        /// 这段代码使用了最小二乘法来进行线性拟合。首先定义了两组数据点 x 和 y,
        /// 然后通过调用 CalculateSlope() 函数来计算斜率。
        /// 该函数会根据输入的数据点计算平均值、分子和分母等参数,从而得到斜率的结果。
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentException"></exception>
        private double CalculateSlope(List<double> x, List<double> y)
        {
            int n = x.Count;
            if (n != y.Count || n < 2)
                throw new ArgumentException();

            double sumX = 0.0;
            double sumY = 0.0;
            for (int i = 0; i < n; ++i)
            {
                sumX += x[i];
                sumY += y[i];
            }

            double meanX = sumX / n;
            double meanY = sumY / n;

            double numerator = 0.0;
            double denominator = 0.0;
            for (int i = 0; i < n; ++i)
            {
                numerator += (x[i] - meanX) * (y[i] - meanY);
                denominator += Math.Pow((x[i] - meanX), 2);
            }

            return numerator / denominator;
        }

        源码链接:C# winform基于最小二乘法计算斜率

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#是一种面向对象的编程语言,它具有强大的功能和广泛的应用领域。最小二乘法是一种常用的数学方法,用于拟合曲线并找到最佳拟合参数。在C#中,可以使用数值计算库或者自己实现最小二乘法算法进行曲线拟合。 以下是使用C#实现最小二乘法拟合曲线的一般步骤: 1. 收集数据:首先需要收集一组数据点,包括自变量和因变量的取值。 2. 定义模型函数:根据实际情况,选择适当的模型函数来描述数据的关系。例如,可以选择线性函数、多项式函数或者其他非线性函数作为模型。 3. 构建矩阵方程:将数据点代入模型函数,得到一个矩阵方程。该方程可以表示为 Y = X * β,其中 Y 是因变量的向量,X 是自变量的矩阵,β 是待求的参数向量。 4. 求解参数:通过最小二乘法,可以求解出参数向量 β 的最佳估计值。这可以通过求解正规方程(Normal Equation)或者使用矩阵分解方法(如QR分解)来实现。 5. 拟合曲线:使用求解得到的参数向量,将自变量代入模型函数,得到拟合曲线的预测值。 下面是一个简单的C#代码示例,演示如何使用最小二乘法拟合一条直线: ```csharp using System; using MathNet.Numerics.LinearAlgebra; class Program { static void Main() { // 收集数据 double[] xData = { 1, 2, 3, 4, 5 }; double[] yData = { 2, 4, 6, 8, 10 }; // 构建矩阵方程 Matrix<double> X = Matrix<double>.Build.DenseOfColumnArrays(xData); Matrix<double> Y = Matrix<double>.Build.DenseOfColumnArrays(yData); // 求解参数 Vector<double> beta = X.TransposeAndMultiply(X).Inverse() * X.TransposeAndMultiply(Y); // 输出参数估计值 Console.WriteLine("参数估计值:"); Console.WriteLine("beta0 = " + beta[0]); Console.WriteLine("beta1 = " + beta[1]); // 拟合曲线 Console.WriteLine("拟合曲线:"); for (int i = 0; i < xData.Length; i++) { double yPredict = beta[0] + beta[1] * xData[i]; Console.WriteLine("x = " + xData[i] + ", y = " + yPredict); } } } ``` 这段代码使用了MathNet.Numerics库来进行矩阵运算。首先,定义了一组数据点,然后构建了矩阵方程,使用最小二乘法求解参数估计值,最后输出了参数估计值和拟合曲线的预测值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值