みその計算物理学
ホーム はじめに リンク集
ガウスの消去法の数値計算例(Java)
  • プログラムについて

    ここでは、ガウスの消去法の部分ピボットを用いるやり方で解く。一応任意のn個の未知数と方程式から成る連立方程式が解けるが、最小限の事しか行わないプログラムなので、全ての問題が解けるわけではない。問題によっては、誤差が大きくなったり、三角行列にできなかったりして、解けない。

  • プログラムソース
    import java.io.*;
    
    class Co
    {
            static final int N=4;   //未知数の個数
    }
    
    class Gauss
    {
            static double a[][]={{1.0,1.0,-3.0,-4.0,-1.0},{2.0,1.0,5.0,1.0,5.0},
                                                            {3.0,6.0,-2.0,1.0,8.0},{2.0,2.0,2.0,-3.0,2.0}}; //解きたい連立方程式より
            static double x[]=new double[Co.N];
            static double b[][]=new double[1][Co.N+1];
    
            public static void main()
            {
                    int i,j,k,l,pivot;
                    double p,q,m;
    
                    for(i=0;i<Co.N;i++) 
                    {
                            m=0;
                            pivot=i;
    
                            for(l=i;l<Co.N;l++) 
                            {
                                    if(Math.abs(a[l][i])>m) //i列の中で一番値が大きい行を選ぶ 
                                    {   
                                            m=Math.abs(a[l][i]);
                                            pivot=l;
                                    }
                            }
    
                            if(pivot!=i)    //pivotがiと違えば、行の入れ替え 
                            {                          
                                    for(j=0;j<Co.N+1;j++) 
                                    {
                                            b[0][j]=a[i][j];        
                                            a[i][j]=a[pivot][j];
                                            a[pivot][j]=b[0][j];
                                    }
                            }
                    }
    
                    for(k=0;k<Co.N;k++) 
                    {
                            p=a[k][k];              //対角要素を保存
                            a[k][k]=1;              //対角要素は1になることがわかっているから
    
                            for(j=k+1;j<Co.N+1;j++) 
                            {
                                    a[k][j]/=p;
                            }
    
                            for(i=k+1;i<Co.N;i++) 
                            {
                                    q=a[i][k];
    
                                    for(j=k+1;j<Co.N+1;j++) 
                                    {
                                            a[i][j]-=q*a[k][j];
                                    }
                                    a[i][k]=0;              //0となることがわかっているところ
                            }
                    }
    
    /*解の計算*/
                    for(i=Co.N-1;i>=0;i--) 
                    {
                            x[i]=a[i][Co.N];
                            for(j=Co.N-1;j>i;j--) 
                            {
                                    x[i]-=a[i][j]*x[j];
                            }
                    }
    
    /*行列が最後どうなったかみる*/
    
            for(i=0;i<Co.N;i++) {
                    for(j=0;j<Co.N+1;j++) {
                            System.out.print(a[i][j] + " ");
                    }
                    System.out.println("");
                    
            }
    
                    System.out.println("解は");
                    for(i=0;i<Co.N;i++) 
                    {
                            System.out.println(x[i]);
                    }
    
            }
    }
    
  • プログラム実行結果
    1.0 2.0 -0.66666666666666663 0.33333333333333331 2.6666666666666665
    0.0 1.0 -1.6666666666666665 1.8333333333333333 1.6666666666666665
    0.0 0.0 1.0 4.3750000000000009 3.5000000000000009
    0.0 0.0 0.0 1.0 0.8
    解は
    2.0000000000000004
    0.19999999999999973
    0.0
    0.8
    Press any key to continue