Mathc matrices/c11an
Installer et compiler ces fichiers dans votre répertoire de travail.
c0an.c |
---|
/* ------------------------------------ */
/* Save as : c0an.c */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
void fun(int r)
{
double **A = rsymmetric_mR(i_mR(r,r),999.);
double **EigsVector= i_mR(r,r);
double **EigsValue = i_mR(r,C1);
clrscrn();
printf(" Copy/Past into the octave windows \n\n");
p_Octave_mR(A,"a",P0);
printf(" [V, E] = eigs (a,10) \n\n");
stop();
clrscrn();
eigs_V_mR(A,EigsVector);
printf(" EigsVector:");
p_mR(EigsVector,S5,P6,C6);
eigs_mR(A,EigsValue);
printf(" EigsValue :");
p_mR(EigsValue,S13,P6,C1);
f_mR(A);
f_mR(EigsVector);
f_mR(EigsValue);
}
/* ------------------------------------ */
int main(void)
{
time_t t;
srand(time(&t));
do
{
fun(rp_I(R4)+R2);
} while(stop_w());
return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */
Je veux calculer les valeurs propres de la matrice M.
- J'utilise la QR décomposition de M
- Puis je calcule RQ
- RQ devient la nouvelle valeur de M
- Et je recommence un cycle.
Je copie M dans T pour ne pas modifier M. Puis j'applique 1000 fois l'algorithme vue plus haut.
c_mR(M,T);
for(i=0;i<1000;i++)
{
QR_mR(T,Q,R);
mul_mR(R,Q,T);
}
À la fin je trouve sur la diagonale de T les valeurs propres.
for(rc=R1;rc<=r;rc++)
{
EigsValue[rc][C1] = T[rc][rc];
}
Exemple de sortie écran :
/* ------------------------------------ */
Copy/Past into the octave windows
a=[
-445,-853,+194;
-853,-911,-921;
+194,-921,-977]
[V, E] = eigs (a,10)
Press return to continue.
/* ------------------------------------ */
EignVector:
+0.326731 +0.713242 -0.620106
+0.738677 +0.216582 +0.638317
+0.589579 -0.666616 -0.456091
EigsValue :
-2023.400085
-885.338473
+575.738557
Press return to continue
Press X to stop