用最小二乘法拟合直线的问题 回答清楚追加分!

 我来答
清宁时光17
2022-11-15 · TA获得超过1.4万个赞
知道大有可为答主
回答量:6451
采纳率:100%
帮助的人:34万
展开全部
分类: 电脑/网络 >> 操作系统/系统故障
问题描述:

我用最小二乘法拟合直线 y=ax+b ,但是在计算a的时候,我用偏差为最小,然后求偏导,得出来的公式进行计算。可是运算结果没法得到垂直于x轴的直线。(当所有的点都在y轴的时候可以得到a的分母为0,可以判断)但是如果点分布在y轴两侧就不行了。会得到a = 0的结果。但是这个结果肯定定不对。 怎么办啊?谢谢大家了!

解析:

原理中有一类题目,对测量数据进行处理,然后使用最小二乘法对数据进行处理并且拟合一条曲线,以方便对数据结果进行进一步的处理。这个程序拟合的是直线,用于处理近似线性的数据。下面是源程序,至少可以运行,会不会有问题就不知道了噻。程序是用C语言写的,但是注释的风格是C++的,在某些编译器下,如TC可能会有问题,把 换成 /* */就可以了。

#include <stdio.h>

#include <conio.h>

#define N 20 定义最多能够处理的数据组数

变量X,Y 线性方程系数k 线性方程矩阵m0 m1 m2

double x[N],y[N],k[2][3],m1,m2,m0;

int i=0,j=0;

求(A1*B1~Ac*Bc)的和

double fsum(double a[],double b[],int c)

{

double sum=0;

for(i=0;i < c;i++)

sum+=a[i]*b[i];

return sum;

}

求矩阵

double fmatrix(int m,int n)

{

double matrix;

matrix=k[0][m]*k[1][n]-k[0][n]*k[1][m];

return matrix;

}

void main()

{

int limit=0; 数据组数

double mi[N]; 大小为1的数列,矩阵求和时匹配使用

char ch;

声明

printf("This program will calculate Y=aX+b, with maximum of data group of %d",N);

for(i=0;i < N;i++)

mi[i]=1;

输入数据

begin:

printf("\n\nPlease input the number of data group:");

scanf("%d",&limit);

if(limit>N)

{

printf("Out of range! Should no more than %d",N);

goto begin;

}

按X1~Xi Y1~Yi的顺序输入

printf("Please input the data one by one:");

input:

printf("\n");

for(i=0;i < limit ;i++)

{

printf("X[%d]:",i+1);

scanf("%lf",&x[i]);

}

for(i=0;i < limit ;i++)

{

printf("Y[%d]:",i+1);

scanf("%lf",&y[i]);

}

显示输入数据以供检查

printf("Please check the data:\n");

for(i=0;i < limit ;i++)

printf("X%2d: %-11f ",i+1,x[i]);

printf("\n");

for(i=0;i < limit ;i++)

printf("Y%2d: %-11f ",i+1,y[i]);

printf("\nAre the data ok?(Y/N)\n");

ch=getch();

if(ch=='n')

goto input;

求线性方程系数

k[0][0]=fsum(x,x,limit);

k[0][1]=fsum(x,mi,limit);

k[0][2]=-fsum(x,y,limit);

k[1][0]=fsum(x,mi,limit);

k[1][1]=limit;

k[1][2]=-fsum(mi,y,limit);

输出线性方程系数

printf("\nThe modulus is:\n");

for(i=0; i < 2;i++)

{

for(j=0;j < 3 ;j++)

printf("%15lf",k[i][j]);

printf("\n");

}

m0=fmatrix(0,1);

m1=fmatrix(1,2);

m2=fmatrix(2,0);

printf("\n%lf %lf %lf\n",m0,m1,m2);

if(m0==0)

printf("An error has occured! Matrix0 is zero!");分母上的线性方程矩阵为零

else

printf("The function should be:\nY= %lf X %+lf\n",m1/m0,m2/m0);

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
富港检测技术(东莞)有限公司_
2024-04-02 广告
正弦振动多用于找出产品设计或包装设计的脆弱点。看在哪一个具体频率点响应最大(共振点);正弦振动在任一瞬间只包含一种频率的振动,而随机振动在任一瞬间包含频谱范围内的各种频率的振动。由于随机振动包含频谱内所有的频率,所以样品上的共振点会同时激发... 点击进入详情页
本回答由富港检测技术(东莞)有限公司_提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式