雅克比方法迭代法解线性方程组

import java.util.Scanner; public class Jacobi { /** * @param args */ public static void main(String[] args) { Scanner scan = new Scanner(System.in); double error = 0.00001;//结果的误差许可范围 System.out.println("请输入线性方程的元数:"); int n = scan.nextInt(); double x1[] = new double[n+1];//数组去掉0值,与矩阵保持统一。x分量要双倍存储,存放新的和上一步的变量 double x2[] = new double[n+1]; double a[][] = new double[n+1][n+1];//系数矩阵 double b[] = new double[n+1];//AX=B中的矩阵B System.out.println("请输入系数矩阵"); for(int i = 1 ; i <= n; i++){ for(int j = 1 ; j <= n ; j++){ a[i][j] = scan.nextDouble(); } } System.out.println("请输入矩阵B:"); for(int i = 1 ; i <= n ; i++){ b[i] = scan.nextDouble(); } System.out.println("请输入解的初始估计值:"); for(int i = 1 ; i <= n ; i++){ x1[i] = scan.nextDouble(); } boolean done = true;//最后求解的值是否在误差许可范围内 boolean x1_new = false;//用于判断x1和x2哪个存放新的结果 boolean x2_new = true; int count = 1;//记录jacobi运算次数 while(done){ for(int i = 1 ; i <= n ; i++){ double m = 0;//暂存中间结果 for(int j = 1 ; j <= n ;j++){ if(j!=i){ if(x2_new)//新结果存于x2中 m += a[i][j]*x1[j]; else m += a[i][j]*x2[j]; } } if(x2_new) { x2[i] = (b[i]-m)/a[i][i]; } else{ x1[i] = (b[i]-m)/a[i][i]; } } if(x2_new) { x2_new = false; x1_new = true;//x1下次将存放新的结果 } else{ x1_new = false; x2_new = true; } for(int i = 1 ; i <= n;i++){ if(Math.abs(x1[i]-x2[i]) > error){//绝对值大于误差允许范围则继续迭代 done = true; break; } else done = false; } System.out.println(count+"次Jacobi运算后的结果为: "); for(int i = 1 ; i <= n ; i++){ if(x1_new) System.out.println("x"+i+" = "+x2[i]); else System.out.println("x"+i+" = "+x1[i]); } count++; } System.out.println("线性方程组的解为:"); for(int i = 1 ; i <= n ; i++){ if(x1_new) System.out.println("x"+i+" = "+x2[i]); else System.out.println("x"+i+" = "+x1[i]); } } }  

你可能感兴趣的:(雅克比方法迭代法解线性方程组)