Page 1 sur 2
Méthode de jacobi
Publié : 20 déc. 2009 00:23
par amrani
je me propose de programmer la méthode de Jacobi en C dans le cas d'une matrice A de taille 3
#include<stdio.h>
#include<math.h>
#include<conio.h>
main()
{
int i,j,A[3][3],B[3];
float eps;
printf("entrer epsilon=");
scanf("%f",eps);
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{printf("entrer l'élément A[%d][%d]=",i,j );
scanf("%d",&A[j]);
printf("\n");
}
for(i=0;i<3;i++)
printf("entrer l'élément B[%d]=",i );
scanf("%d",B );
printf("\n");
float x1=0,x2=0,x3=0;
int k=1;
do
{
x1=B[0]\A[0][0]-(1/A[0][0])x2-(1/A[0][0])x3;
x2=B[1]\A[1][1]-(1/A[1][1])x1-(1/A[1][1])x3;
x3=B[2]\A[2][2]-(1/A[2][2])x1-(1/A[2][2])x2;
k=k+1;
}
\\while(norme(X_(k)-X_(k-1))/norme(X_(K))>eps)
printf("nombre d'itération est %d:",k);
printf("x1=%f \n x2=%f \n x3=%f",x1,x2,x3);
getch();
}
la principale difficulté que je cherche est de programmer(traduire en langage C) la condition d'arret à savoir arreter quand
(norme(X_(k)-X_(k-1))/norme(X_(K))>eps)
avec X_(k)=(x1,x2,x3) à l'tération k
et norme = norme infini
Re: Méthode de jacobi
Publié : 20 déc. 2009 23:46
par nafpy
En s'inspirant d'une instruction conditionelle du genre max(a,b)=(a > b) ? a : b ;qui devrait aussi marcher pour les flottants, on pourait definir la fonction Nsup(X)= max( max(X[0],X[1])), X[3]) .... Syntaxe à verifer bien sur.
Si le corps de l'algo est correct, le test d'arret devrait logiquement fonctionner.
Re: Méthode de jacobi
Publié : 23 déc. 2009 15:22
par amrani
merci, c'est une bonne idée , cependant je ne sais pas pourquoi mon programme ne se compile pas
voici le programme modifié:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
float maximum(float a, float b, float c);
main()
{
float a ;
float b;
float c;
float d;
d = maximum(a,b,c);
int i,j,A[3][3],B[3];
float eps;
printf("entrer epsilon=");
scanf("%f",eps);
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{printf("entrer l'élément A[%d][%d]=",i,j );
scanf("%d",&A[j]);
printf("\n");
}
for(i=0;i<3;i++)
printf("entrer l'élément B[%d]=",i );
scanf("%d",B );
printf("\n");
float x1=0,x2=0,x3=0;
float first,second,third;
int k=1;
do
{ x1=first; x2=second; x3=third;
x1=B[0]/(A[0][0])-(A[0][1])/(A[0][0])x2-(A[0][2]/(A[0][0])x3;
x2=B[1]/A[1][1]-(A[1][0]/A[1][1])x1-(A[1][2]/A[1][1])x3;
x3=B[2]/A[2][2]-(A[2][0]/A[2][2])x1-(A[2][1]/A[2][2])x2;
k=k+1;
}
while((maximum(x1-first,x2-second,x3-third)/maximum(x1,x2,x3))>eps)
printf("nombre d'itération est %d:",k);
printf("x1=%f \n x2=%f \n x3=%f",x1,x2,x3);
getch();
}
float maximum(float a, float b, float c)
{
if(a < b)
if (b < c) return(c);
else return(b);
else if (a > c) return(a);
}
Re: Méthode de jacobi
Publié : 23 déc. 2009 15:47
par fakbill
Ce n'est pas vraiment une bonne idée que ce coder ça en C.
Enfin...c'est un exercice de C et pas d'autre chose.
ll faut bien comprendre qu'il existe des lib toutes faites et super optimisées pour faire ce genre d'opération.
Coder ça soit même n'a que peut d'intéret (et ce n'est jamais une bonne idée dans la vraie vie (sauf si ton but est de battre une lib optimisées depuis 20ans)).
Re: Méthode de jacobi
Publié : 23 déc. 2009 20:28
par amrani
dans 20 ans peut etre que le C n'existera plus
concernant le programme , en le compilant, le curseur arrive ici
x1=B[0]/(A[0][0])-((A[0][1])/(A[0][0]))x2-((A[0][2]/(A[0][0]))x3;
j'obtiens :
expected `;' before "x2"
qu'elle est l'erreur à votre avis
Re: Méthode de jacobi
Publié : 23 déc. 2009 22:31
par nafpy
x1=B[0]/(A[0][0])-((A[0][1])/(A[0][0]))x2-((A[0][2]/(A[0][0]))x3;
Déjà cette expression n'a aucun sens en C. A mon avis il faudrait mieux ecrire
x1=B[0]/(A[0][0])-((A[0][1])/(A[0][0]))*x2-((A[0][2]/(A[0][0]))*x3;
Puis pour le test d'arret, il est preferable d'ecrire:
while( maximum(x1-first, x2-second, x3-third) > eps*maximum(x1,x2,x3) ) ;
ça sera plus "précis".
Re: Méthode de jacobi
Publié : 24 déc. 2009 01:59
par amrani
merci, j'avais oublié le * , qu'elle erreur de débutants!!, maintenant le programme se compile
Re: Méthode de jacobi
Publié : 25 déc. 2009 03:17
par amrani
vous avez une petite idée pour faire la transposée d'une matrice non carée?
Re: Méthode de jacobi
Publié : 26 déc. 2009 14:00
par fakbill
Oui:
1) ne pas le faire en C mais en maple on en numpy/scipy par ex.
2) si on tient vraiment à le faire en C, il ya plusieurs solutions:
On peut par exemple représenter la matrice par une structure contenant la matrice elle même mais aussi un booléen qui donne le sens de lecture de la matrice.
Je le reredis, c'est une horreur de coder ça ne C car les perfs seront mauvaises.
Si on veut coder un algo pour voir si on l'a compris, il vaut bien mieux prendre le langage le plus simple possible pour exprimer tout ça. Si on code en C, c'est qu'on cherche des prefs. Si on cherche des perfs, on va mettre des astuces dans son code; astuces qui dépendent au moins du langage (quand ce n'est pas de l'architecture sur laquelle on est...). On rentre alors dans le monde merveilleux de l'implémentation de algo d'analyse num...c'est un sport en soit

Re: Méthode de jacobi
Publié : 26 déc. 2009 22:27
par nafpy
fakbill a raison, bien qu'on puisse tout faire avec le C, ce n'est pas un langage spécialement adapté à l'analyse numérique. De plus, la structure de données "Matrice" n'existe pas dans le C standard. Ou alors il faudra utiser des bibliothèques spécialisées.
Faire une fonction "Transpose", pour une matrice il suffit d'une double boucle.
for (i =0; i < n; i++) // Pour chaque ligne
for (j =0; j < m ; j++) // Pour chaque colonne
B[j] = A[j] ; // Transposition
Mais déjà des questions se posent. Si on est dans une fonction qui recoit en arguments la matrice A et le Resultat B, comment cette fonction recupere t'elle le nombre de lignes et de colonnes. Dans ce cas la definition des matrices doit se faire par des structures de données particulierement crées à cet effet.
Par exemple (et ce n'est peut être pas la regle), le programmeur definira la matrice par la structure suivante
struct
{
float T[n][m];
int Nb_Lignes;
nt Nb_Colonnes;
} MyMatrice;
Et le programmeur n'a plus qu'à faire appel à cette fonction ainsi crée en lui passant les argment de type "MyMatrice", crées pour le besoin.