数值分析中的高斯—塞德尔迭代算法

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/qq_31699845/article/details/51525225

本例是用java语言实现的,适合于学习数值分析课程的同学借鉴;

package c;

import java.util.Scanner;

public class Demo {

    public static void main(String []args)
    {
        boolean flag = true;
         int N,n,t = 0;    //N迭代次数,n指是x的下标
         double e = 0;
         double [][] X = new double[30][30];
         double b[] = new double[30];
         double a[][] = new double[30][30];

         Scanner in = new Scanner(System.in);

         System.out.print("请输入初始值x的个数:");
         n = in.nextInt();
         System.out.print("请输入迭代次数:");
         N = in.nextInt();
         System.out.print("请输入精度值(0.00....1)");
         e = in.nextDouble();

         for(int i = 1;i<=n;i++)
         {
             System.out.print("b["+i+"]=");
             b[i] = in.nextDouble();
         }

         System.out.println("请输入x的初始值");
         for(int i = 1;i<=n;i++)
         {
             System.out.print("X["+i+"][0]=");
             X[i][0] = in.nextDouble();
         }


         System.out.println("请输入对应的a值");
         for(int i = 1;i<=n;i++)
             for(int j = 1;j<=n;j++)
             {
                System.out.print("a["+i+"]["+j+"] = ");
                a[i][j] = in.nextDouble();
             }


         while(t<N)
         {
             for(int i = 1;i<=n;i++)
             {
                 double f1 = 0;
                 for(int j = 1;j<=n;j++)
                 {
                     if(j!=i) f1 += a[i][j]*X[j][t];
                 }
                 X[i][t+1] = (b[i]-f1)/a[i][i];

                 double f2 = 0;
                 double f3 = 0;
                 for(int m = 1;m<=i-1;m++)
                 {
                     f2 += a[i][m]*X[m][t+1];
                 }

                 for(int m = i+1;m<=n;m++)
                 {
                     f3 += a[i][m]*X[m][t];
                 }
                 X[i][t+1] = (b[i]-f2-f3)/a[i][i];
                 System.out.printf("X["+i+"]["+(t+1)+"] = %.5f",X[i][t+1]);
                 System.out.print(" ");
             }  
             System.out.println();

             for(int i = 1;i<=n;i++)
             {
                 if(Math.abs(X[i][t+1]-X[i][t])<e)
                 {
                     for(int j = 1;j<=n;j++)
                     System.out.printf("X["+j+"]["+(t+1)+"] = %.5f",X[j][t+1]);
                     flag = false;
                     break;
                 } 
             }
             if(flag == true)
                  t++;
             else
                 break;
         }   //end of while
         if(t==N)
             System.out.println("迭代次数不够或失败,未达到指定精度!");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_31699845/article/details/51525225