用最小二乘法拟合直线的问题 回答清楚追加分!
我用最小二乘法拟合直线y=ax+b,但是在计算a的时候,我用偏差为最小,然后求偏导,得出来的公式进行计算。可是运算结果没法得到垂直于x轴的直线。(当所有的点都在y轴的时候...
我用最小二乘法拟合直线 y=ax+b ,但是在计算a的时候,我用偏差为最小,然后求偏导,得出来的公式进行计算。可是运算结果没法得到垂直于x轴的直线。(当所有的点都在y轴的时候可以得到a的分母为0,可以判断)但是如果点分布在y轴两侧就不行了。会得到a = 0的结果。但是这个结果肯定定不对。 怎么办啊?谢谢大家了!
请看清我的问题好吗?我是说用最小二乘法拟合直线时垂直于x轴的直线怎么处理?请不要随便帖无关的代码。请提供判断方法。谢谢! 展开
请看清我的问题好吗?我是说用最小二乘法拟合直线时垂直于x轴的直线怎么处理?请不要随便帖无关的代码。请提供判断方法。谢谢! 展开
1个回答
展开全部
原理中有一类题目,对测量数据进行处理,然后使用最小二乘法对数据进行处理并且拟合一条曲线,以方便对数据结果进行进一步的处理。这个程序拟合的是直线,用于处理近似线性的数据。下面是源程序,至少可以运行,会不会有问题就不知道了噻。程序是用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);
}
#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);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询