1、最小二乘法程序
#include 2、id mutiple(float a[][N],float b[][T+1],float c[][T+1])
{
float res=0;
int i,j,k;
for(i=0;i 3、)
{
b[j][i]=a[i][j];
}
}
}
void init(float x_y[][2],int n)
{
int i;
printf("请输入%d个已知点:\n",N);
for(i=0;i 4、1;j++)
{
matrix_A[i][j]=W*pow_n(x_y[i][0],j);
}
}
}
void print_array(float array[][T+1],int n)
{
int i,j;
for(i=0;i 5、i++)
{
for(j=i;j 6、k++)
{
argu[j][k]-=argu[i-1][k]*rate;
if(fabs(argu[j][k])<=PRECISION)
argu[j][k]=0;
}
}
}
}
void compute(float argu[][T+2],int n,float root[])
{
int i,j;
float temp;
for(i=n-1;i>=0;i--)
{
temp=argu[i][n];
for(j=n-1;j>i;j--)
{
temp-=argu[i][j]*root[j];
}
root[i]=temp/argu[i][i];
7、}
}
void get_y(float trans_A[][N],float x_y[][2],float y[],int n)
{
int i,j;
float temp;
for(i=0;i 8、)
{
for(j=0;j 9、
for(i=1;i 10、rix_A,N);
matrix_trans(matrix_A,trans_A);
mutiple(trans_A,matrix_A,coef_A);
printf("法矩阵为:\n");
print_array(coef_A,T+1);
get_y(trans_A,x_y,y,T+1);
cons_formula(coef_A,y,coef_formu);
convert(coef_formu,T+1);
compute(coef_formu,T+1,a);
print_root(a,T+1);
}
void main()
{
process();
}
]]>
11、
12、c2004
13、 2 4 8
法矩阵为:
5 0 10 0
0 10 0 34
10 0 34 0
0 34 0 130
5个点的3次拟合的多项式系数为:
a[1]=0.408571, a[2]=0.391667, a[3]=0.0857143, a[4]=0.00833333,
拟合曲线方程为:
y(x)=0.408571 + 0.391667*X + 0.0857143*X*X + 0.00833333*X*X*X
]]> 14、
15、xc2004
16、 printf("请输入x的值");
scanf ("%lf",&x);
printf("请输入y的值");
scanf ("%lf",&y);
l+=x;
m+=y;
n+=x*y;
p+=x*x;
i++;
}
a=(num*n-l*m)/(num*p-l*l);
b=(p*m-n*l)/(num*p-l*l);
printf("最小二乘法所算得的斜率和截距分别为%f和%f\n",a,b);
17、 }
else printf("mun"输入有误!);
}
#include 18、ct Matrix *mt,int m,int n)
{
int i;
//指定矩阵的行和列
mt->m=m;
mt->n=n;
//为矩阵分配内存
mt->pm=new double *[m];
for(i=0;i 19、)
for(j=0;j 20、le s;
//检查行列号是否匹配
if(mt1->n!=mt2->m||mt1->m!=mt3->m||mt2->n!=mt3->n) return 0;
for(i=0;i 21、ixTran(Matrix *mt1,Matrix *mt2)
{
int i,j;
//检查行列号是否匹配
if(mt1->m!=mt2->n||mt1->n!=mt2->m) return 0;
for(i=0;i 22、"\n");
for(j=0;j 23、new double[n];
h=new int[n];
for(i=0;i 24、号
if(numl>i-1)
{
t=h[i];
h[i]=h[numl];
h[numl]=t;
}
for(j=i;j 25、n;j++) x[i]=x[i]-a[h[i]][j]*x[j];
x[i]=x[i]/a[h[i]][i];
}
//清除临时数组内存
delete []l;
delete []h;
return 1;
}
///////////////////////////////////////////////////////////////////////////////////////////
//最小二乘法求解矩阵Ax=b
int MinMul(Matrix A,Matrix b,double *x)
{
int i,j;
if(b. 26、n!=1) return 0;
if(A.m!=b.m) return 0;
Matrix TranA;//定义A的转置
InitMatrix0(&TranA,A.n,A.m);
MatrixTran(&A,&TranA);
Matrix TranA_A;//定义A的转置与A的乘积矩阵
InitMatrix0(&TranA_A,A.n,A.n);
MatrixMul(&TranA,&A,&TranA_A);//A的转置与A的乘积
Matrix TranA_b;//定义A的转置与b的乘积矩阵
InitMatrix0(&TranA_b,A.n,1); 27、
MatrixMul(&TranA,&b,&TranA_b);//A的转置与b的乘积
DestroyMatrix(&TranA);//释放A的转置的内存
Matrix TranA_A_b;//定义增广矩阵
InitMatrix0(&TranA_A_b,TranA_A.m,TranA_A.m+1);
//增广矩阵赋值
for(i=0;i 28、A_b.m]=TranA_b.pm[i][0];
}
DestroyMatrix(&TranA_A);
DestroyMatrix(&TranA_b);
//Guass列主消元法求解
Guassl(TranA_A_b.pm,x,TranA_A_b.m);
DestroyMatrix(&TranA_A_b);
return 1;
}
int MinMul(double **A,double *b,int m,int n,double *x)
{
int r,i;
Matrix Al,bl;
Al.pm=new double *[m];
Al.m=m;
Al.n=n;
InitMatrix(&bl,m,1);
for(i=0;i
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818