public class test2 {
public static void main(String[] args) {
int n=6;
double H[][] = new double[n+1][n+1]; //希尔伯特矩阵H
/* double H[][] = {{0,0,0,0}, //课本例2.21
{0,3,-1,-1},
{0,-1,3,-1},
{0,-1,-1,3}};
*/
double b[]=new double[n+1]; //矩阵b
double y[]=new double[n+1]; //中间解
double x[]=new double[n+1]; //最终解
double r[]=new double[n+1]; //残差
double wucha[]=new double[n+1]; //误差
double wcjdz[]=new double[n+1]; //误差的绝对值
double fanshu; //误差的范数
//生成希尔伯特矩阵H
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
H[i][j]=1.0/(i+j-1);
b[i]=b[i]+H[i][j]; //生成矩阵b
}
}
//输出希尔伯特矩阵H
System.out.println();
System.out.println("生成的希尔伯特矩阵为:");
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
System.out.print(H[i][j]+"\t");
System.out.println();
}
//输出矩阵b
System.out.println();
System.out.println("生成的b矩阵为:");
for(int i=1;i<=n;i++)
System.out.println(b[i]);
//楚列斯基分解
for(int k=1;k<=n;k++)
{
H[k][k]=Math.sqrt(H[k][k]);
for(int i=k+1;i<=n;i++)
H[i][k]=H[i][k]/H[k][k];
for(int j=k+1;j<=n;j++)
{
for(int i=k+1;i<=n;i++)
H[i][j]=H[i][j]-H[i][k]*H[j][k];
}
}
//输出楚列斯基分解后的矩阵
System.out.println();
System.out.println("楚列斯基分解后的矩阵为:");
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
System.out.print(H[i][j]+"\t");
System.out.println();
}
//求解中间解y
for(int i=1;i<=n;i++)
y[i]=b[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
y[i]=y[i]-y[j]*H[i][j];
}
y[i]=y[i]/H[i][i];
}
System.out.println();
System.out.println("y值为:");
for(int i=1;i<=n;i++)
System.out.print(y[i]+"\t");
System.out.println();
//求解最终解x
for(int i=1;i<=n;i++)
x[i]=y[i];
for(int i=n;i>=1;i--)
{
for(int j=n;j>i;j--)
{
x[i]=x[i]-x[j]*H[j][i];
}
x[i]=x[i]/H[i][i];
}
System.out.println();
System.out.println("x值为:");
for(int i=1;i<=n;i++)
System.out.print(x[i]+"\t");
System.out.println();
//计算残差
for(int i=1;i<=n;i++)
r[i]=b[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
r[i]=r[i]-x[j]*H[i][j];
}
}
System.out.println();
System.out.println("残差为:");
for(int i=1;i<=n;i++)
System.out.print(r[i]+"\t");
System.out.println();
//计算误差
for(int i=1;i<=n;i++)
wucha[i]=x[i]-1;
System.out.println();
System.out.println("误差分别为:");
for(int i=1;i<=n;i++)
System.out.print(wucha[i]+"\t");
System.out.println();
//计算误差的无穷范数
for(int i=1;i<=n;i++) //取绝对值
{
wcjdz[i]=wucha[i];
if(wcjdz[i]<0)
wcjdz[i]=-wcjdz[i];
}
fanshu=wcjdz[1];
for(int j=2;j<=n;j++) //选出最大的
{
if(fanshu<wcjdz[j])
fanshu=wcjdz[j];
}
System.out.println();
System.out.print("误差的无穷范数为: "+fanshu);
System.out.println();
}
}
- 1
- 2
前往页