MÉTHODE D'ÉLIMINATION DE GAUSS-JORDAN, ET DU PIVOT DE GAUSS POUR SYSTÈMES D'ÉQUA

kuise Messages postés 9 Date d'inscription mercredi 2 avril 2003 Statut Membre Dernière intervention 18 décembre 2005 - 18 déc. 2005 à 20:13
cs_jehan1 Messages postés 1 Date d'inscription lundi 28 août 2006 Statut Membre Dernière intervention 2 septembre 2006 - 2 sept. 2006 à 19:59
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35153-methode-d-elimination-de-gauss-jordan-et-du-pivot-de-gauss-pour-systemes-d-equations-lineaires-a-3-inconnues

cs_jehan1 Messages postés 1 Date d'inscription lundi 28 août 2006 Statut Membre Dernière intervention 2 septembre 2006
2 sept. 2006 à 19:59
Je suis quelque peu étonné de l'erreur énorme sur l'exemple :

La réponse normale est :
x = 1
y = 2
z = 3
La réponse du prog :
x = 0,875
y = 2,125
z = 3,125

Avant d'arrondir à posteriori, il me semble que pour la méthode de Gauss, il y a une façon de réduire les erreurs d'arrondi (pivot optimal de Gauss un truc comme ça).
cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 1
19 déc. 2005 à 00:53
ah oui, en d autres termes, au lieu que ca soit float le type de base dans ton programme, ca va etre CFraction

petite note: j'avais fait cette classe il y a de ca très longtemps, mais je me rappèle tout de même qu'elle fonctionnait nickel

voici un exemple d utilisation:
CFraction fraction1 = new CFraction(1, 2);
CFraction fraction2 = new CFraction(3, 4);
CFraction fraction3 = fraction1 + fraction2;
if(fraction3.negative==false) Console.WriteLine("{0}/{1}", fraction3.nominateur, fraction3.denominateur);
else Console.WriteLine("-{0}/{1}", fraction3.nominateur, fraction3.denominateur);

bon, je vais arreter de polluer les commentaires :D
cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 1
19 déc. 2005 à 00:49
tu pourrais faire une classe fraction pour résoudre ton problème et pour maintenair ta precision maximale, je vais te passer la mienne:


public class CFraction
{
public int nominateur=0, denominateur=1;
public bool negative;

#region INITIALISATION DES VARIABLES
public CFraction(int x, int y)
{
//il est de la responsabilite de l utilisateur de cette classe de verifier
//si le denominateur est different de zero avant de l utiliser.
if(y==0) y=1; //pour eviter une erreur
if(Math.Sign((double)x/y)==-1)
negative = true;
else negative = false;
nominateur = Math.Abs(x);
denominateur = Math.Abs(y);
}
#endregion

#region OPERATEUR +
public static CFraction operator +(CFraction a, CFraction b)
{
CFraction fractionRetour;
if(b.negative false) fractionRetour CFraction.Addition(a, b);
else fractionRetour = CFraction.Soustraction(a, b);
fractionRetour = CFraction.Reduire(fractionRetour);
return fractionRetour;
}
#endregion
#region OPERATEUR -
public static CFraction operator -(CFraction a, CFraction b)
{
CFraction fractionRetour;
if(b.negative false) fractionRetour CFraction.Soustraction(a, b);
else fractionRetour = CFraction.Addition(a, b);
fractionRetour = CFraction.Reduire(fractionRetour);
return fractionRetour;
}
#endregion
#region MULTIPLICATION DE DEUX FRACTIONS
public static CFraction operator *(CFraction a, CFraction b)
{
int nom, denom;
bool negative;
if((a.negative && b.negative) || (!a.negative && !b.negative))
negative = false;
else
negative = true;
nom = a.nominateur * b.nominateur;
denom = a.denominateur * b.denominateur;
CFraction fractionRetour = new CFraction(nom, denom);
fractionRetour.negative = negative;
fractionRetour = CFraction.Reduire(fractionRetour);
return fractionRetour;
}
#endregion
#region DIVISION DE DEUX FRACTIONS
public static CFraction operator /(CFraction a, CFraction b)
{
int temp;
temp = b.nominateur;
b.nominateur = b.denominateur;
b.denominateur = temp;
return a*b;
}
#endregion
#region FONCTION QUI ADDITIONNE DEUX FRACTIONS
public static CFraction Addition(CFraction a, CFraction b)
{
int nom, denom;
if(a.negative == false)
nom = a.nominateur * b.denominateur + b.nominateur * a.denominateur;
else
nom = - a.nominateur * b.denominateur + b.nominateur * a.denominateur;
denom = a.denominateur * b.denominateur;
return new CFraction(nom, denom);
}
#endregion
#region FONCTION QUI SOUSTRAIT DEUX FRACTIONS
public static CFraction Soustraction(CFraction a, CFraction b)
{
int nom, denom;
if(a.negative == false)
nom = a.nominateur * b.denominateur - b.nominateur * a.denominateur;
else
nom = - a.nominateur * b.denominateur - b.nominateur * a.denominateur;
denom = a.denominateur * b.denominateur;
return new CFraction(nom, denom);
}
#endregion
#region FONCTION QUI REDUIT LES FRACTIONS
public static CFraction Reduire(CFraction fraction)
{
int nom = fraction.nominateur;
int denom = fraction.denominateur;
int reste;
do
{
Math.DivRem(nom, denom, out reste);
if(reste != 0)
{
nom = denom;
denom = reste;
}
}while(reste != 0);

CFraction fractionRetour = new CFraction(fraction.nominateur/denom, fraction.denominateur/denom);
fractionRetour.negative = fraction.negative;
return fractionRetour;
}
#endregion
}
kuise Messages postés 9 Date d'inscription mercredi 2 avril 2003 Statut Membre Dernière intervention 18 décembre 2005
18 déc. 2005 à 20:13
Essayes avec Math.Round()
Rejoignez-nous