Prog C(projet):résolution d'1 système d'équat

Pierrrrro Messages postés 7 Statut Membre -  
Pierrrrro Messages postés 7 Statut Membre -
Bonjour à tous,

j'ai "quelques" soucis pour programmer en C le sujet suivant: "résolution d'un système d'équations" la méthode de résolution proposée est la méthode du pivot de Gauss qui consiste (pour un système à 3 équations, donc 3 inconnus x,y,z) dans un premier temps à éliminer l'inconnu x des 2 dernières équations puis y pour trouver l'inconnu z que l'on remplacera alors dans la deuxième ligne pour trouver y que l'on remplacera également dans la première pour trouver x. (la méthode est détaillée et beaucoup mieux expliquée sur: http://www.bibmath.net/dico/index.php3?action=affiche&quoi=./g/gausspivot.html )

Pour le moment, j'ai 2 tableaux:
-un de 3*3 pour mon système d'équations
-un pour les second membres (ce à quoi est égal l'équation de la mm ligne)

et j'aimerai associer la ligne du second membre qui correspond à son équation donc a une ligne (équation) dans le premier tableau, pour pouvoir afficher le système avec les 3 équations et le second membre correspondant à chaque équation. (pour le moment:/)

Bref, si qqn m'a suivit jusque l'a, je vous en remercie, et vous pourrez donc constater que je galère pas mal...

Merci d'avance
A voir également:

5 réponses

damlegone32 Messages postés 75 Statut Membre 29
 
Salut,

Si ce que tu veux faire c'est juste afficher le système tu n'as pas besoin de "regrouper" les deux tableaux tu fais juste une boucle qui affiche ton système.
Par exemple si tab1 et ton tableau du système et tab2 ton tableau du second membre tu fais :

for(i=0;i<3;i++){
printf("%f.x + %f.y + %f.z = %f\n",tab1[i][0],tab1[i][1],tab1[i][2],tab2[i]);
}

Voila. a+
0
Pierrrrro Messages postés 7 Statut Membre
 
Merci, je n'y avai pas pensé.

Je vais essayer de me débrouiller pour le reste..

Merci encore
0
damlegone32 Messages postés 75 Statut Membre 29
 
Essaye ca :
Panneau de config -> Sons et perif audio.
Onglet Volume -> paramètre avancé
Options -> propriétés
Ajuster le voume pour -> enregistrement
et normalement tu dois avoir steréo mixer dans le cadre en dessous.
Si c'est le cas tu le coche puis OK. Ensuite tu peut le selectionner mais normalement c'est ce que audacity fais quand tu change la source d'enregistrement dans le logiciel.

Voilou.
a+

Edit : Désolé jme suis trompé de post
0
Pierrrrro Messages postés 7 Statut Membre
 
Voila, j'ai fait comme tu m'a proposé mais ya encore un 'hik', quand j'éxécute, à l'affichage du systeme j'obtient:

le systéme est:
0x+916455424y+0z=9175040000
0x+916455424y+0z=9175040000
0x+916455424y+0z=9175040000

/*résolution d'un système d'équation*/

#include<stdio.h>
#include<string.h>


void saisie(int*n,float systeme[3][3],float secondmembre[3])
{
int i;
int j;
int k;
int l;

printf("combien de valeurs voulez vous entrer\n");
scanf("%i",n);
for(i=0;i<=*n-1;i++)
{
for(j=0;j<=*n-1;j++)
{
printf("entrer le nombre de la ligne %i et de la colonne %i\n",i+1,j+1);
scanf("%i",&systeme[i][j]);
}
}
for(k=0;k<=*n-1;k++)
{
printf("entrer le second membre de la ligne %i\n",k+1);
scanf("%i",&secondmembre[k]);

}
{printf("le systeme est:\n");}
for(i=0;i<=*n-1;i++)
{
printf("%d x+ %d y+ %d z =%d \n",systeme[i][0],systeme[i][1],systeme[i][2],secondmembre[i]);

}
}

main ()
{
int n,i,j,k;
float systeme[3][3];
float secondmembre[3];

saisie(&n,systeme,secondmembre);

}
0
Pierrrrro Messages postés 7 Statut Membre
 
'Pas de soucis.
0
damlegone32 Messages postés 75 Statut Membre 29
 
C'est normal tu déclares des tableaux de float, c'est donc un %f qu'il faut quand tu saisis les coefficients.
Si tu veux des coefs entiers déclare des tableau de int .
Je te rappelle que le C est un langage fortement typé cad que le type que tu donnes à tes variables est trés important puisque leur occupation mémoire diffère suivant le type.

De plus je ne voie pas trés bien a quoi sert "printf("combien de valeurs voulez vous entrer\n"); scanf("%i",n);" puisque le reste du prog suppose que ce nombre est 3. Enfin ca c'est un détail.

a+. Bonne soirée
0
Pierrrrro Messages postés 7 Statut Membre
 
Merci, ca fonctionne quand mes tableaux sont de type int, quant au printf bizard, pour le moment il me sert à rien mais c'est par ce que je compte d'abord faire le programme avec 3 inconnus pour le faire à n inconnus plus tard.

Merci encore
0
Pierrrrro Messages postés 7 Statut Membre
 
Bonsoir,

c'est encore moi, toujours dans le même programme, je voudrais créer une fonction qui échange deux ligne de mon système quand la valeur affectée à x(le premier inconnu) est plus élevée sur une ligne autre que la première.
C'est à dire qu'avec cette fonction on aura ces valeurs dans l'ordre décroissant avec les lignes.
Mon principal soucis, c'est que pour faire un échange, il faut enregistrer les valeurs à échanger, et là il s'agit d'un tableau à 2 dimensions....
Et pour finir, je n'arrive pas à écrire en C la triangulation du système par la méthode de Gauss, c'est à dire que une fois que le système est classé, et que les inconnuesx et y sont éliminés de la dernière ligne (troisième pour système à 3 inconnus) et donc qu'il ne reste que l'inconnu z, comment faire pour retrancher à chaque lignes la valeur que l'on a trouvé pour z pour trouver la valeur de y et enfin celle de x???!

Un Grand Merci d'avance.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
damlegone32 Messages postés 75 Statut Membre 29
 
salut,

Pour inverser deux ligne il peut etre interressant de déclarer ton bleau en mémoire dynamique. Pour cela on crée un tableau qui contient les adresse pointant vers chaque tableau représentant les différentes lignes du système. Ce tableau contiendra des adresses de tableaux d'entier donc des int*.

int*systeme[nb_ligne_systeme];
Ensuite on rempli ce tableau par les adresse des tableau de coefs :

for(i=0;i<nb_ligne_systeme;i++){
systeme[i] = (int*)malloc(nb_colonne_systeme*sizeof(int));
}

avec nb_ligne_systeme = nb_colonne_systeme si le syst est carré

Pour remplir ce tableau :
systeme[indice_lig][indice_col] = un_nombre;

Pour inverser deux ligne c'est alors simple par ex pour inverser la ligne m avec la ligne n :
int*ligne_temp = systeme[m];
systeme[m] = systeme[n];
sysyeme[n] = ligne_temp;

Pour ta deuxieme question il "suffit" d'écrire le systeme par exemple
a1 x + b1 y + c1 z = A;
a2 x + b2 y + c2 z = B;
a3 x + b3 y + c3 z = C;

Pour annullé la variable z : la ligne 3 donne :
z = (C - a3 x - b3 y)/c3.
Que l'on substitue dans les lignes 1 et 2. Soit:
(a1 - a3/c3) x + (b1 - b3/c3) y = A - C/c3
(a2 - a3/c3) x + (b2 - b3/c3) y = B - C/c3

Donc si on reprend le code le système devient:
systeme[1][1] = systeme[1][1] - systeme[3][1]/systeme[3][3];
systeme[1][2] = systeme[1][2] - systeme[3][2]/systeme[3][3];
systeme[2][1] = systeme[2][1] - systeme[3][1]/systeme[3][3];
systeme[2][2] = systeme[2][2] - systeme[3][2]/systeme[3][3];

Tu peux mettre les autres coef a zero pour signaler que la var z n'est plus utiliser et que la derniere ligne ne sert plus.

Le second membre est également modifié :
second_membre[1] = second_membre[1] - second_membre[3] /systeme[3][3];
second_membre[2] = second_membre[2] - second_membre[3] /systeme[3][3];

Voila . Ya un peut plus de travail pour continuer la triangulation et pour généraliser a des système plus grand mais la base est la. Un conseil résoud ton système "a la main" comme j'ai fait pour trouver les formules générales puis le code
viendra tout seul.
0
Pierrrrro Messages postés 7 Statut Membre
 
Désolé de ne pas avoir répondu plus tôt (smaines d'exams...)
Mais merci beaucoup, c'est vrai qu'en posant les opérations à la mains ca va mieux, merci pour ton aide!!

Bon week end!
0