-4
public class testrun {


    public static  double ellipticalequn(float x, float y){
         double exp;
         exp=(-2)*Math.exp(Math.pow((y-(.35*6.5)),2)-Math.pow((x-(.75*8)),2)/(2*.05*6.5));
         return exp;
     }
     public static void jacobi(){
         int ny=80;
        int nx=80;
         double[][][] p=new double[100][100][100];
         for(int i=0;i<100;i++){p[i][i][0]=0;} //initialise
         for(int i=0;i<nx;i++){
             p[0][i][0]=10;                 //Boundary conditions
             p[79][i][0]=10;
             p[i][79][0]=50;
             p[i][0][0]=50;

        }
         boolean loop=true;
         int k=0;
         while(loop){
             double error=0;
             for(int i=1;i<nx-1;i++){
                 for(int j=1;j<ny-1;j++){
                     p[i][j][k]=0.25*((p[i-1][j][k]+p[i+1][j][k]+p[i][j+1][k]+p[i][j-1][k])-ellipticalequn((float)i,(float)j));
                     error+=Math.pow(p[i][j][k],2);
                 }
             }
             error=Math.sqrt(error);
             k++;
             if(k>50){
                 loop=false;}

             if(error<(10^(-8))){loop=false;}
             else { loop=true;}
         }
     }

     public static void main(String[] args){
            jacobi();

        }
}

私は3時間を費やしましたが、エラーを理解できません! ここで私を助けてください!エラーが表示されますが、なぜそうなるのかわかりません。私はJavaが初めてです。ありがとう

4

1 に答える 1

0

ループ内で次の理由により、配列インデックスが範囲外の例外を取得します。

 boolean loop=true;
 int k=0;
 while(loop){
     double error=0;
     for(int i=1;i<nx-1;i++){
         for(int j=1;j<ny-1;j++){
             p[i][j][k]=0.25*((p[i-1][j][k]+p[i+1][j][k]+p[i][j+1][k]+p[i][j-1][k])-ellipticalequn((float)i,(float)j));
             error+=Math.pow(p[i][j][k],2);
         }
     }
     error=Math.sqrt(error);
     k++;
     if(k>50){
         loop=false;}

     if(error<(10^(-8))){loop=false;}
     else { loop=true;}
 }

k が 99 より大きくならないことをチェックしていません (実際にはそうであり、100 に達すると例外が発生します)。私はヤコビ アルゴリズムに詳しくありませんが、k が値 50 に達したときにループを終了するbreak;場合は、if ステートメントにコマンドを追加するだけです。まず、if ステートメントを次のように変更します。

if(k>50){
   loop=false;
   break;
}

次に、エラーを確認した後、k が 100 を超えていないことを再度確認します。

if(error<(10^(-8)))
    loop=false;
else if(k < 100)
    loop=true;
于 2013-06-07T15:23:07.957 に答える