2013-06-07 9 views
-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(); 

     } 
} 

j'ai passé 3 heures et je suis incapable de comprendre l'erreur! s'il vous plaît s'il vous plaît aidez-moi ici! l'erreur apparaît mais je ne sais pas pourquoi il does.i suis nouveau à Java. grâce AADIsur erreur d'index - implémentation de la méthode Jacobi

+2

Quelle est l'erreur , poseriez-vous l'erreur aussi, s'il vous plaît? –

+2

Si vous avez passé 3 heures à essayer de comprendre le problème, passez encore quelques minutes à poster la pile ... – Thihara

+0

Je vous recommande fortement de nettoyer votre code - l'indentation est incohérente, il y a des endroits (comme où vous avez placé ' p [i] [j] [k] ') qui devrait vraiment être divisé en au moins des lignes séparées sinon des méthodes séparées, et il y a beaucoup de [nombres magiques] (http://en.wikipedia.org/wiki/ Magic_number_ (programmation) #Unnamed_numerical_constants). Il n'y a pas de commentaires non plus. Cela rend la tâche difficile si nous avons de la difficulté à comprendre votre code. – thegrinner

Répondre

0

Vous obtenez l'index de tableau hors limites exception, car dans votre boucle:

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;} 
} 

vous ne vérifiez pas que k ne devient jamais plus grand que 99 (qui, fait, fait et quand il arrive à 100 vous obtenez l'exception). Je ne suis pas familier avec l'algorithme de Jacobi, mais si vous avez l'intention de quitter la boucle lorsque k atteint la valeur de 50, ajoutez simplement une commande break; dans votre instruction if. de sorte que vous avez deux solutions, d'abord: le changement que si déclaration à:

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

En second lieu, vérifier à nouveau pour k ne pas être plus grand que 100 après avoir vérifié l'erreur:

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