?? leastsquare.cpp
字號:
#include"LeastSquare.h"
#include"stdio.h"
LeastSquare::LeastSquare()
{ ifstream infile("input.dat");
if(!infile)
{
cout << "Sorry! The input file failed!" << endl;
exit(-1);
}
else{
infile>>m>>n>>N;//從文件讀入行列數和非零元個數
int i,j;
for(i=1; i<=m; i++) //將矩陣先初始化,全部置為零
{
for(j=1;j<=n;j++)
{A[i][j]=0.;
b[i]=0.;
}
}
}
for(int k=1; k<=N; k++)
{
infile>>i>>j;
infile>>A[i][j]; //讀入矩陣A的值
}
for(i=1; i<=m; i++)
infile>>b[i];//讀入右端項
infile.close();
}
LeastSquare::Function()
{
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)//先將B[i][j]和G[i][i]初始化置零
{ B[i][j]=0;
g[i]=0;
}
for(k=1; k<=m; k++)
{
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
B[i][j] += A[k][i] * A[k][j]; //計算正則矩陣B
}
}
for(i=1; i<=n; i++)
for(k=1; k<=m; k++)
{
g[i] += A[k][i] * b[k];//計算右端項g
}
//開始Cholesky分解
if(B[1][1]<=0){
cout << "Sorry! The data is wrong!" << endl;//首項不能小于等于零
exit(-1);
}
B[1][1]=sqrt(B[1][1]);
for(i=2;i<=n;i++)
B[i][1]=B[i][1]/B[1][1];//先求第一列系數
for(j=2;j<=n;j++)
{ double s=0;
for(k=1;k<j;k++)
{
s=B[j][k]*B[j][k];
B[j][j]=B[j][j]-s;//求對角元素
}
if(B[j][j]<=0)//對角元不能為小于等于零
{ cout << "Sorry! The data gets wrong!" << endl;
exit (-1);
}
B[j][j]=sqrt(B[j][j]);
for(i=j+1;i<=n;i++)
{ s=0;
for(k=1;k<j;k++)
{
s+=B[i][k]*B[j][k];
}
B[i][j]=B[i][j]-s;
B[i][j]=B[i][j]/B[j][j];//得到某一對角元下面的一列元素
}
}
//分解結束,一下為回代求解
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
B[i][j]=0;//將上三角元置零,得下三角陣L
g[1]=g[1]/B[1][1];//g[1]即為x1
double temp;
for( i=2;i<=n;i++)
{for( j=1;j<=i-1;j++)
{temp=0.0;
temp=temp+B[i][j]*g[j];
}
g[i]=(g[i]-temp)/B[i][i];
}
for(j=1;j<=n;j++)
for(i=j+1;i<=n;i++)
B[j][i]=B[i][j];//轉置L以求上三角方程組
for(j=1;j<=n;j++)
for(i=j+1;i<=n;i++)
B[i][j]=0;//將下三角的元素置零
g[n]=g[n]/B[n][n];
for(int i=n-1;i>=1;i--)
{for(int j=i+1;j<=n;j++)
{temp=0.0;
temp+=B[i][j]*g[j];
}
g[i]=(g[i]-temp)/B[i][i];
}
//回代結束,得到最小二乘解存于g[i]中
SavetoFile();
return 1;
}
int LeastSquare::SavetoFile()
{
ofstream outfile("results.dat");
if(!outfile)
{
cout << "Sorry.The output failed!" << endl;
return 0;
}
else{
for(int i=1; i<=n; i++)
outfile<<g[i]<<endl;
}outfile.close();
return 1;
}
int main()
{
LeastSquare cholesky;
cholesky.Function();
cholesky.SavetoFile();
getchar();
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -