Zipo Ours bipolaire | ah nan ça marche juste pour mes matrices 2x2
Voilà en gros le bout de code, je vous copie pas les fonctions de manipulation de complexes mais en gros dans un autre module ya :
c_add(complexe, complexe);
c_sub(complexe, complexe);
c_mul(complexe, complexe);
c_div(complexe, complexe);
et le type complexe est composé d'un champ double re et d'un champ double im
Code :
- complexe *get_eig2D(...bla bla...){
- double R, S;
- complexe A[2][2], delta, Z1, Z2, *D,
- zero={0, 0}, deux={2, 0}, quatre={4, 0};
- //blabla... remplissage de la matrice A
- // delta = (a+d)²-4(ad-bc)
- delta = c_sub(c_mul(c_add(A[0][0], A[1][1]), c_add(A[0][0], A[1][1])),
- c_mul(quatre, c_sub(c_mul(A[0][0], A[1][1]), c_mul(A[0][1], A[1][0])))
- );
- // R = +-sqrt( (re(delta)+|delta|)/2 )
- // S = +-sqrt( -(re(delta)-|delta|)/2 )
- R = sqrt((delta.re + sqrt(delta.re*delta.re + delta.im*delta.im))/2);
- S = sqrt(fabs((delta.re - sqrt(delta.re*delta.re + delta.im*delta.im))/2));
- if(delta.im > 0){
- Z1.re = R; Z1.im = S;
- Z2.re = -R; Z2.im = -S;
- }else{
- Z1.re = R; Z1.im = -S;
- Z2.re = -R; Z2.im = S;
- }
- //Eigenvalues are ((a+d)+Z1)/2 and ((a+d)+Z2)/2
- D=(complexe *)malloc(sizeof(complexe)*2);
- D[0] = c_div(deux ,c_add(c_add(A[0][0], A[1][1]), Z1));
- D[1] = c_div(deux ,c_add(c_add(A[0][0], A[1][1]), Z2));
- return D;
- }
|
|