begin process at 2012 05 28 07:08:16
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Maths & Algorithmes

 > 

Algorithme résolution système linéaire


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

Algorithme résolution système linéaire

mardi 26 octobre 2004 à 21:12:10 | Algorithme résolution système linéaire

DD05

Bonjour à tous,

Je recherche un algorithme de résolution direct me permettant de résoudre un système linéaire AX=B avec A symétrique, de largeur de bande connue.
A est n'est pas stocké dans un tableau de taille N*N mais je stocke uniquement les termes du triangle supérieur de la matrice dans un tableau de taille N*LB. LB est la largeur de bande de ma matrice. Ceci me permet de gagner énormément de mémoire vive.

Merci à celui ou celle qui pourrait m'aider.

DD

mercredi 27 octobre 2004 à 09:31:43 | Re : Algorithme résolution système linéaire

ricky78

bonjour DD05

Tu peux essayer de t'inspirer du code suivant en l'adaptant pour des matrices reelle ou l'utiliser directement en mettant la partie complexe à 0. Par contre il faut que tu modifie la forme de ta matrice qui ne peut rester triangulaire en utilisant directement ce code ou si tu veut la laisser triangulaire tu n'auras qu'à modifier le point de départ des boucles pour travailler uniquement avec la triangulaire haute.

cordialement

ricky78


//=========================================
// Division en complexe
// (qr + J*qi) = (ar + J*ai) / (br + J*bi)
// J = sqrt(-1)
//=========================================

void div_complex(float ar, float ai, float br, float bi, float *qr, float *qi)

// qr+J.qi = (ar+J.ai) / (br+J.bi) = (ar+J.ai).(br-J.bi) / (br+J.bi).(br-J.bi)
// = ((ar.br+ai.bi + J.(ai.br-ar.bi)) / (br² + bi²)

{
float m;

m = br*br + bi*bi;
*qr = (ar*br + ai*bi) / m;
*qi = (ai*br - ar*bi) / m;
}


//=========================================
// Multiplication en complexe
// (pr + J*pi) = (ar + J*ai) * (br + J*bi)
// J = sqrt(-1)
//=========================================

void mul_complex(float ar, float ai, float br, float bi, float *pr, float *pi)

// pr+J.pi = (ar+J.ai).(br+J.bi) = (ar.br - ai.bi) + J.(ar.bi + ai.br)

{
*pr = ar*br - ai*bi;
*pi = ar*bi + ai*br;
}

//===============================================
// Resolution d'un systeme d'equations lineaires
// en complexe
// |Y| = |A|.|X| par la methode de Gauss
//===============================================

void resol_equa_lin_complex(int n, float *Ma, float *Mx, float *My)

{
//-----------------------------------------------------
// Ma: matrice carree n*n dans un tableau (WW)*(MM)
// Ma[i, j] (i et j de 1 a n) a pour adresse (i*WW + 2.j)
// Mx[i] (i de 1 a n) a pour adresse (2.i)
// Exemple: MM=6 WW=2*MM=12 n=3
//
// j: 0 1 2 3 4 5
// i=0 - - - - - - - - - - - - i=0 - -
// i=1 - - A a A a A a - - - - i=1 X x
// i=2 - - A a A a A a - - - - i=2 X x
// i=3 - - A a A a A a - - - - i=3 X x
// i=4 - - - - - - - - - - - - i=4 - -
// i=5 - - - - - - - - - - - - i=5 - -
//
// Partie reelle: A X
// Partie imaginaire: a x
//-----------------------------------------------------

int i, j, k, m;
float sr, si, dpr, dpi, dr, di, pr, pi;
//......................................................
// Nota - Pour les commentaires:
// MA(y, x) = Ma[y*WW+2*x] + J*Ma[y*WW+2*x+1]
// MX(x) = Mx[2*x] + J*Mx[2*x+1]
// MY(x) = My[2*x] + J*My[2*x+1] J = sqrt(-1)
//......................................................
for (k = 1; k <= (n-1); k ++)
{
// Calcul de DP = 1 / MA(k, k)
div_complex(1.0, 0.0, Ma[k*WW+2*k], Ma[k*WW+2*k+1], &dpr, &dpi);

for (j = k; j <= n; j ++)
{
// MA(k,j) = MA(k,j).DP
mul_complex(Ma[k*WW+2*j], Ma[k*WW+2*j+1], dpr, dpi,
&Ma[k*WW+2*j], &Ma[k*WW+2*j+1]);
}
// MY(k) = MY(k).DP
mul_complex(My[2*k], My[2*k+1], dpr, dpi, &My[2*k], &My[2*k+1]);

for (j = k+1; j <= n; j ++)
{
// D = MA(j,k)
dr = Ma[j*WW+2*k];
di = Ma[j*WW+2*k+1];
for (m = k; m <= n; m ++)
{
// P = MA(k,m).D
mul_complex(Ma[k*WW+2*m], Ma[k*WW+2*m+1], dr, di, &pr, &pi);

// MA(j,m) = MA(j,m)-P
Ma[j*WW+2*m] -= pr;
Ma[j*WW+2*m+1] -= pi;
}
// P = MY(k).D
mul_complex(My[2*k], My[2*k+1], dr, di, &pr, &pi);

// MY(j) = MY(j)-P
My[2*j] -= pr;
My[2*j+1] -= pi;
}
}

// Solution

// MX(n) = MY(n)/MA(n,n)
div_complex(My[2*n], My[2*n+1], Ma[n*WW+2*n], Ma[n*WW+2*n+1],
&Mx[2*n], &Mx[2*n+1]);

for (i = 1; i <= (n-1); i ++)
{
// S = 0
sr = 0.0;
si = 0.0;
for (j = (n-i+1); j <= n; j ++)
{
// P = MA((n-i),j).MX(j)
mul_complex(Ma[(n-i)*WW+2*j], Ma[(n-i)*WW+2*j+1], Mx[2*j], Mx[2*j+1],
&pr, &pi);

// S = S+P
sr += pr;
si += pi;
}
// MX(n-i) = MY(n-i)-S
Mx[2*(n-i)] = My[2*(n-i)] - sr;
Mx[2*(n-i)+1] = My[2*(n-i)+1] - si;
}
}
// fin de resol_equa_lin_complex(...)
samedi 8 octobre 2005 à 05:21:45 | Re : Algorithme résolution système linéaire


Cette discussion est classée dans : système, résolution, algorithme, largeur, linéaire


Répondre à ce message

Sujets en rapport avec ce message

Résolutions supportées par le système [ par PoFMaN ] bonjour, j'ai commencé à programmer un petit truc en C/openGl, et je me suis dit que ça serai bien de donner le choix de la résolution quand on lance Algorithme de visio conference [ par Timwaz ] Bonjour, Je dois pour un projet présenter un algo de visioconference (système simple). Cela fait suite à un cours de programmation système sous linux la résolution d'équation non linéaire [ par cuminfor ] salut j'ai cherché un programme en builder c++ qui peut résoudre une équation non linéaire avec la méthode des approximations successives avec accélér aide a la programmation résolution système linéaire [ par hadjer02 ] hadjersalem,j'ai le système AX=B avec pour 4 points   : Initiation a la programation " algorithme " [ par trendyboy ] Salut tt le monde, Je suis pas un pro de l'algo pis la j'étais entrin de revizé pour mon exam final et je suis bloké devan deux exercices, je demande Algorithme [ par jeromiodu59 ] Bonjour.Je suis actuellement en prépa MPSI. Je fais mes TIPE sur les codes correcteurs. Je dois faire un algorithme pour jeudi prochain sur ce sujet. implémentation du AES sur les capteurs??? [ par mofdi1 ] Je travaille sur l'implémentation d'algorithme de cryptage AES sur les capteur telosb si quel q'un peux m'aidé a trouvé l'algorithme???? étape de réalisation de système d'exploitation [ par laopatrick ] salut à tous, Commment conçoit-on un systeme d'exploitation graphique ? algorithme de squelettisation en niveau de gris [ par dadou846 ] salut,j'ai besoin d'un programme en c++ qui permet de réaliser la squelettisation d'une image en niveau de gris. j'espère que quelqu'un peut m'aider.m


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

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