Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - METODO DI JACOBI
Forum - C/C++ - METODO DI JACOBI

Avatar
Puffetta (Normal User)
Rookie


Messaggi: 21
Iscritto: 29/11/2009

Segnala al moderatore
Postato alle 11:43
Giovedì, 31/12/2009
Ciao a tutti! ho scritto questo codice del metodo di Jacobi per risolvere i sistemi lineari con metodo iterativo, però non riesco ad avere le soluzioni corrette. Mi potreste aiutare a capire dov'è l'errore? il criterio di fermata è corretto?
questo è il codice:
Codice sorgente - presumibilmente C

  1. /*METODO DI JACOBI*/
  2.  
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #include<math.h>
  6.  
  7. const int size=50;
  8. typedef double matrice[size][size];
  9. typedef double vettore[size];
  10.  
  11.  
  12. void leggimatrice(matrice,int);
  13. void leggivettore(vettore,int);
  14. void jacobi(matrice,vettore,vettore,vettore,int);
  15. double diagonaledominante(matrice,int);
  16. double normamax(vettore, vettore, int);
  17. void stampa(vettore,int);
  18.  
  19. main()
  20. {
  21.       matrice A; vettore b, vettk, vettkp1; double delta;
  22.      
  23.       int n, k=0; double toll, lambda, rho;
  24.      
  25.       printf("\n dammi la dimensione della matrice  n=");scanf("%d",&n);
  26.      
  27.       leggimatrice(A,n);
  28.      
  29.       lambda=diagonaledominante(A,n);//lamda=max-i(somm a[i][j])/a[i][i]
  30.      
  31.       if(lambda>=1)
  32.                    {
  33.                       printf("\n la matrice non e'a diagonale dominante!non puoi usare jacobi\n\n");
  34.                       exit(1);
  35.                    }
  36.      
  37.       leggivettore(b,n);
  38.      
  39.       printf("\n\n Inserire il limite di precisione delle soluzioni.        tolleranza=");
  40.       scanf("%lf", &toll);
  41.      
  42.       for(int i=1; i<=n; i++)         vettk[i]=0;
  43.      
  44.       for(int i=1; i<=n; i++)    vettkp1[i]=0;
  45.      
  46.       delta=normamax(vettkp1, vettk, n);
  47.      
  48.       rho=(log(toll*((1-lambda)/delta))/log(lambda));
  49.      
  50.       do(k++);
  51.       while(k<=rho);        
  52.      
  53.       while(delta>=toll)
  54.              {
  55.                         for(int j=1; j<n; j++)
  56.                                 {
  57.                                         for(int i=1;i<=n;i++)   vettk[i]=vettkp1[i];
  58.                    
  59.                                         jacobi(A,b,vettk,vettkp1,n);
  60.                                        
  61.                                         delta=fabs(vettkp1[j]-vettk[j]);
  62.                                  }
  63.              }
  64.      
  65.      stampa(vettkp1,n);
  66.      
  67.      system("PAUSE");
  68.      return 0;
  69. }
  70.  
  71.  
  72. void leggimatrice(matrice A,int n)
  73. {
  74.      printf("\n La matrice A e' costituita dai seguenti elementi:");
  75.      
  76.      for(int i=1;i<=n;i++)
  77.              for(int j=1;j<=n;j++)
  78.                      {
  79.                          printf("\n Inserire l'elemento A[%d][%d]=",i,j);
  80.                          scanf("%lf",&A[i][j]);
  81.                      }
  82.      return;
  83. }
  84.  
  85.  
  86. void leggivettore(vettore b,int n)
  87. {
  88.      for(int i=1;i<=n;i++)
  89.              {
  90.                   printf("\n Inserire il termine noto b[%d]=",i);
  91.                   scanf("%lf",&b[i]);
  92.              }
  93.      return;
  94. }
  95.  
  96.  
  97. void jacobi(matrice A, vettore b,vettore x,vettore y,int n)
  98. {
  99.      for(int i=1;i<=n;i++)
  100.              {
  101.                   y[i]=b[i];
  102.                  
  103.                   for(int j=1;j<=n;j++)
  104.                           if(j!=i)          y[i]=y[i]-A[i][j]*x[j];
  105.                  
  106.                   y[i]=y[i]/A[i][i];
  107.              }
  108.      return;
  109. }
  110.  
  111.  
  112.  
  113. double diagonaledominante(matrice A,int n)
  114. {
  115.        double sum, lambda=0;
  116.        
  117.        for(int i=1;i<=n;i++)
  118.                {
  119.                    sum=0;
  120.                    
  121.                    for(int j=1;j<=n;j++)
  122.                            if(i!=j)         sum=sum+(fabs(A[i][j]));
  123.                            
  124.                    sum=sum/fabs(A[i][i]);
  125.                    
  126.                    if(lambda<sum)           lambda=sum;
  127.                }
  128.   return lambda;
  129. }
  130.  
  131.  
  132. double normamax(vettore vettkp1, vettore vettk, int n)
  133. {
  134.        
  135.        double max=(fabs(vettkp1[1]-vettk[1]));
  136.        
  137.        for(int i=2;i<=n;i++)
  138.                if(max<(fabs(vettkp1[i]-vettk[i])))     max=(fabs(vettkp1[i]-vettk[i]));
  139.                
  140.        return max;
  141. }
  142.  
  143.        
  144. void stampa(vettore y,int n)
  145. {
  146.      printf("\n Le soluzioni del sistema sono:");
  147.      
  148.      for(int i=1;i<=n;i++)   printf("\t%lf",y[i]);
  149.      
  150.      return;
  151. }




grazie mille:)

PM Quote