高斯-塞得尔
import java.util.Scanner;
public class Gauss_Seidel1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double error = 0;// 可允许的误差的范围
int count;//计算迭代的次数
int n;//方程组的元组数
System.out.println("请输入方程的元组数n");
n = scan.nextInt();
double a[][] = new double[n + 1][n + 1];
double b[] = new double[n + 1];
double x1[] = new double[n + 1];
double x2[] = new double[n + 1];
System.out.println("请输入矩阵a");//初始化矩阵a
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
a[i][j] = scan.nextDouble();
}
System.out.println("请输入矩阵b");//初始化矩阵b
for (int i = 1; i <= n; i++)
b[i] = scan.nextDouble();
for (int i = 1; i <= n; i++)//初始解
x1[i] = 0;
boolean undone = true;//误差在允许的范围时true,否则为false
boolean x11 = false;//x11为true时得到的新解放到数组x1中
boolean x22 = true;//x22为true时得到的新解放到数组x2中
count = 0;//计算求解的次数
while (undone) {
//Gauss_Seidel方法求解
for (int i = 1; i <= n; i++) {
double temp = 0;//
for (int j = 1; j <= n; j++) {
if (j < i) {//将新计算出的x[j]代入
if (x22)
temp += a[i][j] * x2[j];
else
temp += a[i][j] * x1[j];
}
if (j > i) {//将旧的x[j]代入
if (x22)
temp += a[i][j] * x1[j];
else
temp += a[i][j] * x2[j];
}
}
if (x22)
x2[i] = (b[i] - temp) / a[i][i];//计算x[i]
else
x1[i] = (b[i] - temp) / a[i][i];
}
if (x22) {//改变新下一次迭代求得x值的存储位置
x11 = true;
x22 = false;