声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2924|回复: 5

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

[复制链接]
发表于 2010-12-5 17:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
如何拟合曲线 y=a*x^2+b*x, 谢谢!
回复
分享到:

使用道具 举报

发表于 2010-12-5 17:55 | 显示全部楼层
跟常数项不为零的多项式拟合在算法上有区别么?
发表于 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
然后根据已有的数据拟合就可以了,拟合完再换回去就可以了。
程序不难写。。。等会写。。。
发表于 2010-12-5 21:20 | 显示全部楼层
  1. #include <vector>

  2. void leastSquare(std::vector<double> &x, std::vector<double> &y, int &a, int &b)
  3. {
  4.         double sx = 0, sy = 0, sxy = 0, sx2 = 0; /*s前缀表示sum*/
  5.         int m = x.size();
  6.         for(int i = 0; i != m, i++)
  7.         {
  8.                 sx = sx + x[i];
  9.                 sy = sy + y[i];
  10.                 sxy = sxy + x[i]*y[i];
  11.                 sx2 = sx2 + x[i]*x[i];
  12.         }
  13.         b = (sx2*sy - sxy*sx) / (sx2*m - sx*sx);
  14.         a = (sx*sy - sxy*m) / (sx*sx - m*sx2);
  15. }
复制代码
大体就是这样子,没调试,自己看吧,传递给函数的参数是换元以后的。因为拟合次数低,所以没用矩阵运算。

评分

1

查看全部评分

发表于 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[G(xi) - yi]^2最小。
假设样本点的数目为m,应该满足n<m。
发表于 2012-9-20 17:24 | 显示全部楼层
求这个: (y/x)=a*x + b,把每一点(xn, yn),换成:(xn, (yn/xn))然后拟合
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-10 10:48 , Processed in 0.125291 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表