现有多个点,其位置在Y轴方向有一定偏差,比如下面5个点:
(0,20)、(10,21)、(20,18),(30,22)、(40,19)用这5个点连出来的是一条折线,如何才能将折线拟和成一条直线,且保证近似度最好???我听说过什么最小二乘法,但我对算法懂得很少,不知道怎么用。麻烦知道的大侠给出代码或类,十分感谢!!
(0,20)、(10,21)、(20,18),(30,22)、(40,19)用这5个点连出来的是一条折线,如何才能将折线拟和成一条直线,且保证近似度最好???我听说过什么最小二乘法,但我对算法懂得很少,不知道怎么用。麻烦知道的大侠给出代码或类,十分感谢!!
解决方案 »
- STL中map第二个元素是不是必须是定长的,是不是vector之类不定长的就不可以
- cButtonST的setBitmaps函数问题
- 想在对话框里显示一张图片,用什么办法好?
- 想学习VC++能否提供适合初学者门槛较低的书籍?
- MFC真的过时了吗?大家给点说法
- 300分!快进来!CRecordset的问题!
- 各位给我推荐本书好吗?
- 我的Socket怎么不通了??还有有关AsyncSeletc()函数的问题,绝对给分,在线等候
- 我的机器装了VS2010 2013,但是编译boost的时候它默认2013该怎么以10为编译器
- 谁能告诉我,类里普通函数,(不包括静态函数,虚拟函数)在内存里是如何分配地址的?是通过符号表来进行寻址的吗?
- 如何实现类似ACDSEE中图象浏览的功能?
- XP下硬盘扇区读写的问题
http://www.math.sjtu.edu.cn/gskc/syal/最小64.gif那个n就是你点的个数,xi和yi表示各点的x值和y值求出a和b之后,就知道直线了:y=ax+b
2、看看《测量平差原理》
#include"stdio.h"
const int N = 5;
int main(void)
{
double* fLS(int x[],double y[]);
int x[N] = {0,10,20,30,40};
double y[N] = {20,21,18,22,19};
double *p; p = fLS(x,y);
for(int i=0;i<N;i++)
{
printf("%f\n",*(p+i));
}
return 0;
}//最小二乘法
double* fLS(int x[],double y[])
{
int axy=0, ax=0, ay=0, ax2=0, axx=0;
double a=0, b=0, *p;
for(int i=0;i<N;i++)
{
axy += x[i]*y[i];
ax += x[i];
ay += y[i];
axx += x[i]*x[i];
}
ax2 = ax*ax; a = (N*axy - ax*ay)/(N*axx-ax2);
b = ay/N - a*ax/N;
for(i=0;i<N;i++)
{
y[i] = a*x[i] + b;
}
p = y;
return p;
}
double* fLS(int x[],double y[])
{
int axy=0, ax=0, ay=0, ax2=0, axx=0;
double a=0, b=0, *p;