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.
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
L'important ce n'est pas d'être grand mais c'est être à la hauteur
‒ 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.)
@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 ) 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é,...)
L'important ce n'est pas d'être grand mais c'est être à la hauteur
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 ?)
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 mais toujours ma fonction me donne pas les bonnes valeurs.
L'important ce n'est pas d'être grand mais c'est être à la hauteur
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.
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
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.
et b est un vecteur et n la taille, donc je comprends pas comment j'ai pu mettre les arguments dans le mauvais ordre.