* fichier : tens2.dgibi ************************************************************************ ************************************************************************ ************************************************************************ * NOM : TENS2 * DESCRIPTION : Test de la décomposition principale, en particulier * les valeurs propres et la recomposition. * On teste les cas où les valeurs propres sont proches. * TENS PRIN et TENS RECO * D'autres options de TENS sont egalement testees * 'INVE' 'DET' pour les matrices de rotation * (orthonormales non symetriques) * * LANGAGE : GIBIANE-CAST3M * AUTEUR : Stephane GOUNAND (CEA/DES/ISAS/DM2S/SEMT/LTA) * mel : stephane.gounand@cea.fr ********************************************************************** * VERSION : v1, 09/10/2025, version initiale * HISTORIQUE : v1, 09/10/2025, création * HISTORIQUE : * HISTORIQUE : ************************************************************************ * interact=faux ; * * Test si les vecteurs propres sont bien des vecteurs propres * 'DEBP' tvectp ; lok = vrai ; amax = 'TENS' 'NORMINF' tensym ; tol = amax '*' tolrel ; * Passage CHPOINT -> TABLE Tenseur symetrique 'REPE' ii vdim ; i = &ii ; 'REPE' ij i ; j = &ij ; 'SI' ('NEG' i j); ttens . j . i = ttens . i . j ; 'FINS' ; 'FIN' ij ; 'FIN' ii ; * Passage CHPOINT -> TABLE Vecteurs propres 'REPE' ii vdim ; i = &ii ; 'REPE' ij vdim ; j = &ij ; 'FIN' ij ; 'FIN' ii ; * Passage CHPOINT -> TABLE Valeurs propres 'REPE' ii vdim ; i = &ii ; 'FIN' ii ; * Verif Vecteurs propres 'REPE' ii vdim ; i = &ii ; 'REPE' ij vdim ; j = &ij ; 'REPE' ik vdim ; k = &ik ; 'SI' ('EGA' j k) ; inc = '*' ('-' ttens . k . j tvalp . i) tvecp . i . k ; 'SINO' ; inc = '*' ttens . k . j tvecp . i . k ; 'FINS' ; chprod = chprod '+' inc ; 'FIN' ik ; tprod . i . j = chprod ; 'FIN' ij ; 'FIN' ii ; 'REPE' ii vdim ; i = &ii ; 'REPE' ij vdim ; j= &ij ; chprod = tprod . i . j ; tnprod = '>' nprod 0. ; lok = lok 'ET' tnprod ; 'SI' ('NON' tnprod) ; * 'MESS' 'par sa composante j=' j ' dont la norme' ' ' nprod ' >' ' ' tol ; 'FINS' ; 'FIN' ij ; 'FIN' ii ; 'FINP' lok ; * * Test si les colonnes d'une matrice sont bien orthonormales * (matrice de rotation et matrice de vecteurs propres) * 'DEBP' ttensrot ; lok = vrai ; * Identite rott1 = 'TENS' 'IDEN' rottot ; drott1 = '-' rott1 rottot ; ndrott1 = 'TENS' drott1 'NORMINF' ; tdrott1 = '<' nndrott1 tol ; lok = lok 'ET' tdrott1 ; * Determinant unite drott2 = '-' ('TENS' 'DET' rottot) 1. ; tdrott2 = '<' nndrott2 tol ; lok = lok 'ET' tdrott2 ; * Verif orthonormalite 'REPE' ii vdim ; i = &ii ; 'REPE' ij vdim ; j = &ij ; 'FIN' ij ; 'FIN' ii ; * Pscal des colonnes de trot 'REPE' ij vdim ; j = &ij ; 'REPE' ik vdim ; k = &ik ; 'REPE' ii vdim ; i = &ii ; pjk = pjk '+' (trot . i . j '*' trot . i . k) ; 'FIN' ii ; tpsca . j . k = pjk ; 'FIN' ik ; 'FIN' ij ; * Verif trot orthonormale 'REPE' ij vdim ; j = &ij ; 'REPE' ik vdim ; k = &ik ; 'SI' ('EGA' j k) ; dpsca = (tpsca . j . k) '-' 1.d0 ; 'SINO' ; dpsca = tpsca . j . k ; 'FINS' ; tdpsca = '<' ddpsca tol ; lok = lok 'ET' tdpsca ; 'SI' ('NON' tdpsca) ; 'FINS' ; 'FIN' ik ; 'FIN' ij ; * Transpose = inverse trottot = 'TENS' 'TRANS' rottot ; drott3 = '-' trottot irottot ; ndrott3 = 'TENS' drott3 'NORMINF' ; tdrott3 = '<' nndrott3 tol ; lok = lok 'ET' tdrott3 ; * Inverse correcte 'REPE' ii vdim ; i = &ii ; 'REPE' ij vdim ; j = &ij ; 'FIN' ij ; 'FIN' ii ; * Produit *tprod = 'TABL' ; 'REPE' ij vdim ; j = &ij ; * tprod . j = 'TABL' ; 'REPE' ik vdim ; k = &ik ; 'REPE' ii vdim ; i = &ii ; gjk = gjk '+' (trot . j . i '*' trot . i . k) ; 'FIN' ii ; * tprod . j .k = gjk ; 'SI' ('EGA' j k) ; vref = 1. ; 'SINO' ; vref = 0. ; 'FINS' ; drott4 = '-' gjk vref ; tdrott4 = '<' nndrott4 tol ; lok = lok 'ET' tdrott4 ; 'SI' ('NON' tdrott4) ; 'MESS' '!!! M*M^-1 non unite' ' j=' j ' k =' k ' ' nndrott4 ' >' ' ' tol ; 'FINS' ; 'FIN' ik ; 'FIN' ij ; 'FINP' lok ; * lok = vrai ; * tol = '*' pre 10. ; tolrot = '*' pre 10. ; tolvecp = '*' pre 30. ; tolrec3d = '*' pre 30. ; * * nx = 100000 ; *nx = 3000000 ; *nx = 1 ; * Scaling global des termes de la matrice epsg = 'EXP' puig ; * ltens = ttensrot v1 tolrot ; lok = lok 'ET' ltens ; 'SI' ('NON' ltens) ; 'MESS' '!!! Test tenseur de rotation not ok' ; 'SINO' ; 'MESS' 'Test tenseur de rotation OK' ; 'FINS' ; dec = d1 'ET' v1 ; * * * Décomposition spectrale * ltens = ttensrot decc tolrot ; lok = lok 'ET' ltens ; 'SI' ('NON' ltens) ; 'MESS' '!!! Test vecteurs propres orthonormaux not ok' ; 'SINO' ; 'MESS' 'Test vecteurs propres orthonormaux OK' ; 'FINS' ; lvect = tvectp cha decb tolvecp ; 'SI' ('NON' lvect) ; 'MESS' '!!! Test vecteurs propres not ok' ; 'SINO' ; 'MESS' 'Test vecteurs propres OK' ; 'FINS' ; * * Test valeur propre tdd1 = '<' dd1 tol ; lok = lok 'ET' tdd1 ; * Test recomposition matrice dcha = '-' chab cha ; tdcha = '<' ndcha tol ; lok = lok 'ET' tdcha ; * *'ERRE' stop ; * * 'REPE' iikas 2 ; ikas = &iikas ; * Scaling global des termes de la matrice epsg = 'EXP' puig ; * Valeurs propres distinctes 'SI' ('EGA' ikas 1) ; 'MESS' 'Valeurs propres distinctes' ; 'FINS' ; * Valeurs propres proches 'SI' ('EGA' ikas 2) ; 'MESS' 'Valeurs propres proches' ; eps = 'EXP' puin ; 'FINS' ; * Les plus grandes valeurs dans d1, les plus petites dans d2 m2 = '-' 1. m1 ; d1 = ('*' vp1 m1) '+' ('*' vp2 m2) ; d2 = ('*' vp1 m2) '+' ('*' vp2 m1) ; * ca = 'COS' ang ; sa = 'SIN' ang ; msa = sa '*' -1. ; * rottot = rot11 'ET' rot21 'ET' rot12 'ET' rot22 ; * Vérif tenseur de rotation ltens = ttensrot rottot tolrot ; lok = lok 'ET' ltens ; 'SI' ('NON' ltens) ; 'MESS' '!!! Test tenseur de rotation not ok' ; 'SINO' ; 'MESS' 'Test tenseur de rotation OK' ; 'FINS' ; vprot = d1 'ET' d2 'ET' rottot ; * 'REPE' ij vdim ; j = &ij ; 'REPE' ik j ; k = &ik ; 'REPE' ii vdim ; i = &ii ; gjk = gjk '+' (qji '*' li '*' qik) ; 'FIN' ii ; cha = cha 'ET' gjk ; 'FIN' ik ; 'FIN' ij ; * * Décomposition spectrale * ltens = ttensrot decc tolrot ; lok = lok 'ET' ltens ; 'SI' ('NON' ltens) ; 'MESS' '!!! Test vecteurs propres orthonormaux not ok' ; 'SINO' ; 'MESS' 'Test vecteurs propres orthonormaux OK' ; 'FINS' ; lvect = tvectp cha decb tolvecp ; 'SI' ('NON' lvect) ; 'MESS' '!!! Test vecteurs propres not ok' ; 'SINO' ; 'MESS' 'Test vecteurs propres OK' ; 'FINS' ; * * Test valeurs propres tdd1 = '>' mmdd1 0. ; lok = lok 'ET' tdd1 ; tdd2 = '>' mmdd2 0. ; lok = lok 'ET' tdd2 ; * Test recomposition matrice dcha = 'TENS' 'NORMINF' ('-' chab cha) ; tdcha = '>' mmdcha 0. ; lok = lok 'ET' tdcha ; 'FIN' iikas ; * * * * 'REPE' iikas 3 ; ikas = &iikas ; * Scaling global des termes de la matrice epsg = 'EXP' puig ; * 'SI' ('EGA' ikas 1) ; 'MESS' 'Valeurs propres distinctes' ; 'FINS' ; 'SI' ('EGA' ikas 2) ; 'MESS' 'Deux valeurs propres proches' ; eps = 'EXP' puin ; 'FINS' ; 'SI' ('EGA' ikas 3) ; 'MESS' 'Trois valeurs propres proches' ; eps = 'EXP' puin ; 'FINS' ; * Les plus grandes valeurs dans d1, les plus petites dans d3, les autres au milieu * Pour trouver ces formules, on a énuméré les cas et utilisé le fait que le ET logique est la multiplication * Plus grandes valeurs d1vp1 = m12 '*' m13 ; d1vp2 = m21 '*' m23 ; d1vp3 = m31 '*' m32 ; * Plus petites valeurs d3vp1 = m21 '*' m31 ; d3vp2 = m12 '*' m32 ; d3vp3 = m13 '*' m23 ; * d2vp1 = 1. '-' (d1vp1 '+' d3vp1) ; d2vp2 = 1. '-' (d1vp2 '+' d3vp2) ; d2vp3 = 1. '-' (d1vp3 '+' d3vp3) ; * d1 = ('*' d1vp1 vp1) '+' ('*' d1vp2 vp2) '+' ('*' d1vp3 vp3) ; d2 = ('*' d2vp1 vp1) '+' ('*' d2vp2 vp2) '+' ('*' d2vp3 vp3) ; d3 = ('*' d3vp1 vp1) '+' ('*' d3vp2 vp2) '+' ('*' d3vp3 vp3) ; * * Génération d'une matrice de rotation quelconque * Algo III.4 Graphics Gems III par James Arvo (1995) * * Rotation autour de l'axe z ct = 'COS' theta ; st = 'SIN' theta ; mst = st '*' -1. ; trz . 1 . 1 = ct ; trz . 1 . 2 = st ; trz . 1 . 3 = 0. ; trz . 2 . 1 = mst ; trz . 2 . 2 = ct ; trz . 2 . 3 = 0. ; trz . 3 . 1 = 0. ; trz . 3 . 2 = 0. ; trz . 3 . 3 = 1. ; * Matrice de Householder H = 2 vvt - I cp = 'COS' phi ; sp = 'SIN' phi ; sqz = '**' zed 0.5 ; msqz = '**' (1. '-' zed) 0.5 ; v1 = cp '*' sqz ; v2 = sp '*' sqz ; v3 = msqz ; th . 1 . 1 = 2. '*' v1 '*' v1 '-' 1. ; th . 1 . 2 = 2. '*' v1 '*' v2 ; th . 1 . 3 = 2. '*' v1 '*' v3 ; th . 2 . 1 = th . 1 . 2 ; th . 2 . 2 = 2. '*' v2 '*' v2 '-' 1. ; th . 2 . 3 = 2. '*' v2 '*' v3 ; th . 3 . 1 = th . 1 . 3 ; th . 3 . 2 = th . 2 . 3 ; th . 3 . 3 = 2. '*' v3 '*' v3 '-' 1. ; * Le produit de H et R 'REPE' ij vdim ; j = &ij ; 'REPE' ik vdim ; k = &ik ; 'REPE' ii vdim ; i = &ii ; gjk = gjk '+' (th . j . i '*' trz . i . k) ; 'FIN' ii ; charot = charot 'ET' gjk ; 'FIN' ik ; 'FIN' ij ; * Vérif tenseur de rotation ltens = ttensrot charot tolrot ; lok = lok 'ET' ltens ; 'SI' ('NON' ltens) ; 'MESS' '!!! Test tenseur de rotation not ok' ; 'SINO' ; 'MESS' 'Test tenseur de rotation OK' ; 'FINS' ; vprot = d1 'ET' d2 'ET' d3 'ET' charot ; *dbg mpn6 = 'MANU' 'POI1' ('NOEU' 6) ; *dbg vprot = 'REDU' vprot mpn6 ; *dbg d1 = 'REDU' d1 mpn6 ; *dbg d2 = 'REDU' d2 mpn6 ; *dbg d3 = 'REDU' d3 mpn6 ; * Rotation de la matrice diagonale des vps 'REPE' ij vdim ; j = &ij ; 'REPE' ik j ; k = &ik ; 'REPE' ii vdim ; i = &ii ; gjk = gjk '+' (qji '*' li '*' qik) ; 'FIN' ii ; cha = cha 'ET' gjk ; 'FIN' ik ; 'FIN' ij ; * * Décomposition spectrale * * ltens = ttensrot decc tolrot ; lok = lok 'ET' ltens ; 'SI' ('NON' ltens) ; 'MESS' '!!! Test vecteurs propres orthonormaux not ok' ; 'SINO' ; 'MESS' 'Test vecteurs propres orthonormaux OK' ; 'FINS' ; lvect = tvectp cha decb tolvecp ; 'SI' ('NON' lvect) ; 'MESS' '!!! Test vecteurs propres not ok' ; 'SINO' ; 'MESS' 'Test vecteurs propres OK' ; 'FINS' ; * * Test valeurs propres tdd1 = '>' mmdd1 0. ; lok = lok 'ET' tdd1 ; tdd2 = '>' mmdd2 0. ; lok = lok 'ET' tdd2 ; tdd3 = '>' mmdd3 0. ; lok = lok 'ET' tdd3 ; * Test recomposition matrice tolreco = tolrec3d ; dcha = 'TENS' 'NORMINF' ('-' chab cha) ; tdcha = '>' mmdcha 0. ; lok = lok 'ET' tdcha ; 'FIN' iikas ; * 'SI' ('NON' lok) ; 'MESSAGE' ('CHAINE' 'Il y a eu des erreurs') ; 'ERREUR' 5 ; 'SINON' ; 'MESSAGE' ('CHAINE' 'Tout sest bien passe !') ; 'FINSI' ; * 'SI' interact ; 'OPTION' 'ECHO' 1 'DONN' 5 ; 'FINSI' ; * * End of dgibi file TENS2 * 'FIN' ;
© Cast3M 2003 - Tous droits réservés.
Mentions légales