public class test3 {
public static void main(String[] args) {
int n=9;
double w=1.072; //松弛参数
int c; //记录迭代次数
double accuracy = Math.pow(10,-10); //结果的精确度
double result=0.01107499035778936; //第一个解的收敛值 n=9时
// double result=0.125; //第一个解的收敛值 测试n=2时
double U[][]=new double[n+2][n+2];
double U1[][]=new double[n+2][n+2]; //用于雅可比方法
double U2[][]=new double[n+2][n+2]; //用于高斯--塞德尔方法
double U3[][]=new double[n+2][n+2]; //用于超松弛方法
double u[][]=new double[n+1][n+1]; //记录U[][]的临时值
//初始化 U 边界值是0或1
for(int i=0;i<n+2;i++)
for(int j=0;j<n+2;j++)
{
U[i][j]=0;
if(i==0) U[i][j]=0;
if(i==n+1) U[i][j]=0;
if(j==0) U[i][j]=0;
if(j==n+1) U[i][j]=1;
}
//初始化 U1 U2 U3
for(int i=0;i<n+2;i++)
for(int j=0;j<n+2;j++)
{
U1[i][j]=U[i][j];
U2[i][j]=U[i][j];
U3[i][j]=U[i][j];
}
//初始化 u 用于记录 U 的临时值
for(int i=1;i<n+1;i++)
for(int j=1;j<n+1;j++)
u[i][j]=0;
//*********************雅可比方法 *******************************************
System.out.println();
System.out.println("**********雅可比方法**********");
System.out.println();
c=0;
while(true)
{
c++; //迭代次数
for(int i=1;i<n+1;i++)
for(int j=1;j<n+1;j++)
u[i][j]=(U1[i-1][j]+U1[i+1][j]+U1[i][j-1]+U1[i][j+1])/4; //课本公式
for(int i=1;i<n+1;i++)
for(int j=1;j<n+1;j++) //迭代完一次后将新值赋给 U1
U1[i][j]=u[i][j];
if(Math.abs(U1[1][1]-result)<accuracy) break; //判断是否可以停止迭代
}
//输出雅可比方法最后结果
for(int i=1;i<n+1;i++)
{
for(int j=1;j<n+1;j++)
System.out.print(U1[i][j]+"\t");
System.out.println();
}
System.out.println();
System.out.println("迭代"+c+"次");
System.out.println();
System.out.println("与收敛值的差值是:"+(U1[1][1]-result));
System.out.println();
//**************高斯--塞德尔方法 ****************************************
System.out.println();
System.out.println("**********高斯--塞德尔方法**********");
System.out.println();
c=0;
while(true)
{
c++;
for(int i=1;i<n+1;i++)
for(int j=1;j<n+1;j++)
U2[i][j]=(U2[i-1][j]+U2[i+1][j]+U2[i][j-1]+U2[i][j+1])/4; //课本公式
if(Math.abs(U2[1][1]-result)<accuracy) break; //判断是否可以停止迭代
}
//输出高斯--塞德尔方法最后结果
for(int i=1;i<n+1;i++)
{
for(int j=1;j<n+1;j++)
System.out.print(U2[i][j]+"\t");
System.out.println();
}
System.out.println();
System.out.println("迭代"+c+"次");
System.out.println();
System.out.println("与收敛值的差值是:"+(U2[1][1]-result));
System.out.println();
//**************超松弛方法 *******************************************
System.out.println();
System.out.println("**********超松弛方法**********");
System.out.println();
c=0;
while(true)
{
c++;
for(int i=1;i<n+1;i++)
for(int j=1;j<n+1;j++)
{
u[i][j]=(U3[i-1][j]+U3[i+1][j]+U3[i][j-1]+U3[i][j+1])/4; //课本公式
U3[i][j]=(1-w)*U3[i][j]+w*u[i][j];
}
if(Math.abs(U3[1][1]-result)<accuracy) break; //判断是否可以停止迭代
}
//输出超松弛方法最后结果
for(int i=1;i<n+1;i++)
{
for(int j=1;j<n+1;j++)
System.out.print(U3[i][j]+"\t");
System.out.println();
}
System.out.println();
System.out.println("迭代"+c+"次");
System.out.println();
System.out.println("与收敛值的差值是:"+(U3[1][1]-result));
System.out.println();
}
}