秦晓蕊 发表于 2013-8-16 09:47:54

[C/C++] 求助如何应用C/C++拟合常数项为0的多项式 ?

如何拟合曲线 y=a*x^2+b*x, 谢谢!

苏晓晓 发表于 2013-8-16 09:59:20

总体思路是最小二乘法,具体做法需要进行换元。y=a*x^2+b*xy/x= ax+b然后设Y=y/x,则有:Y=ax+b然后根据已有的数据拟合就可以了,拟合完再换回去就可以了。1.#include <vector>2.3.voidleastSquare(std::vector<double> &x, std::vector<double> &y,int &a, int &b)4.{5.      double sx =0, sy = 0, sxy = 0, sx2 = 0; /*s前缀表示sum*/ 6.      int m =x.size(); 7.      for(int i =0; i != m, i++)8.      {9.               sx = sx + x; 10.               sy = sy + y; 11.               sxy = sxy + x*y; 12.               sx2 = sx2 + x*x; 13.      }14.      b = (sx2*sy- sxy*sx) / (sx2*m - sx*sx); 15.      a = (sx*sy -sxy*m) / (sx*sx - m*sx2);16.}大体就是这样子,没调试,自己看吧,传递给函数的参数是换元以后的。因为拟合次数低,所以没用矩阵运算。关于最小二乘法:已知函数群F={f0(x), f1(x), f2(x), f3(x), ..., fn(x)}寻找函数G(x) = a0*f0(x)+a1*f1(x)+a2*f2(x)+...+an*fn(x)的系数,使得SUM^2最小。假设样本点的数目为m,应该满足n<m。
页: [1]
查看完整版本: [C/C++] 求助如何应用C/C++拟合常数项为0的多项式 ?