用最小二乘法拟合直线的问题 回答清楚追加分!
1个回答
展开全部
分类: 电脑/网络 >> 操作系统/系统故障
问题描述:
我用最小二乘法拟合直线 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);
}
问题描述:
我用最小二乘法拟合直线 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-11-13 广告
2024-11-13 广告
交通噪声预测计算主要依据车辆类型、平均辐射声级、交通量、行驶速度、距离衰减量、公路纵坡和路面等因素。预测时,需先确定各参数,如车型分类、平均行驶速度、噪声源强等。通过公式计算,可得出预测点接收到的交通噪声值。预测过程还需考虑几何发散、大气吸...
点击进入详情页
本回答由绿知洲提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询