最小二乘法与作图法比较:如何精确求出直线斜率a和截据b
通过作图法可以确定直线的斜率a和截距b,并可以确定该直线对应的经验公式。但用作图法拟合直线时,绘图连接随意性较大,尤其是测量时。当数据比较分散时,不同的人对同一套测量数据进行处理,得到的结果就会不同。因此,它是一种粗糙的数据处理方法,计算出的a和b误差较大。当使用最小二乘法拟合直线来处理数据时,只要处理过程中不出现错误,任何人处理同一组数据都会得到唯一的斜率a和截距b。

最小二乘法是利用一组符合关系Y=a+bX的测量数据来计算最优的a和b。显然,关键是如何找到最好的a和b。
(1)求回归直线
设直线方程的表达式为:
y=a+bx;
(2)然后就是后面大部分的BB书了。我们所要做的就是将数学公式转换成代码,仅此而已。说实话,我看不懂书里那些杀人的东西。毕竟数值老师也有点像沙比一样,记住前面几章就直接讲天文地理知识了。怎样才能把算术九章的题目拿出来,让我们产生购买的兴趣呢?我有句话是妈妈卖批次时一定要讲的。你怎么能让我们读到这么晦涩难懂的东西?就像勺子一样,后来我基本上就不去上课了。 .不过书上看不懂也没关系。通过将其转换为代码即可轻松实现:在下面输入您自己的代码;
/********************************************
> File Name: spantwo.c
> Author:chendiyang
> School:WUST_CST_1501班
> Myblog:www.chendsir.com
> Mail:1441353519@qq.com
> Created Time: 2017年04月22日 星期六 22时29分41秒
************************************************************************/
#include
#define MAX 30 //最多输入30个点进行线性拟和
typedef struct POINT//点的结构
{
double x;
double y;
}Point;
int main()
{
int m;//输入点的个数
int i;
Point points[MAX];//用来存储点
static double u11,u12,u21,u22,c1,c2;//用来构建法方程组的变量
double a,b,tmp;
printf("\n请输入点数:");
scanf("%d",&m);
if(m>MAX)
{
return 1;
}
if(m<=0)
{
return 1;
}
printf("\n请输入x点y点的坐标:\n");
for(i=0;iscanf("%lf%lf",&points[i].x,&points[i].y);
}
//列出方程U(a,b)
for(i=0;i//即解法方程组
{
u21+=points[i].x;
u22+=points[i].x*points[i].x;
c1+=points[i].y;
c2+=points[i].x*points[i].y;
}
u12=u21;
u11=m;
//进行求解
a=(c1*u22-c2*u12)/(u11*u22-u12*u21);
b=(c1*u21-c2*u11)/(u21*u12-u22*u11);
//输出最小二乘解
printf("\n最小二乘解的线性方程为 :S(x)=%f+%fx\n",a,b);
return 0;
}
运行结果如图:
输入21个点进行线性拟合,输出最小二乘解。上面是在网上找到的一个示例问题,结果是正确的。然而,为了尝试书上的问题,却是不正确的。因此,在数值书第106页的例1中,输入7个点,求最小二乘解。结果如下图:
结果表明:S(x)=0.842857+4.571429x。 Facebook 107 上的答案是:P(x)=0.843+4.57x。显然,答案是正确的,我的准确率更高。本期主题完毕!说实话,这几天我一直在忙这个,不知道有什么意义。 。