Méthode de jacobi

amrani

Méthode de jacobi

Message par amrani » 20 déc. 2009 00:23

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

nafpy

Re: Méthode de jacobi

Message par nafpy » 20 déc. 2009 23:46

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.

amrani

Re: Méthode de jacobi

Message par amrani » 23 déc. 2009 15:22

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);

}

Dernière modification par amrani le 23 déc. 2009 20:29, modifié 1 fois.

Messages : 9686

Inscription : 30 juil. 2008 16:59

Profil de l'utilisateur : Élève de lycée

Re: Méthode de jacobi

Message par fakbill » 23 déc. 2009 15:47

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)).
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

amrani

Re: Méthode de jacobi

Message par amrani » 23 déc. 2009 20:28

dans 20 ans peut etre que le C n'existera plus :wink:

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

nafpy

Re: Méthode de jacobi

Message par nafpy » 23 déc. 2009 22:31

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".

amrani

Re: Méthode de jacobi

Message par amrani » 24 déc. 2009 01:59

merci, j'avais oublié le * , qu'elle erreur de débutants!!, maintenant le programme se compile
Dernière modification par amrani le 25 déc. 2009 03:19, modifié 1 fois.

amrani

Re: Méthode de jacobi

Message par amrani » 25 déc. 2009 03:17

vous avez une petite idée pour faire la transposée d'une matrice non carée?

Messages : 9686

Inscription : 30 juil. 2008 16:59

Profil de l'utilisateur : Élève de lycée

Re: Méthode de jacobi

Message par fakbill » 26 déc. 2009 14:00

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 ;)
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

nafpy

Re: Méthode de jacobi

Message par nafpy » 26 déc. 2009 22:27

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.

Répondre