33,008
社区成员
发帖
与我相关
我的任务
分享
#define ABS(x) (x)>0?(x):-(x)
#define SWAP(a,b) {temp=(a);(a)=(b);(b)=temp;}
//求解线性方程组 A*x=B (n为矩阵维数)
void LinearSolve(double **A,double *B,double *x,int n)
{
int i,j,k,ik;
double mik,temp;
double **a,*b;
a=new double*[n];
for(i=0;i<n;i++) a[i]=new double[n];
b=new double[n];
for(i=0;i<n;i++)
{
b[i]=B[i];
for(j=0;j<n;j++) a[i][j]=A[i][j];
}
for(k=0;k<n;k++)
{
mik=-1;
for(i=k;i<n;i++)
if(ABS(a[i][k])>mik)
{
mik=ABS(a[i][k]);
ik=i;
}
for(j=k;j<n;j++)
SWAP(a[ik][j],a[k][j]);
SWAP(b[k],b[ik]);
b[k]/=a[k][k];
for(i=n-1;i>=k;i--)
a[k][i]/=a[k][k];
for(i=k+1;i<n;i++)
{
b[i]-=a[i][k]*b[k];
for(j=n-1;j>=k;j--)
a[i][j]-=a[i][k]*a[k][j];
}
}
for(i=n-1;i>=0;i--)
{
x[i]=b[i];
for(j=i+1;j<n;j++)
x[i]-=a[i][j]*x[j];
}
//删除内存
delete b;
for(i=0;i<n;i++) delete a[i];
}
//一般线性方程组拟合。n为参数个数,p为点数。
void linear(double **x,double *y,double *beta,int n,int p)
{
double **a,*b;
int i,j,k;
//a:分配内存
a=new double*[p];
for(i=0;i<p;i++)
a[i]=new double[p];
//a:p*p矩阵
for(i=0;i<p;i++)
for(j=0;j<p;j++)
{
a[i][j]=0;
for(k=0;k<n;k++)
a[i][j]+=x[k][i]*x[k][j]; //计算内积
}
//b:1*p矩阵
b=new double[p];
for(i=0;i<p;i++)
{
b[i]=0;
for(j=0;j<n;j++)
b[i]+=x[j][i]*y[j];
}
LinearSolve(a,b,beta,p); //求解beta
//a:删除内存
for(i=0;i<p;i++) delete a[i];
delete b;
}
//多项式拟合:输入点坐标(x,y),输出多项式参数beta
//n为点数,p为多项式系数个数
void polyfit(double *x,double *y,double *beta,int n,int p)
{
int i,j;
double **xx=new double*[n];
for(i=0;i<n;i++)
{
//多次拟合
xx[i]=new double[p];
for(j=0;j<p;j++)
{
if(0==j)
xx[i][j]=1;
else
xx[i][j]=pow(x[i],j); //连续函数
}
}
linear(xx,y,beta,n,p);
for(i=0;i<n;i++) delete xx[i];
delete xx;
}