import java.util.Scanner;
public class A {
public double a[][],b[],x1[],x2[],w;
public double epsilon=1e-13;
int n,maxR=100000;
public A(){
Scanner reader=new Scanner(System.in);
System.out.println("input n:");
n=reader.nextInt();
a=new double[n][];
for(int i=0;i<n;i++)
a[i]=new double[n];
b=new double[n];
x1=new double[n];
x2=new double[n];
System.out.println("input a[][]");
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=reader.nextDouble();
System.out.println("input b[]");
for(int i=0;i<n;i++)
b[i]=reader.nextDouble();
}
public double getLength(){
if(x1.length!=x2.length){
System.out.println("error");
return 0;
}
else{
double temp=0;
for(int i=0;i<x2.length;i++)
if(Math.abs(x1[i]-x2[i])>temp)
temp=Math.abs(x1[i]-x2[i]);
return temp;
}
}
public int gs(double w){
int i;
for(i=0;i<n;i++){
x1[i]=0;
x2[i]=1;
}
for(i=0;i<maxR;i++){
if(getLength()>epsilon){
for(int j=0;j<n;j++)
x1[j]=x2[j];
for (int j = 0; j < n; j++) {
double temp = 0;
for (int k = 0; k < n; k++) {
if(k!=j)
temp += a[j][k] * x2[k];
}
x2[j]=(1-w)*x2[j]-w/a[j][j]*(temp-b[j]);
}
}
else{
break;
}
}
return i+1;
}
public static void main(String args[]){
A a=new A();
System.out.println("Gauss-seidel的迭代步数为:"+a.gs(1));
System.out.println("G-S的根为:");
for(int i=0;i<a.n;i++)
System.out.println(a.x2[i]);
System.out.println();
System.out.println("SOR迭代 epsilon="+a.epsilon);
int minR=a.maxR,n;
float temp=0;
for(int i=1;i<100;i++){
n=a.gs(i/50f);
System.out.println("迭代因子为:"+i/50f+"迭代步数为:"+ n);
if(n<minR)
minR=n;
}
System.out.println("最佳松弛因子为:"+minR/50f);
}
}
评论0