begin process at 2012 05 27 17:50:01
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > POLYNOME CARACTERISTIQUE

POLYNOME CARACTERISTIQUE


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :matrice, polynome, caracteristique, determinant, fft Niveau :Débutant Date de création :16/07/2006 Vu / téléchargé :13 772 / 397

Auteur : JCDjcd

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
- algorithme pour calculer le polynome caracteristique d'une matrice (carree) :
Pc(M)(x) = det(M - x.I)

- l'algorithme consiste a faire un FFT a partir de certaines valeurs du polynome
que l'on sait calculer avec le determinant d'un matrice (algo. en n^3)

- trois fonctions :
   * det -> calcule le determinant d'un matrice (complexe)
   * polyFFT -> calcule la FFT d'un tableau de nombres complexes
   * Pc -> retourne le polynome caracteristique

- voir captures d'ecran pour des exemples de matrices

Source

  • //-------------------------------------------------
  • // DET
  • //-------------------------------------------------
  • // calcul d'un determinant avec le pivot de Gauss
  • // la complexite est en n^3
  • COMPLEX *Det(COMPLEX **_mat,int n,COMPLEX *res)
  • {
  • COMPLEX **mat;
  • COMPLEX det;
  • int x,y;
  • int i,j;
  • mat = CreateMat(n);
  • for(y=0;y<n;y++)
  • {
  • for(x=0;x<n;x++)
  • {
  • mat[y][x].re = _mat[y][x].re;
  • mat[y][x].im = _mat[y][x].im;
  • }
  • }
  • det.re = 1.;
  • det.im = 0.;
  • for(j=0;j<n-1;j++)
  • {
  • int rankMax,rank;
  • COMPLEX coeffMax;
  • // ( etape 1 )
  • rankMax = j;
  • for(rank=j+1;rank<n;rank++)
  • {
  • if(AbsComplex(&mat[rankMax][j]) < AbsComplex(&mat[rank][j]))
  • {
  • rankMax = rank;
  • }
  • }
  • coeffMax.re = mat[rankMax][j].re;
  • coeffMax.im = mat[rankMax][j].im;
  • if(AbsComplex(&coeffMax) <= MATH_EPSILON)
  • {
  • det.re = 0.;
  • det.im = 0.;
  • goto label_end;
  • }
  • // ( etape 2 )
  • if(rankMax != j)
  • {
  • for(i=j;i<n;i++)
  • {
  • COMPLEX tmp;
  • tmp = mat[j][i];
  • mat[j][i] = mat[rankMax][i];
  • mat[rankMax][i] = tmp;
  • }
  • det.re *= -1.;
  • det.im *= -1.;
  • }
  • MulComplex(&det,&det,&coeffMax);
  • // ( etape 3 )
  • for(rank=j+1;rank<n;rank++)
  • {
  • COMPLEX coeff;
  • DivComplex(&coeff,&mat[rank][j],&coeffMax);
  • for(i=j;i<n;i++)
  • {
  • COMPLEX mul;
  • MulComplex(&mul,&coeff,&mat[j][i]);
  • SubComplex(&mat[rank][i],&mat[rank][i],&mul);
  • }
  • }
  • }
  • MulComplex(&det,&det,&mat[n-1][n-1]);
  • label_end:
  • DeleteMat(mat,n);
  • *res = det;
  • return res;
  • } // Det()
  • //-------------------------------------------------
  • // POLY_FFT
  • //-------------------------------------------------
  • // on decompose le polynome P = A0 + B0 avec les coefficients
  • // de degres pairs (en A0) et impairs (en B0)
  • // alors on a :
  • // P(w) = A0(w) + B0(w)
  • // = A(w^2) + w.B(w^2)
  • // or w^2 est une racine nieme, donc on se ramene a un cas
  • // de taille deux fois moins grand
  • void polyFFT(
  • P_COMPLEX res,
  • P_COMPLEX arrayCoeff,
  • int stepi,
  • int n,
  • P_COMPLEX w
  • )
  • {
  • if(1 == n)
  • {
  • // P(z)=constante
  • res->re = arrayCoeff->re;
  • res->im = arrayCoeff->im;
  • }
  • else
  • {
  • int k;
  • COMPLEX w2,wPowk;
  • // strategie diviser pour regner
  • // calcul du carre de <w>
  • MulComplex(&w2,w,w);
  • // appel recursif
  • polyFFT(res ,arrayCoeff ,2*stepi,n/2,&w2); // coefficients pairs
  • polyFFT(res + n/2,arrayCoeff + stepi ,2*stepi,n/2,&w2); // coefficients impairs
  • // on calcule la FFT a partir de ce que l'on vient de calculer
  • wPowk.re = 1.;
  • wPowk.im = 0.;
  • for(k=0;k<n/2;k++)
  • {
  • COMPLEX A,B;
  • A = res[k];
  • B = res[k + n/2];
  • MulComplex(&B,&B,&wPowk);
  • AddComplex(res + k ,&A,&B);
  • SubComplex(res + k + n/2,&A,&B);
  • MulComplex(&wPowk,&wPowk,w);
  • }
  • }
  • } // polyFFT()
  • //-------------------------------------------------
  • // PC
  • //-------------------------------------------------
  • //
  • // calcul du polynome caracteristique
  • // Pc(M)(x) = det(M - x.I)
  • //
  • P_POLYNOMIAL Pc(COMPLEX **_mat,int n)
  • {
  • int len; // aligne sur une puissance de 2
  • P_POLYNOMIAL res; // le polynome caracteristique
  • COMPLEX *arrayDet; // valeurs des determinants
  • COMPLEX **mat;
  • int k,x,y;
  • COMPLEX conjw;
  • len = alignedPower2(1 + n);
  • res = CreatePolynomial(len - 1);
  • arrayDet = Malloc(COMPLEX,len);
  • mat = CreateMat(n);
  • // on copie la matrice
  • for(y=0;y<n;y++)
  • {
  • for(x=0;x<n;x++)
  • {
  • mat[y][x].re = _mat[y][x].re;
  • mat[y][x].im = _mat[y][x].im;
  • }
  • }
  • // on evalue le polynome aux racines <len>-eme de l'unite
  • for(k=0;k<len;k++)
  • {
  • COMPLEX w;
  • int i;
  • GetNthRootUnitComplex(&w,k,len);
  • for(i=0;i<n;i++)
  • {
  • SubComplex(&mat[i][i],&_mat[i][i],&w);
  • }
  • // calcul P(w) dans <arrayDet + k>
  • Det(mat,n,arrayDet + k);
  • }
  • // on effectue une FFT pour retrouver les coefficients du polynome
  • // a partir de ses valeurs en certains points
  • GetNthRootUnitComplex(&conjw,-1,len);
  • polyFFT(res->coeff,arrayDet,1,len,&conjw);
  • CalcDeg(res);
  • for(k=0;k<=res->deg;k++)
  • {
  • res->coeff[k].re /= len;
  • res->coeff[k].im /= len;
  • }
  • Free(arrayDet);
  • DeleteMat(mat,n);
  • return res;
  • } // Pc()
//-------------------------------------------------
// DET
//-------------------------------------------------
// calcul d'un determinant avec le pivot de Gauss
// la complexite est en n^3
COMPLEX *Det(COMPLEX **_mat,int n,COMPLEX *res)
{
COMPLEX **mat;
COMPLEX   det;
int       x,y;
int       i,j;

mat = CreateMat(n);
for(y=0;y<n;y++)
  {
  for(x=0;x<n;x++)
    {
    mat[y][x].re = _mat[y][x].re;
    mat[y][x].im = _mat[y][x].im;
    }
  }

det.re = 1.;
det.im = 0.;

for(j=0;j<n-1;j++)
  {

  int       rankMax,rank;
  COMPLEX   coeffMax;

  // ( etape 1 )
  rankMax = j;
  for(rank=j+1;rank<n;rank++)
    {
    if(AbsComplex(&mat[rankMax][j]) < AbsComplex(&mat[rank][j]))
      {
      rankMax = rank;
      }
    }

  coeffMax.re = mat[rankMax][j].re;
  coeffMax.im = mat[rankMax][j].im;
  if(AbsComplex(&coeffMax) <= MATH_EPSILON)
    {
    det.re = 0.;
    det.im = 0.;
    goto label_end;
    }
  // ( etape 2 )
  if(rankMax != j)
    {
    for(i=j;i<n;i++)
      {
      COMPLEX tmp;
      tmp             = mat[j][i];
      mat[j][i]       = mat[rankMax][i];
      mat[rankMax][i] = tmp;
      }
    det.re *= -1.;
    det.im *= -1.;
    }

  MulComplex(&det,&det,&coeffMax);
  // ( etape 3 )
  for(rank=j+1;rank<n;rank++)
    {
    COMPLEX coeff;
    DivComplex(&coeff,&mat[rank][j],&coeffMax);
    for(i=j;i<n;i++)
      {
      COMPLEX mul;
      MulComplex(&mul,&coeff,&mat[j][i]);
      SubComplex(&mat[rank][i],&mat[rank][i],&mul);
      }
    }
    
  }

MulComplex(&det,&det,&mat[n-1][n-1]);

label_end:
DeleteMat(mat,n);
*res = det;
return res;
} // Det()


//-------------------------------------------------
// POLY_FFT
//-------------------------------------------------
// on decompose le polynome P = A0 + B0 avec les coefficients 
// de degres pairs (en A0) et impairs (en B0)
// alors on a :
// P(w) = A0(w)   +   B0(w)
//      = A(w^2)  + w.B(w^2)
// or w^2 est une racine nieme, donc on se ramene a un cas
// de taille deux fois moins grand
void polyFFT(
              P_COMPLEX     res,
              P_COMPLEX     arrayCoeff,
              int           stepi,
              int           n,
              P_COMPLEX     w
            )
{
  
if(1 == n)
  {
  // P(z)=constante
  res->re = arrayCoeff->re;
  res->im = arrayCoeff->im;
  }
else
  {
  int     k;
  COMPLEX w2,wPowk;


  // strategie diviser pour regner

  // calcul du carre de <w>
  MulComplex(&w2,w,w);
  // appel recursif
  polyFFT(res      ,arrayCoeff         ,2*stepi,n/2,&w2); // coefficients pairs
  polyFFT(res + n/2,arrayCoeff + stepi ,2*stepi,n/2,&w2); // coefficients impairs

  // on calcule la FFT a partir de ce que l'on vient de calculer
  wPowk.re = 1.;
  wPowk.im = 0.;
  for(k=0;k<n/2;k++)
    {
    COMPLEX A,B;

    A = res[k];
    B = res[k + n/2];
    MulComplex(&B,&B,&wPowk);

    AddComplex(res + k      ,&A,&B);
    SubComplex(res + k + n/2,&A,&B);

    MulComplex(&wPowk,&wPowk,w);
    }
  }
} // polyFFT()


//-------------------------------------------------
// PC
//-------------------------------------------------
// 
// calcul du polynome caracteristique
// Pc(M)(x) = det(M - x.I)
// 
P_POLYNOMIAL Pc(COMPLEX **_mat,int n)
{
int             len;        // aligne sur une puissance de 2
P_POLYNOMIAL    res;        // le polynome caracteristique
COMPLEX        *arrayDet;   // valeurs des determinants
COMPLEX       **mat;
int             k,x,y;
COMPLEX         conjw;

len       = alignedPower2(1 + n);
res       = CreatePolynomial(len - 1);
arrayDet  = Malloc(COMPLEX,len);
mat       = CreateMat(n);

// on copie la matrice
for(y=0;y<n;y++)
  {
  for(x=0;x<n;x++)
    {
    mat[y][x].re = _mat[y][x].re;
    mat[y][x].im = _mat[y][x].im;
    }
  }

// on evalue le polynome aux racines <len>-eme de l'unite
for(k=0;k<len;k++)
  {
  COMPLEX w;
  int     i;

  GetNthRootUnitComplex(&w,k,len);
  for(i=0;i<n;i++)
    {
    SubComplex(&mat[i][i],&_mat[i][i],&w);
    }
  // calcul P(w) dans <arrayDet + k>
  Det(mat,n,arrayDet + k);
  }

// on effectue une FFT pour retrouver les coefficients du polynome
// a partir de ses valeurs en certains points
GetNthRootUnitComplex(&conjw,-1,len);
polyFFT(res->coeff,arrayDet,1,len,&conjw);
CalcDeg(res);
for(k=0;k<=res->deg;k++)
  {
  res->coeff[k].re /= len;
  res->coeff[k].im /= len;
  }

Free(arrayDet);
DeleteMat(mat,n);
return res;
} // Pc()




 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture COLORATION SYNTAXIQUE
Source avec Zip Source avec une capture ORBITES DES SATELLITES GPS
Source avec Zip Source avec une capture DESSIN D'ARBRES
Source avec Zip Source avec une capture PROGRAMMATION LINEAIRE
Source avec Zip EXTENSION DE CORPS (MATH)

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture HDR EXPOSURE FUSION par mecrosoft
Source avec Zip Source avec une capture CLASS MATRICE C++ par elkasimi2007
CALCULER LE PRODUIT DE DEUX MATRICES DE TAILLE DIFFERENT par aymenet1
CALCUL DE DETERMINANT D'UNE MATRICE par hasnaoui_karim

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Problème pour dériver une classe [ par arc59 ] J'ai créé une classe Matrice comportant des fonctions get_ele, set_ele (toutes les 2 sont "virtual") et la redéfinition de l'opérateur +.Dans ma class Reconnaissance de chaine [ par Xs ] vala, j'ai ecrit dans un fichier a l'aide d'un prog les lignes suivantes :Manu Chao [poxima estacion : esperanza]eh bien je voudrai qu'il lise cette c fichier.h [ par bidules ] Bonjour,j'aimerais savoir s'il est possible de mettre des structures dans un fichier d'entete.Car j'ai fais l'essai mais lors de la compilation pour c PB de matrice [ par limax84 ] J'ai un probleme d'allocation dynamique de memoire pour une matrice.pour un tableau, je procede comme ceci:int * t;t = new int [30];mais pour une matr matrice carréé [ par justeroland ] j'ai besoin de l'aide au sujet de l'exercice suivant: une matrice carré est dite balancée si les sommes des elements de ses quatre triangles sont égal Besoin d'aide en C - Fonction [ par bugs2600 ] Voici mon programme quelqu'un pourrait-il m'aider je dois faire une fonction et je ne vois pas comment la faire le non de ma fonction doit etre PRODMA une matrice de taille quelconque [ par anaisa ] salut tt le monde saurez vous m'aidez à résoudre un petit probleme: je dois programmé la somme, produit de matrices de taille quelconque en langage C Coord 2D to 3D [ par bat67000 ] Comment optenir d'un point 2D sur l'app les coordonnees du point 3D associé avec la matrice de projection ?(je pige pas bien comment fonctionne la mat Matrice constante. [ par nsoualem ] j'ai crée une classe matrice avec un constructeurdu type:matrice(int nbligne,int nbcolonne)...elle marche a merveille!!!Lors de la création d'un code, inverse de matrice dynamique [ par anaisa ] Aidez nous please c pr programmer en langage Votre texte ICIC l inverse de la matrice dynamique merci bcp !!!!!!


Nos sponsors


Sondage...

Comparez les prix

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,811 sec (4)

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