Goku46 | Désolé pour l'orthographe. C'est loin d'être mon fort.
Je voulais pas mettre mon code non plus car sa prend bcp de place.
J'utilise Qt et vous verrez la fonction exercice de ma fenetre me sert essentiellement de test. Elles se contentes d'appeller une autre fonction("GaussSansPivot" ). Voici le cpp ou sa plante
Code :
- #include <iostream>
- #include "Graphique.h"
- using namespace std;
- vector GaussSansPivot (matrice A,vector b)
- {
- matrice L(A.dimension()),U(A.dimension());
- vector x(A.dimension());
- float somme;
- int i,k,j;
- U=A;
- x=b;
- L.unite();
- for(k=0;k<A.dimension()-1;k++)
- {
- for(i=k+1;i<A.dimension();i++)
- {
- L[i][k]=U[i][k]/U[k][k];
- for(j=k;j<A.dimension();j++)
- {
- U[i][j]=U[i][j]-L[i][k]*U[k][j];
- }
- x[i]=x[i]-L[i][k]*x[k];
- }
- }
- L.aff();
- U.aff();
- x[A.dimension()-1]=x[A.dimension()-1]/U[A.dimension()-1][A.dimension()-1];
- for(i=A.dimension()-2;i>=0;i--)
- {
- somme= 0;
- for(k=i+1;k<A.dimension();k++)
- {
- somme=somme + U[i][k]*x[k];
- }
- x[i]=(x[i]-somme)/U[i][i];
- }
- return x;
- }
- vector GaussAvecPivot (matrice A,vector b)
- {
- matrice L(A.dimension()),U(A.dimension()),P(A.dimension());
- vector x(A.dimension());
- float somme,max;
- int i,k,j,pos;
- U=A;
- x=b;
- P.unite();
- for(k=0;k<A.dimension()-1;k++)
- {
- max=U[k][k];
- pos=k;
- for(i=k+1;i<A.dimension();i++)
- {
- if(U[i][k]>max)
- {
- max=U[i][k];
- pos=i;
- }
- }
- L.echangeLigne(k,pos);
- U.echangeLigne(k,pos);
- P.echangeLigne(k,pos);
- x.echangeLigne(k,pos);
- for(i=k+1;i<A.dimension();i++)
- {
- L[i][k]=U[i][k]/U[k][k];
- for(j=k;j<A.dimension();j++)
- {
- U[i][j]=U[i][j]-L[i][k]*U[k][j];
- }
- x[i]=x[i]-L[i][k]*x[k];
- }
- }
- x[A.dimension()-1]=x[A.dimension()-1]/U[A.dimension()-1][A.dimension()-1];
- for(i=A.dimension()-2;i>=0;i--)
- {
- somme= 0;
- for(k=i+1;k<A.dimension();k++)
- {
- somme=somme + U[i][k]*x[k];
- }
- x[i]=(x[i]-somme)/U[i][i];
- }
- L.unite();
- L.aff();
- U.aff();
- P.aff();
- return x;
- }
- vector GaussSeidel (matrice A, vector b, vector X0, float tol,int max)
- {
- vector x,diff;
- int nbIt=0,i,j;
- float rest=0,resOld,resNew;
- x.changeTaille(A.dimension());
- diff.changeTaille(A.dimension());
- x=X0;
- diff=b-MV(A,x);
- rest=(diff.normeC())/(b.normeC());
- while( nbIt<max && rest>tol*tol)
- {
- for(i=0;i<A.dimension();i++)
- {
- resNew=0;
- resOld=0;
- for(j=i+1;j<A.dimension();j++)
- {
- resOld=resOld+A[i][j]*x[j];
- }
- for(j=0;j<=i-1;j++)
- {
- resNew=resNew+A[i][j]*x[j];
- }
- x[i]=(1/A[i][i])*(b[i]-resOld-resNew);
- }
- diff=b-MV(A,x);
- rest=diff.normeC()/b.normeC();
- nbIt++;
- }
- return x;
- }
- vector gradient(matrice A, vector b, vector X0, float tol, int max )
- {
- vector x,diff,Ad,d,tempo2,dInit;
- int nbIt=0,i,j;
- float rest=0,denominateur,numerateur,alpha,beta;
- x=X0;
- diff=b-MV(A,x);
- d=diff;
- rest=(diff.normeC())/(b.normeC());
- while( nbIt<max && rest>tol*tol)
- {
- denominateur=0;
- numerateur=0;
- nbIt++;
- Ad=MV(A,d);
- for(i=0;i<A.dimension();i++)
- {
- denominateur=denominateur+ d[i]*Ad[i];
- numerateur=numerateur+ diff[i]*d[i];
- }
- alpha=numerateur/denominateur;
- x=x+diff*alpha;
- diff=b-MV(A,x);
- rest=(diff.normeC())/(b.normeC());
- Ad=MV(A,d);
- tempo2=MV(A,diff);
- denominateur=0;
- numerateur=0;
- for(i=0;i<A.dimension();i++)
- {
- denominateur=denominateur+ Ad[i]*d[i];
- numerateur=numerateur+ d[i]*tempo2[i];
- }
- beta=numerateur/denominateur;
- d=diff-beta*d;
- }
- return x;
- }
|
Le programme me met la même erreur pour chaque début de fonction tel que "vector gradient(matrice A, vector b, vector X0, float tol, int max )"
La class vector étant définit dans le premier headers avec ma classe matrice Voici sont code
Code :
- #ifndef PROJETCLANU
- #define PROJETCLANU
- #include <iostream.h>
- class matrice;
- //definition des vecteurs
- class vector
- {
- private :
- float *V;
- int taille;
- public :
- //constructeur et destructeur
- vector(int T=1);
- vector(const vector & vec);
- ~vector();
- //surdefinition d'operateur
- float & operator[](int i);
- vector operator=(const vector & vec);
- //fonction
- void aff(void);
- void changeTaille(int taille);
- void echangeLigne(int N1,int N2);
- float normeC(void);
- //fonction amie
- friend vector MV(matrice matr,vector vec);
- friend vector operator+(vector a,vector b);
- friend vector operator-(vector a,vector b);
- friend vector operator*(vector a,float alpha);
- friend vector operator*(float alpha, vector a);
- };
- vector::vector(int T)
- {
- int i;
- V = new float [T];
- taille=T;
- for(i=0;i<taille;i++)
- {
- *(V+i)=0;
- }
- }
- vector::vector(const vector & vec)
- {
- int i;//compteur
- taille=vec.taille;
- V = new float[taille];
- for(i=0;i<taille;i++)
- {
- V[i]=vec.V[i];
- }
- }
- vector::~vector()
- {
- delete V;
- }
- float & vector::operator[](int i)
- {
- return *(V+i);
- }
- vector vector::operator=(const vector & vec)
- {
- int i;
- if(this != &vec)
- {
- delete V;
- taille=vec.taille;
- V=new float[taille];
- for(i=0;i<taille;i++)
- {
- V[i]=vec.V[i];
- }
- }
- return *this;
- }
- void vector::aff(void)
- {
- int i;
- for(i=0;i<taille;i++)
- {
- cout<<*(V+i)<<endl;
- }
- cout<<endl;
- }
- void vector::changeTaille(int n)
- {
- delete V;
- V=new float[n];
- taille=n;
- }
- void vector::echangeLigne(int N1,int N2)
- {
- float tempo;
- tempo=V[N1];
- V[N1]=V[N2];
- V[N2]=tempo;
- }
- float vector::normeC(void)
- {
- int i;
- float resul=0;
- for(i=0;i<taille;i++)
- {
- resul=resul+V[i]*V[i];
- }
- return resul;
- }
- //definition des matrices
- class matrice
- {
- private :
- float **M; //notre pointeur pour aller cherché les élément de la matrice
- int taille;
- public :
- matrice(int T=1); //on reçois en argument la taille de la matrice CARRE
- matrice(const matrice &matr);//constructeur de recopie
- ~matrice();//destructeur
- float * operator[](int i);//surdefinition de l'operateur[]
- matrice operator=(const matrice & matr);//surdefinition de l'operateur =
- void aff(void);//fonction afficher
- void echangeLigne(int N1,int N2);//échanger la ligne N1 avec la ligne N2
- void changeTaille(int n);
- void unite(void);
- void Hilbert(void);
- int dimension(void);
- friend vector MV(matrice matr,vector vec);//fonction multipliant un vecteur et une matrice
- };
- matrice::matrice(int T)
- {
- int i,j;//compteur
- M = new float*[T];//on crée un tableau de pointeur
- for(i=0;i<T;i++)
- {
- M[i]=new float[T];
- }
- taille=T;
- for(i=0;i<taille;i++)
- {
- for(j=0;j<taille;j++)
- {
- M[i][j]=0;
- }
- }
- }
- matrice::matrice(const matrice &matr)
- {
- int i,j;//compteur
- taille=matr.taille;
- M = new float*[taille];
- for(i=0;i<taille;i++)
- {
- M[i]=new float[taille];
- }
- for(i=0;i<taille;i++)
- {
- for(j=0;j<taille;j++)
- {
- M[i][j]=matr.M[i][j];
- }
- }
- }
- matrice::~matrice()
- {
- int i;
- for(i=0;i<taille;i++)
- {
- delete M[i];
- }
- delete M;
- }
- float * matrice::operator[](int i)
- {
- return *(M+i);
- }
- matrice matrice::operator=(const matrice & matr)
- {
- int i;
- int j;
- if(this != &matr)
- {
- for(i=0;i<taille;i++)
- {
- delete M[i];
- }
- delete M;
- taille=matr.taille;
- M = new float*[taille];
- for(i=0;i<taille;i++)
- {
- M[i]=new float[taille];
- }
- for(i=0;i<taille;i++)
- {
- for(j=0;j<taille;j++)
- {
- M[i][j]=matr.M[i][j];
- }
- }
- }
- return *this;
- }
- void matrice::aff(void)
- {
- int i;
- int j;
- for(i=0;i<taille;i++)
- {
- for(j=0;j<taille;j++)
- {
- cout<<M[i][j]<<" ";
- }
- cout<<endl;
- }
- cout<<endl;
- }
- void matrice::echangeLigne(int N1,int N2)
- {
- int i;
- float tempo;
- for(i=0;i<taille;i++)
- {
- tempo=M[N1][i];
- M[N1][i]=M[N2][i];
- M[N2][i]=tempo;
- }
- }
- void matrice::changeTaille(int n)
- {
- int i;
- for(i=0;i<taille;i++)
- {
- delete M[i];
- }
- delete M;
- M=new float*[n];
- for(i=0;i<n;i++)
- {
- M[i]=new float[n];
- }
- taille=n;
- }
- void matrice::unite(void)
- {
- int i;
- for(i=0;i<taille;i++)
- {
- M[i][i]=1;
- }
- }
- void matrice::Hilbert(void)
- {
- int i,j;
- for(i=0;i<taille;i++)
- {
- for(j=0;j<taille;j++)
- {
- M[i][j]=1.0/(i+j+1);//i et j commence à 0,1.0 pour forcer le résultat en float.
- }
- }
- }
- int matrice::dimension(void)
- {
- return taille;
- }
- //declaration des fonction amis
- vector MV(matrice matr,vector vec)
- {
- int i=0,j=0;
- vector resul(vec.taille);
- if(matr.taille == vec.taille)
- {
- for(i=0;i<vec.taille;i++)
- {
- for(j=0;j<vec.taille;j++)
- {
- resul[i]=resul[i]+matr[i][j]*vec[j];
- }
- }
- }
- return resul;
- }
- vector operator+(vector a,vector b)
- {
- vector resul(1);
- if(a.taille==b.taille)
- {
- int i;
- resul.changeTaille(a.taille);
- for(i=0;i<a.taille;i++)
- {
- resul[i]=a.V[i]+b.V[i];
- }
- }
- return resul;
- }
- vector operator-(vector a,vector b)
- {
- vector resul(1);
- if(a.taille==b.taille)
- {
- int i;
- resul.changeTaille(a.taille);
- for(i=0;i<a.taille;i++)
- {
- resul[i]=a.V[i]-b.V[i];
- }
- }
- return resul;
- }
- vector operator*(vector a,float alpha)
- {
- int i;
- vector resul(2);
- for(i=0;i<a.taille;i++)
- {
- resul[i]=a[i]*alpha;
- }
- return resul;
- }
- vector operator*(float alpha, vector a)
- {
- int i;
- vector resul(2);
- for(i=0;i<a.taille;i++)
- {
- resul[i]=a[i]*alpha;
- }
- return resul;
- }
- //fonction de clanuProject
- vector GaussSansPivot (matrice A,vector b);
- vector GaussAvecPivot (matrice A,vector b);
- vector GaussSeidel (matrice A, vector b, vector X0, float tol,int max );
- vector gradient (matrice A, vector b, vector X0, float tol, int max );
- #endif
|
et pour finir voici le deuxième headers
Code :
- #define GRAPHIQUE
- #include<iostream.h>
- #include <QApplication>
- #include <QFont>
- #include <QPushButton>
- #include "projetClanu.h"
- class Fenetre : public QWidget
- {
- Q_OBJECT
- private:
- QPushButton *Bouton;
- int nbBouton;
- public:
- Fenetre(int longueur=600,int largeur=600);
- void rajouterBouton(int x,int y,char * nom,int taillePolice=12, char* nompolice="Viner Hand ITC" );
- public slots:
- void exercice(void);
- };
- Fenetre::Fenetre(int longueur,int largeur)
- {
- setFixedSize(longueur,largeur);
- }
- void Fenetre::rajouterBouton(int x,int y,char * nom,int taillePolice, char* nompolice)
- {
- Bouton = new QPushButton(nom,this);
- Bouton->setFont(QFont(nompolice,taillePolice));
- Bouton->setCursor(Qt::PointingHandCursor);
- Bouton->move(x,y);
- QObject::connect(Bouton,SIGNAL(clicked()),this,SLOT(exercice()));
- }
- void Fenetre::exercice(void)
- {
- int i;
- matrice a(3),hil(20);
- vector v(20),resul(20),X0(2);
- hil.Hilbert();
- hil.aff();
- a[0][0]=1;
- a[0][1]=4;
- a[0][2]=7;
- a[1][0]=2;
- a[1][1]=5;
- a[1][2]=8;
- a[2][0]=3;
- a[2][1]=6;
- a[2][2]=11;
- X0[0]=2;
- X0[1]=-1.5;
- for(i=0;i<20;i++)
- {
- v[i]=1;
- }
- v=MV(hil,v);
- resul=GaussSansPivot(hil,v);
- resul.aff();
- }
- #endif
|
N'étant pas un pro en info, si vous avez des reproche à faire à mon code n'hésiter pas à me les dires, je suis la pour apprendre.
Toute les fonction dans mon cpp ont été testé avant que j'éclate mon fichier en petit morceau pour le rendre plus lisible. Elles ne sont donc pas source d'erreur. Message édité par gilou le 16-05-2011 à 13:53:36
|