winter_spring 发表于 2010-12-5 17:14

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

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

Rainyboy 发表于 2010-12-5 17:55

跟常数项不为零的多项式拟合在算法上有区别么?

wqsong 发表于 2010-12-5 20:39

本帖最后由 wqsong 于 2010-12-5 21:04 编辑

总体思路是最小二乘法,具体做法需要进行换元。
y=a*x^2+b*x
y/x= ax+b
然后设Y=y/x,则有:Y=ax+b
然后根据已有的数据拟合就可以了,拟合完再换回去就可以了。
程序不难写。。。等会写。。。

wqsong 发表于 2010-12-5 21:20

#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);
}大体就是这样子,没调试,自己看吧,传递给函数的参数是换元以后的。因为拟合次数低,所以没用矩阵运算。

wqsong 发表于 2010-12-5 21:43

关于最小二乘法:
已知函数群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。

kerbcurb 发表于 2012-9-20 17:24

求这个: (y/x)=a*x + b,把每一点(xn, yn),换成:(xn, (yn/xn))然后拟合
页: [1]
查看完整版本: 求助如何应用C/C++拟合常数项为0的多项式