Partage
  • Partager sur Facebook
  • Partager sur Twitter

Algorithme de cholesky

Sujet résolu
    22 octobre 2017 à 18:56:12

    Bonjour,

    j'ai un projet sur la résolution d'un système linéaire avec la méthode de Cholesky.

    j'ai fait ceci mais ça ne marche pas. Une aide serait la bienvenue.

    Merci par avance.

    Voir code:

    void Cholesky(float** A, int n,float* b){
    	float **r;float s;
    	//r = malloc(n * sizeof(float));
    	r = malloc2(n,n);
    	for(int i = 0; i < n; i++){
    		for(int j = 0; j < i-1;j++){
    			s = A[i][i] - pow(r[j][i],2);
    			printf("val de s: %f",s);
    		}
    			if(s <= 0){
    				printf("La matrice n'est pas definie positive\n");
    				exit(EXIT_SUCCESS);
    			}else{
    				r[i][i] = sqrt(s);
    			}
    			for(int j = i+1;j < n; j++){
    				for(int k = 0; k <= i-1; k++){
    					r[i][j] = (A[i][j] - r[k][i]*r[k][j])/r[i][i];
    				} 
    			}
    		
    	}
    }



    • Partager sur Facebook
    • Partager sur Twitter
    L'important ce n'est pas d'être grand mais c'est être à la hauteur
    Anonyme
      22 octobre 2017 à 19:57:05

      "Ca marche pas" ne veut rien dire.

      Un message d'erreur, un exemple ?

      • Partager sur Facebook
      • Partager sur Twitter
        22 octobre 2017 à 19:58:10

        Salut,

        Qu'est-ce qui ne marche pas ? On peut voir malloc2() ? Qu'est censé faire ton code ? N'hésites pas à donner plus précisions pour ceux qui ne connaissent pas ton exo et qui n'ont jamais entendu parler de cholesky.

        • Partager sur Facebook
        • Partager sur Twitter
          22 octobre 2017 à 21:52:12

          Merci pour les remarques

          la méthode de Cholesky est une méthode de résolution de système linéaires type Ax = b elle fait une décomposition de la matrice de base en deux sous matrice R et Rt où R est triangulaire inférieure et Rt sa transposée

          en fait la méthode fait rien même pas un message voici une capture

          voici la méthode malloc2

           7 float * * malloc2 ( int rows , int cols )
            8 {
            9     float * * ptr = ( float * * ) malloc ( sizeof ( float * ) * rows + sizeo    f ( float ) * cols * rows ) ;
           10     float *   dat = ( float *   ) ( ptr + rows ) ;
           11     int i ;
           12     if ( ptr == NULL ) exit( EXIT_FAILURE ) ;
           13     for ( i = 0 ; i < rows ; ++ i , dat += cols ) ptr [ i ] = dat ;
           14     return ptr ;
           15 }
          



          -
          Edité par Taserface 23 octobre 2017 à 0:57:01

          • Partager sur Facebook
          • Partager sur Twitter
          L'important ce n'est pas d'être grand mais c'est être à la hauteur
            23 octobre 2017 à 12:34:59

            Quelques remarques :
            ‒ Tu ne devrais pas utiliser la fonction 'pow' pour calculer un carré, c'est une fonction puissance générale basée sur un calcul d'exponentielle. Pour calculer le carré de x, on fait x*x, ça prend juste une multiplication, là où la fonction 'pow' va enchaîner plein de calculs. Mais bon, ça n'a rien à voir avec le souci.
            ‒ IMPORTANT : on ne peut rien dire pour l'instant, il faut que tu postes la ligne qui appelle la fonction. (Par exemple si cette fonction ne fait rien pas même un affichage, c'est peut-être que l'argument n vaut zéro, mais on ne peut pas le vérifier pour l'instant.)

            -
            Edité par robun 23 octobre 2017 à 12:38:17

            • Partager sur Facebook
            • Partager sur Twitter
              24 octobre 2017 à 21:35:58

              @robun merci pour le conseil sur la fonction pow on me l'avait déjà dit mais la flemme de changer en plus l'optimisation viendra après l'important c'est que le programme marche pour l'instant

              j'me suis encore penché sur l'algo et je suis arrivé à ceci elle m'affiche bien une matrice supérieure droite mais toutes les valeurs ne sont pas bonnes.

              void Cholesky(float** A,float* b,int n){
                  (void) b;//we specify to the compilator we don't need b
                  float **r;float s;
                  r = malloc2(n,n);
                 
                  for(int i = 0; i < n; i++){
                      
                      float sommeR = 0;
                    
                      for(int j = 0; j < i-1;j++){
                        
                          sommeR += pow(r[j][i],2);
                        
                      }
                      s = A[i][i] - sommeR;
                      //if s <= 0 the matrice is not positive definite
                      if(s <= 0){
                        
                          printf("the matrice is not positive definite\n");
                        
                          exit(EXIT_SUCCESS);
                        
                      }else{ 
                        
                          r[i][i] = sqrt(s);
                        
                      } 
                      
                     for(int j = i+1; j < n; j++){
                       
                       float multiplicationRki = 1,sommeRki = 0;
                       
                        for(int k = 0; k < i-1; k++){
                        
                         multiplicationRki = r[k][i] * r[k][j];
                        
                         sommeRki += multiplicationRki; 
                         
                       } 
                       
                       r[i][j] = (A[i][j] - sommeRki ) / r[i][i];
                     }
                 }
                /* if we want wa can print matrice element for see the transformation
                //ITS START HERE
                 for(int i = 0; i < n; i++){
                   for(int j = 0; j < n; j++){
                     printf("%f\t",r[i][j]); 
                   }
                   printf("\n");
                 }
                */ // HERE IS THE END OF PRINT
              }

              pour la ligne d'appel de la méthode elle est simple et n n'est pas < 0 puisque c'est l'utilisateur(pour l'instant moi :euh:) qui la renseigne

              Cholesky(A,b,n);

              A étant la matrice(3*3) je précise b le vecteur et n la taille (qui est égal à 3)

              NB: je travaille déjà sur des matrices pré-programmées de dimension 3 (Lotkin, Hilbert carré,...)


              • Partager sur Facebook
              • Partager sur Twitter
              L'important ce n'est pas d'être grand mais c'est être à la hauteur
                24 octobre 2017 à 22:05:39

                Ah, je le savais qu'il suffisait de regarder l'appel de la fonction : tu as mis les arguments dans le mauvais ordre !

                (Oui mais le compilateur l'aurait signalé. En fait tu as juste mal recopié l'appel de la fonction et ça n'a rien à voir ?)

                -
                Edité par robun 24 octobre 2017 à 22:07:12

                • Partager sur Facebook
                • Partager sur Twitter
                  25 octobre 2017 à 0:22:17

                  les options dans le mauvais ordre
                  void Cholesky(float** A,float* b,int n)
                  et
                  Cholesky(A,b,n);
                  b est un vecteur et n la taille, donc je comprends pas comment j'ai pu mettre les arguments dans le mauvais ordre.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  L'important ce n'est pas d'être grand mais c'est être à la hauteur
                    25 octobre 2017 à 11:30:47

                    Et quand tu les remets dans le bon ordre ça marche, ou pas ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 octobre 2017 à 21:13:20

                      ils sont dans le bon ordre. je sais pas sur quoi tu te bases pour dire que les arguments sont dans le mauvais ordre
                      • Partager sur Facebook
                      • Partager sur Twitter
                      L'important ce n'est pas d'être grand mais c'est être à la hauteur
                        25 octobre 2017 à 21:51:21

                        Je crois qu'on ne se comprend pas.

                        Hier, tu as écrit que l'appel était :

                        Cholesky(A,b,n);

                        alors que la définition de cette fonction commence par :

                        void Cholesky(float** A, int n,float* b){

                        (je ne fais que copier ton programme). Donc je me suis dit : voilà ! c'est pour ça que ça marche pas : il n'a pas écrit les arguments dans bon ordre ! Et puis, comme l'erreur est trop simple pour être vraie, je me suis dit ensuite : ou alors, quand il a écrit l'appel, il l'a mal recopié, mais dans le code source il est bien dans le bon ordre.

                        Et tu réponds (je te cite) :

                        « les options dans le mauvais ordre

                        void Cholesky(float** A,float* b,int n)

                        »

                        Apparemment, tu as donc rectifié ? C'est bien ça ? Et donc maintenant ça marche ? Voilà quelle était ma question, car à vrai dire ta réponse n'est pas claire (relis-toi, on dirait que tu admets que les options sont dans le mauvais ordre, et là tu dis que c'est dans le bon ordre, donc tu as rectifié ou pas ? et est-ce que c'était bien ça l'erreur ?)



                        -
                        Edité par robun 25 octobre 2017 à 21:52:22

                        • Partager sur Facebook
                        • Partager sur Twitter
                          26 octobre 2017 à 9:50:25

                          Ah ouais j'avoue avec toutes les modifications qu'il y a eu sur le code j'me souviens même plus. Néamoins quelque soit l'ordre j'appelais la fonction dans le bon ordre sinon le compilo m'aurait agresser :diable: mais toujours ma fonction me donne pas les bonnes valeurs.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          L'important ce n'est pas d'être grand mais c'est être à la hauteur
                            26 octobre 2017 à 13:53:36

                            OK. Donc le problème n'est toujours pas résolu ? 

                            Dans ce cas, il va falloir regarder plus en profondeur. Puisque tu as modifié le code, on devrait peut-être tout reprendre à zéro ? Une bonne exposition du problème serait :

                            1) Tu donnes un exemple de système linéaire simple dont tu indiques la solution (tu l'as calculée à la main).

                            2) Tu indiques ce que fait le programme (pour qu'on sache ce qui ne marche pas) et à quel moment précis il déconne (il suffit de comparer ses résultats intermédiaires avec ce que tu as calculé à la main).

                            3) Et tu re-postes le programme, ou en tout cas les parties concernées par les erreurs (la fonction, les appels à la fonction, éventuellement la définition des variables).

                            D'ailleurs normalement, si tu fais tout ça, tu trouvera les erreurs. ;)

                            -
                            Edité par robun 26 octobre 2017 à 13:57:54

                            • Partager sur Facebook
                            • Partager sur Twitter
                              2 novembre 2017 à 1:15:34

                              Enfin l'heure a sonné voici l'ensemble du code que j'ai fait les méthodes marchent.

                              Merci pour vos réponses

                              Lien vers mon github(Gauss+Jacobi): https://gist.github.com/Cirediallo/368db7a39f09c64ed108d4c39637a298

                              -
                              Edité par Taserface 2 novembre 2017 à 22:40:09

                              • Partager sur Facebook
                              • Partager sur Twitter
                              L'important ce n'est pas d'être grand mais c'est être à la hauteur

                              Algorithme de cholesky

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown