DD05
Messages postés53Date d'inscriptionmercredi 11 août 2004StatutMembreDernière intervention11 juin 2010
-
26 oct. 2004 à 21:12
rad_issam
Messages postés1Date d'inscriptionsamedi 8 octobre 2005StatutMembreDernière intervention 8 octobre 2005
-
8 oct. 2005 à 05:21
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.
ricky78
Messages postés126Date d'inscriptionjeudi 5 juin 2003StatutMembreDernière intervention11 juillet 2006 27 oct. 2004 à 09:31
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.
//===============================================
// 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+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);
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(...)