最小二乘法拟合二元n次曲线C++实现
/* 最小二乘法拟合二元多次曲线 */
/* 已知一堆(X, Y)数据的集合 */
class LeastSquareMethod
{
public://////用最小二乘法拟合二元多次曲线///例如y=ax+b///其中MultiLine将返回a,b两个参数。///a对应MultiLine[1]///b对应MultiLine[0]vector MultiLine(const vector& arrX, const vector& arrY, int dimension){int n = dimension + 1;//dimension次方程需要求 dimension+1个 系数vector> vGuass(n, vector(n + 1));//高斯矩阵 例如:y=a0+a1*x+a2*x*xfor (int i = 0; i < n; i++){int j;for (j = 0; j < n; j++){vGuass[i][j] = SumArr(arrX, j + i);}vGuass[i][j] = SumArr(arrX, i, arrY, 1);}return ComputeGuass(vGuass, n);}//求数组元素的n次方的和double SumArr(const vector& arr, int n) const{double dSum = 0;for (int i = 0; i < arr.size(); i++){if (arr[i] != 0 || n != 0){dSum += pow(arr[i], n);}else{dSum += 1;}}return dSum;}double SumArr(const vector& arr1, int n1, const vector& arr2, int n2) const{double dSum = 0;for (int i = 0; i < arr1.size(); i++){if ((arr1[i] != 0 || n1 != 0) && (arr2[i] != 0 || n2 != 0)){dSum += pow(arr1[i], n1) * pow(arr2[i], n2);}elsedSum += 1;}return dSum;}vector ComputeGuass(vector>& Guass, int n){int i, j;int k, m;double temp;double max;double s;vector x(n, 0.0);for (j = 0; j < n; j++){max = 0;k = j;for (i = j; i < n; i++){if (abs(Guass[i][j]) > max)){max = Guass[i][j];k = i;}}if (k != j){for (m = j; m < n + 1; m++){temp = Guass[j][m];Guass[j][m] = Guass[k][m];Guass[k][m] = temp;}}if (0 == max){// "此线性方程为奇异线性方程"return x;}for (i = j + 1; i < n; i++){s = Guass[i][j];for (m = j; m < n + 1; m++){Guass[i][m] = Guass[i][m] - Guass[j][m] * s / (Guass[j][j]);}}}for (i = n - 1; i >= 0; i--){s = 0;for (j = i + 1; j < n; j++){s = s + Guass[i][j] * x[j];}x[i] = (Guass[i][n] - s) / Guass[i][i];}return x;//返回值是函数的系数}
};
数学原理完全不懂,根据C#代码实现的C++版本。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
