Langage C
Bonsoir
j’essaye de programmer cet algorithme en c et je le fais mais quand je grandis la taille de matrice par exemple n=5 me donne des résultats faux il me donne des événement=0 et ça est opposé avec l'algorithme
[le premier algorithme de pdf (algorithme 7)]
j’essaye de programmer cet algorithme en c et je le fais mais quand je grandis la taille de matrice par exemple n=5 me donne des résultats faux il me donne des événement=0 et ça est opposé avec l'algorithme
[le premier algorithme de pdf (algorithme 7)]
#include<stdio.h> #include<stdlib.h> float Min(float t[], int n); float Min(float t[], int n) { int i; float min=t[0]; for(i=1;i<n;i++){ if(min > t[ i]) min=t[ i]; } return min; } main(){ float M[5][5], M_tr[5][5],P_ek[10],T_Cmat[5],phi[10][10]; float s_P_ek; int n,v[5]; int i,j,k; int ic; printf("donner la taille de M : "); scanf("%d",&n); for(i=0;i<n;i++){ printf("\n"); for(j=0;j<n;j++) { printf("M[%d][%d] : ",i+1,j+1); scanf("%f",&M[ i][j]); } } system("cls"); printf("\nLa matrice d'entree :"); printf("\n|____ M[%d][%d] =\t\t|\t",n,n); ic=0; for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf("%.1f\t",M[ i][j]); } printf("|\n"); ic++; if(ic<n) printf("\t\t\t|\t"); } printf("\n\nDonc en_effet :"); for(i=0;i<n;i++) for(j=0;j<n;j++){ M_tr[ i][j] = 0; } for(i=0;i<n;i++){ v[ i] = n-1; } s_P_ek = 0.0; k = -1; do{ for(i=0;i<n;i++){ j=v[ i]; while(M[ i][j]==0.0){ j-=1; } printf("%d",j); v[ i]=j; T_Cmat[ i] = M[ i][v[ i]]; } system("pause"); k++; P_ek[k] = Min(T_Cmat,n); printf("\n\t\t\t|\t",n,n); ic=0; for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf("%.1f\t",M[ i][j]); } printf("|\n"); ic++; if(ic<n) printf("\t\t\t|\t"); } printf("\n"); printf(" \n\t\t\t\t\t\tPe[%d] = %.1f\n",k+1,P_ek[k]); for(i=0;i<n;i++){ M[ i][v[ i]] = M[ i][v[ i]] - P_ek[k]; } for(i=0;i<n;i++){ M_tr[ i][v[ i]] += P_ek[k]; } s_P_ek += P_ek[k]; }while(s_P_ek != 1.0); printf("\nLa matrice de transition :"); printf("\n|__M_tr[%d][%d] =\t\t|\t",n,n); ic=0; for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf("%.1f\t",M_tr[ i][j]); } printf("|\n"); ic++; if(ic<n) printf("\t\t\t|\t"); } printf("\n\n"); printf("\n\n"); for(i=0;i<n;i++) for(k=0;k<s_P_ek != 1.0;k++){ P_ek[k]==v[ i]; printf("la position de Pe[%d] = %.1f\n est %d",k+1,P_ek[k],v[ i]); } system("pause"); }par exemple quand j’entre la matrice d'ordre 5 de l'exemple de pdf me donne des résultats faux il existe des événements=0
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
-- Schnoebelen, Philippe
positives .puis on prend leur min c'est le premier événement pe1 et on passe de la 2eme événement pe2 on fait la même démarche mais avec la matrice A-pe1 on fait la soustraction de pe1 seulement sur le vecteur qu'on a généré événement 1
positives
le test d’arrêt : on sarrette de généré des événements quand on obtient la somme de tous les événements =1
Je pensais plutôt au terme de la matrice qui pose problème. Tu as une boucle while() qui teste si un terme de la matrice est == 0.0 et clairement il y a un problème à ce moment-là (comme je l'avais expliqué précédemment). Il serait bon d'afficher la valeur du dernier terme non nul avec la précision maximale. Il me semble qu'il s'agit d'une erreur d'arrondi.
-- Schnoebelen, Philippe
Si tu lis l'anglais, je te conseille de regarder attentivement ces deux liens, ils contiennent des réponses à ta question :
https://bitbashing.io/comparing-floats.html
https://floating-point-gui.de/errors/comparison/
C'est expliqué dans les deux liens que j'ai posté plus haut, les as-tu regardés ? Plusieurs solutions sont proposées, il y a même du code qu'il suffit de copier-coller pour faire une telle comparaison.
[Mettre une ' ' entre [ et i sinon, l'afficheur du forum le prend pour une bannière BBcode de mise en italique. AD]
(j'ai pas bien compris l'article de comparaison je suis totalement une débutante en c)
s'il vous plaît aide moi je suis vraiment besoin de ce programme plus tôt possible