begin process at 2012 05 29 16:05:19
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Algorithme

 > 

Maths

 > 

pivot de gauss


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

pivot de gauss

jeudi 13 novembre 2008 à 15:59:15 | pivot de gauss

midokok

salut .....je rechrche une fonction récursive ...pour la solution de (n) systeme d'equation

//par la méthode ----> (PIVOT DE GAUSS)

& merci ........mido................
vendredi 14 novembre 2008 à 01:30:28 | Re : pivot de gauss

coucou747

Administrateur CodeS-SourceS
salut...

tu viens de trouver un programme complet.

#include <iostream>
#include <vector>

int pow(int a, int b){
    if (b==0) return 1;
    return a*pow(a, b-1);
}

int min(int a, int b){ return ((a<b)?a:b);}
int max(int a, int b){ return ((a>b)?a:b);}

int pgcd_(int c, int d){
    int e=d%c;
    if (e==0){
        return c;
    }else{
        return pgcd_(e, c);
    }
}

int pgcd(int a, int b){
    if (a<0){
        return pgcd(-a, b);
    }else if(b<0){
        return pgcd(a, -b);
    }
    int c=min(a,b), d=max(a,b);
    return pgcd_(c, d);
}

class Fraction{
    public:
    Fraction(int a){
        num=a;
        den=1;
    }
    Fraction(){
        num=0;
        den=1;
    }
    Fraction(int a, int b){
        num=a;
        den=b;
    }
    Fraction operator*(Fraction a) const{
        Fraction b(num, den);
        b.num*=a.num;
        b.den*=a.den;
        b.simplifie();
        return b;
    };
    Fraction operator+(Fraction a) const{
        Fraction b;
        b.num=num*a.den+a.num*den;
        b.den=den*a.den;
        b.simplifie();
        return b;
    };
    Fraction operator-(Fraction a) const{
        Fraction b;
        b.num=num*a.den-a.num*den;
        b.den=den*a.den;
        b.simplifie();
        return b;
    };
    void operator-=(Fraction a){
        num=num*a.den-a.num*den;
        den*=a.den;
        simplifie();
    };
    void operator+=(Fraction a){
        num=num*a.den+a.num*den;
        den*=a.den;
        simplifie();
    };
    void operator/=(Fraction a){
        num*=a.den;
        den*=a.num;
        simplifie();
    };
    void operator*=(Fraction a){
        num*=a.num;
        den*=a.den;
        simplifie();
    };
    Fraction operator/(Fraction a) const{
        Fraction b(num, den);
        b.num*=a.den;
        b.den*=a.num;
        b.simplifie();
        return b;
    };
    bool operator!=(int a){
        simplifie();
        if (den!=1){
            return true;
        }else if (num==a){
            return false;
        }
        return true;
    };
    bool operator==(int a){
        simplifie();
        if (den!=1){
            return false;
        }else if (num==a){
            return true;
        }
        return false;
    };
    int simplifie(){
        if (num==0) return 0;
        if (den<0){ den*=-1; num*=-1; }
        int a=pgcd(num, den);
        den/=a;
        num/=a;
        return a;
    }
    friend std::ostream& operator<< (std::ostream &, Fraction f);
    private:
    int long long num, den;
};

std::ostream& operator<< (std::ostream& o, Fraction f){
    f.simplifie();
    if (f.num==0 || f.den==1)
        o<<f.num;
    else
        o<<f.num<<"/"<<f.den;
    return o;
}


template <class T>
class System{
    public:
        System(){
            Hnext=false;
            coefsnbr=0;
            solved=false;
        }
        ~System(){}
        void addcoef(int eq, T coef){
            if (eq==0){
                coefs.push_back(coef);
                coefsnbr++;
            }else{
                next->addcoef(eq-1, coef);
            }
        }
        int addEQ(){
            if (Hnext){
                return 1+next->addEQ();
            }else{
                next=new System;
                Hnext=true;
                return 1;
            }
        }
        void pivot(int r, T val_rang, int rang_suppr, T suppr_val){
            //print();
            coefs[r]=coefs[r]*suppr_val-coefs[rang_suppr]*val_rang;
            if (Hnext){
                next->pivot(r, val_rang, rang_suppr, suppr_val);
            }
        }
        void pivot(int rang_suppr, T val_suppr, T valeur){
            Value=Value*val_suppr-valeur*coefs[rang_suppr];
            if (Hnext){
                next->pivot(rang_suppr, val_suppr, valeur);
            }
        }
        void pivot(){
            if (Hnext){
                int h;
                for (int i=coefsnbr-1;i>=0;i--){
                    if (coefs[i]!=0){
                        h=i;break;
                    }
                }
                next->pivot(h, coefs[h], Value);
                for (int i=0;i<coefsnbr;i++){
                    next->pivot(i, coefs[i], h, coefs[h]);
                }
                //print();        //Afficher les etapes intermediaires
                next->pivot();
                hauteur_coef=h;
            }
        }
        void solve(){
            pivot();
        }
        void print(){
            for (int i=0;i<coefsnbr;i++){
                if (coefs[i]!=0){
                    if (coefs[i]!=1)
                        std::cout << coefs[i] << "*" << (char)('a'+i);
                    else
                        std::cout << (char)('a'+i);
                    if (i!=coefsnbr-1) std::cout << "\t+";
                }else{
                //    if (i!=coefsnbr-1) std::cout << "\t\t";
                }
            }
            std::cout << "\t=" << Value << "\n";
            if (Hnext){
                return next->print();
            }else{
                std::cout << "\n\n";
            }
        }
        T get(int rang){
            if (hauteur_coef==rang){
                if (solved){
                    return valeur_coef;
                }else{
                    solved=true;
                    valeur_coef=Value;
                    for (int i=0;i<hauteur_coef;i++){
                        valeur_coef-=coefs[i]*get(i);
                    }
                    valeur_coef/=coefs[hauteur_coef];
                    return valeur_coef;
                }
            }else{
                return next->get(rang);
            }
        }
        void setresult(int p, T r){
            if (p==0)
                Value=r;
            else
                next->setresult(p-1, r);
        }
    private:
        bool Hnext;
        T Value;
        std::vector<T> coefs;
        System *next;
        int coefsnbr;
        int hauteur_coef;
        T valeur_coef;
        bool solved;
};

void test1(){
    // Calcule les coefs du polynome de degre 4 qui donne, en fonction de n, la somme des cubes des n premiers nombres naturels
    int i;
    System<Fraction> a;
    i=0;
    a.addcoef(i, 1);    a.addcoef(i, 1);    a.addcoef(i, 1);    a.addcoef(i, 1);    a.setresult(i, 1);
    i=a.addEQ();
    a.addcoef(i, 16);    a.addcoef(i, 8);    a.addcoef(i, 4);    a.addcoef(i, 2);    a.setresult(i, 9);
    i=a.addEQ();
    a.addcoef(i, 81);    a.addcoef(i, 27);    a.addcoef(i, 9);    a.addcoef(i, 3);    a.setresult(i, 36);
    i=a.addEQ();
    a.addcoef(i, 256);    a.addcoef(i, 64);    a.addcoef(i, 16);    a.addcoef(i, 4);    a.setresult(i, 100);
    a.print();
    a.solve();
    std::cout << "\n\nPIVOT\n\n";
    a.print();
    std::cout
            << "\n\ta = " << a.get(0)
            << "\n\tb = " << a.get(1)
            << "\n\tc = " << a.get(2)
            << "\n\td =" << a.get(3) << "\n\n" ;
}

void test2(){
    int i, j, k, p, s=1;
    System<Fraction> a;
    std::cout << "Entrez la puissance :";
    std::cin >> p;
    p++;
    for (i=0;i<p;i++)    a.addcoef(0, 1);
    a.setresult(0, 1);
    for (i=2;i<=p;i++){
        k=a.addEQ();
        s+=pow(i, p-1);
        for (j=1;j<=p;j++){
            a.addcoef(k, pow(i, j));
        }
        a.setresult(k, s);
    }
    a.print();
    a.solve();
    std::cout << "\n\nPIVOT\n\n";
    a.print();
    std::cout << "Somme des k^p de k variant de 0 a n=\n\t";
    for (i=0;i<p;i++){
        if (a.get(i)!=0){
            std::cout << a.get(i) << "*n^"<< (i+1) << "\t";
            if (i!=p-1) std::cout << "+";
        }
    }
    std::cout << "\n\n";
}

void test3(){
    int i, j, k=0, l, n;
    System<Fraction> a;
    std::cout << "Entrez le nombre de variables :";
    std::cin >> n;

    for (i=0;i<n;i++){
        if (i!=0) k=a.addEQ();
        std::cout << "Equation : " << (i+1) << "\n";
        for (j=0;j<n;j++){
            std::cout << "coef " << (char)(j+'a') << " de l'equation " << (i+1) << " :";
            std::cin >> l;
            a.addcoef(k, l);
        }
        std::cout << "resultat de l'equation " << (i+1) << " :";
        std::cin >> l;
        a.setresult(k, l);
    }
    a.print();
    a.solve();
    std::cout << "\n\nPIVOT\n\n";
    a.print();
    for (i=0;i<n;i++){
        std::cout << "\n\t" << ((char)('a'+i)) << " = " << a.get(i);
    }
    std::cout << "\n\n";
}

int main(){
    /*
        Condition de resolution : La diagonale doit etre non nulle (diagonale haut/droite => bas/gauche)
        sinon, ca provoaue des divisions par zero...

        faudrait que j'ajoute une simplification des equations par pgcd,
        ajouter un tri des lignes pour obtennir une diagonalle non nulle,
        et le mettre sous forme de template pour permettre des coefs et valeurs complexes

        Exemple 1 :
            Dans cet exemple, on sait que la somme de k varie de 0 a n de k^a en fonction de n (a entier naturel)
            est un polynome de degre a+1 exemple : la somme des carres est n(n+1)/2, la somme des n cubes est n(n+1)(2n+1)/6
            Cet exemple cherche la somme des cubes, c'est donc un polynome de degre 4...
            P(n)=a*x^4 + b*x^3+c*x^2+d*x+e
            p(0)=0
            p(1)=1
            p(2)=9
            p(3)=81
            p(4)=256
    
            Ce qui nous forme le systeme donne en exemple, et qui donne :
            domme de k=0 a n des k^3 = 1/4 * ( n^2 * (n+1)^2 )
    
            Grace a ce genre de systemes, on peut avoir des valeurs pour tout degres
        Exemple 2 :
            C'est une generalisation de l'exemple 1 mais a tout les degres
        Exemple 3 :
            C'est un calcul du pivot sur des valeurs entrees manuellement

    */
    //test1();
    test2();
    test3();
    return 0;
}



Cette discussion est classée dans : pivot, gauss


Répondre à ce message

Sujets en rapport avec ce message

pivot de gauss [ par DeNeBj ] bonjourj'aimerais trouver un prog en c qui utilise seulement les tableaux et les boucles et qui resoud des systemes d'equations (on s'arrete à 10 ) ke besion d' aide [ par ccfacile ] j'ai  fais un programme sur devc++ pour resoudre l'equation matricielle : A*X=B ,  je vois pas ou est elle euruer ? est ce que vous pouvez aidez SVP, gauss en pascal "Tres Urgent " [ par islem2007 ] Svp je voudrais ecrire en pascal le programme correspondant a la methode de gauss pour la matrice suivante :On considere la matrice An=(ai,j)<=i,j& algorithme de gauss et decomposition LU [ par speedamine ] bonjour a tous.je voudrai avoir des algorithmes ,ecrits en borland pascal,suivants:methode de gauss ordinaire pour la resolution d'un systeme .la deco matrice échelonné [ par skouatteur ] bonjour tout le mondeje me suis inscrit sur ce site afin d'avoir un coud de main sur un logiciel qui s'appelle maple et j'espere que l'on pourra m'aid Résolution Ax=b avec gauss [ par NueclearSnake ] bonjour à tous, je suis tout nouveau ici et je programme en fortran, je dois faire la résolution de Ax=b par la méthode de gauss, mais j'ai un gros pr


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,640 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales