【问题标题】:array out of index error - jacobi method implementation数组超出索引错误 - jacobi 方法实现
【发布时间】:2013-06-03 22:50:11
【问题描述】:
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 新手。 谢谢 阿迪

【问题讨论】:

  • 错误是什么,请您也发布错误吗?
  • 如果您花了 3 个小时试图找出问题所在,请再花几分钟发布堆栈跟踪...
  • 我强烈建议您清理一些代码 - 缩进不一致,有些地方(例如您设置 p[i][j][k] 的位置)如果不分开,实际上应该分成至少单独的行方法,还有很多magic numbers。也没有cmets。如果我们无法理解您的代码,我们将很难提供帮助。
  • 如果您正在使用像 eclis 这样的工具,请尝试调试。此外,stacktrace 会告诉您在哪一行引发错误,因此通过将调试指针放在 tat 周围进行调试可能会有所帮助。

标签: java arrays indexing


【解决方案1】:

您的数组索引超出范围异常,因为在您的循环中:

 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 时,您会得到异常)。我不熟悉 Jacobi 算法,但如果您打算在 k 达到 50 时退出循环,那么只需在 if 语句中添加 break; 命令。所以你有两个解决方案,首先:将 if 语句更改为:

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

其次,检查错误后再次检查k不大于100:

if(error<(10^(-8)))
    loop=false;
else if(k < 100)
    loop=true;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2013-09-03
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    相关资源
    最近更新 更多