public class test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i,j,k,p,
temp; //记录最大元素的位置
double change; //用于交换两行
int n=4;
double A[][]={{21.0, 67.0, 88.0, 73.0},
{76.0, 63.0, 7.0, 20.0},
{0.0, 85.0, 56.0, 54.0},
{19.3, 43.0, 30.2, 29.4}};
double AA[][]={{21.0, 67.0, 88.0, 73.0},
{76.0, 63.0, 7.0, 20.0},
{0.0, 85.0, 56.0, 54.0},
{19.3, 43.0, 30.2, 29.4}}; //备份A[]
double b[]={141.0,109.0,218.0,93.7};
double bb[]={141.0,109.0,218.0,93.7}; //备份b[]
double l[][]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; //记录倍数
double mb[]={1,1,1,1}; //记录b的变换位置
double X[]={1,1,1,1}; //记录方程的解A*x=b的解x
double r[]={1,1,1,1}; //记录残差r=b-A*x
double ax[]={0,0,0,0}; //记录 A*x
double z[]={0,0,0,0}; //记录 A*z=r的解z
double xz[]={0,0,0,0}; //记录解x+z
/*int n=3;
float A[][]={{1,2,2},{4,4,2},{4,6,4}};
float b[]={3,6,10};
float l[][]={{0,0,0},{0,0,0},{0,0,0}};
float mb[]={1,1,1}; */
//*******部分选主元*************************
for (k=0;k<n;k++) //第k列
{
//找出每列的最大值p 将位置赋给temp
temp=k;
for(p=k;p<n;p++)
if( A[p][k] > A[temp][k])
temp=p;
//换主元,交换两行 对A[]
for(i=0;i<n;i++)
{
change=A[k][i];
A[k][i]=A[temp][i];
A[temp][i]=change;
}
/*for(i=0;i<n;i++)
{
change=l[k][i];
l[k][i]=l[temp][i];
l[temp][i]=change;
} */
//换主元,交换 对b[]
change=b[k];
b[k]=b[temp];
b[temp]=change;
if(A[k][k]==0)
break;
// 高斯LU分解****************************
//计算当前列的倍数
for(i=k+1;i<n;i++) //行号i
{
l[i][k]=A[i][k]/A[k][k];
mb[i]=l[i][k];
}
//对剩余的子矩阵进行变换
for(i=k+1;i<n;i++) //行号i
{
for(j=k+1;j<n;j++) //列号j
A[i][j]=A[i][j]-l[i][k]*A[k][j]; //等价变换A
b[i]=b[i]-mb[i]*b[k]; //等价变换b
}
//输出交换后的矩阵A b
/*System.out.println("***********第"+(k+1)+"次变换*******************************");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
System.out.print(A[i][j]+"\t");
}
System.out.println("");
}
System.out.println("");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
System.out.print(l[i][j]+"\t");
}
System.out.println("");
}
System.out.println("");
for(j=0;j<n;j++)
{
System.out.print(b[j]+"\t");
}
System.out.println("");
}
System.out.println("");
System.out.println("*************************************************");*/
}
//将变换后的b[]赋给X[]
for(i=0;i<n;i++)
X[i]=b[i];
//求解
for(i=n-1;i>=1;i--)
{
X[i]=X[i]/A[i][i];
for(j=i-1;j>=0;j--)
X[j]=X[j]-X[i]*A[j][i];
}
X[0]=X[0]/A[0][0];
//输出解
System.out.println("方程A*x=b的解x:");
for(j=0;j<n;j++)
{
System.out.println(X[j]);
}
//计算残差
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
ax[i]=ax[i]+AA[i][j]*X[j];
}
r[i]=bb[i]-ax[i];
}
System.out.println();
//输出残差
System.out.println("残差r=b-A*x为:");
for(j=0;j<n;j++)
{
System.out.print(r[j]+"\t");
}
System.out.println("");
System.out.println();
//将解X[]赋给xz[]
for(i=0;i<n;i++)
xz[i]=X[i];
//循环,控制改进次数 此处为3次
for(k=1;k<=3;k++)
{
System.out.println("第"+k+"次改进;*******************************************");
System.out.println("");
for(i=0;i<n;i++)
z[i]=r[i];
//求解A*z=r
for(i=n-1;i>=1;i--)
{
z[i]=z[i]/A[i][i];
for(j=i-1;j>=0;j--)
z[j]=z[j]-z[i]*A[j][i];
}
z[0]=z[0]/A[0][0];
//输出方程A*z=r的解z
System.out.println("方程A*z=r的解z:");
for(j=0;j<n;j++)
{
System.out.println(z[j]);
}
//输出方程解x+z
System.out.println("方程解x+z:");
for(j=0;j<n;j++)
{
xz[j]=xz[j]+z[j];
System.out.println(xz[j]);
}
System.out.println();
System.out.println();
}
}
}
评论2
最新资源