基于最小二乘法的C++二次抛物线拟合
2011-11-23 12:46
417 查看
// //a0x^2+a1x+a2 = y //r:相关系数^2 bool Parabola(double* x, double* y, int n, double* a, double* r) { const int CURVE_INDEX = 3; double B[CURVE_INDEX]; double **A =new double*[CURVE_INDEX]; for (int i=0; i<CURVE_INDEX; i++) { A[i] = new double[CURVE_INDEX]; } double sumX=0, sumXX=0, sumXXX=0, sumXXXX=0, sumY=0, sumXY=0, sumXXY=0; for (int i=0; i<n; i++) { sumX += x[i]; sumXX += x[i]*x[i]; sumXXX += x[i]*x[i]*x[i]; sumXXXX += x[i]*x[i]*x[i]*x[i]; sumY += y[i]; sumXY+= x[i]*y[i]; sumXXY += x[i]*x[i]*y[i]; } A[0][0] = sumXXXX;A[0][1]=sumXXX;A[0][2]=sumXX; A[1][0] = sumXXX;A[1][1]=sumXX;A[1][2]=sumX; A[2][0] = sumXX;A[2][1]=sumX;A[2][2]=n; // B[0] = sumXXY; B[1] = sumXY; B[2] = sumY; bool solved = Solve(A, B, a, CURVE_INDEX); for (int i=0; i<CURVE_INDEX; i++) { delete A[i]; } delete A; // double *ny = new double ; double meanNY=0, meanYNY=0; for (int i=0; i<n; i++) { ny[i] = a[0]*x[i]*x[i]+a[1]*x[i]+a[2]; meanNY += ny[i]; meanYNY += y[i]*ny[i]; } meanYNY /= n; double meanY = sumY / n; meanNY /= n; double sumNY2=0, sumY2=0, sumYNY2=0; for (int i=0; i<n; i++) { sumNY2 += (ny[i]-meanNY)*(ny[i]-meanNY); sumY2 += (y[i] - meanY)*(y[i] - meanY); sumYNY2 += (ny[i]-meanNY)*(y[i] - meanY); } *r=0; if(fabs(sumNY2) > EPSILONG && fabs(sumY2) > EPSILONG) { *r = (sumYNY2*sumYNY2)/(sumNY2*sumY2); } delete []ny; return solved; }
相关文章推荐
- 最小二乘法直线拟合(C++)
- 基于最小二乘法的直线拟合----同济---第六版---下册---125页
- 【算法+OpenCV】基于opencv的直线和曲线拟合与绘制(最小二乘法)
- 最小二乘法拟合直线c++代码
- 基于opencv的直线和曲线拟合与绘制(最小二乘法) (待测试)
- 最小二乘法拟合直线-C++实现
- C++最小二乘法拟合-(线性拟合和多项式拟合)
- C++最小二乘法拟合-(线性拟合和多项式拟合)
- 基于开源C++的QGIS二次开发学习(一)——属性拷贝
- 基于回归曲线拟合模型的ALS(最小二乘法)推导过程以及Python实现
- 曲线拟合的最小二乘法(基于OpenCV实现)
- 算法+OpenCV】基于opencv的直线和曲线拟合与绘制(最小二乘法)
- 基于三次Bezier原理的曲线拟合算法C++与OpenCV实现
- 基于最小二乘法的曲线拟合的C++代码的实现
- 基于最小二乘法的平面拟合,背景去除
- 最小二乘法拟合多项式原理以及c++实现
- Python基于最小二乘法实现曲线拟合示例
- C++实现最小二乘法对y=exp(x)的二次拟合
- 【算法+OpenCV】基于三次Bezier原理的曲线拟合算法C++与OpenCV实现
- 最小二乘法拟合多项式原理以及c++实现