求助如何应用C/C++拟合常数项为0的多项式
如何拟合曲线 y=a*x^2+b*x, 谢谢! 跟常数项不为零的多项式拟合在算法上有区别么? 本帖最后由 wqsong 于 2010-12-5 21:04 编辑总体思路是最小二乘法,具体做法需要进行换元。
y=a*x^2+b*x
y/x= ax+b
然后设Y=y/x,则有:Y=ax+b
然后根据已有的数据拟合就可以了,拟合完再换回去就可以了。
程序不难写。。。等会写。。。 #include <vector>
void leastSquare(std::vector<double> &x, std::vector<double> &y, int &a, int &b)
{
double sx = 0, sy = 0, sxy = 0, sx2 = 0; /*s前缀表示sum*/
int m = x.size();
for(int i = 0; i != m, i++)
{
sx = sx + x;
sy = sy + y;
sxy = sxy + x*y;
sx2 = sx2 + x*x;
}
b = (sx2*sy - sxy*sx) / (sx2*m - sx*sx);
a = (sx*sy - sxy*m) / (sx*sx - m*sx2);
}大体就是这样子,没调试,自己看吧,传递给函数的参数是换元以后的。因为拟合次数低,所以没用矩阵运算。 关于最小二乘法:
已知函数群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。 求这个: (y/x)=a*x + b,把每一点(xn, yn),换成:(xn, (yn/xn))然后拟合
页:
[1]