1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
fprintf('\n calcul des coefficients C_ijk');
NbRva = 5;
OrdrePol=4;
PsiBaseSize = 0;
for k=0 : OrdrePol
PsiBaseSize= PsiBaseSize + factorielle( NbRva + k -1 )/(factorielle(k)*factorielle(NbRva-1));
end
fprintf ( '(Size= %3.0d)' , PsiBaseSize);
PsiBase= cell(PsiBaseSize,1); % la numérotation de la base commence par 1
PsiBase{1}= zeros([1 NbRva]);
% initialisation
MM= NbRva -1; % NbRva -1 car l'algorithme qui nous permette de générer la séquence alpha
%qui indexe le produit des polynomes d'hermite est equivalent à placer NbRva - 1 boules
%dans NbRva - 1 cases + l'ordre considérer ( ordre courant)
n= 1 ;
t= zeros(1,MM);
% un cas particulier
if (NbRva>0)
switch NbRva
case 1 % le cas d'un pôlynome de dimensio 1 et donc equivalent aux polynomes d'hermites
% on ne travaille plus sur des polynomes multidimentionnels
for i=1: OrdrePol
PsiBase{i+1}(1)= i;
end;
otherwise % pour une dimension plus grande
for OrdreCourant= 1: OrdrePol
FinGenerer = 0; %% pour tester si on a parcouru toutes les possibiltés de placer ces boules
PremierOrdre = 0; %% pour tester si on est sur la liste de départ qui correspond
%%à placer toutes les boules à droite ( les M-1 premières cases)
while(FinGenerer == 0)
n=n+1; %% le cas 1 correspond au polynome constant égale à 1
if ( PremierOrdre ==0) % la premiere liste t pour l'ordre courant
for i=1:MM
t(i)=i; %% on place les MM boules dans les MM premières cases, l'élément t(i)
%% de la liste t contient l'indice de la case où est plcée la ième boule
end;
PremierOrdre= 1;
else
%une incrémétation régulière
% l'almgorithme qui consiste à placer les boules suis
% les règles suivante:
if (t(MM)< (MM+ OrdreCourant)) %% on test si on peut déplacer la boule la plus à droite d'une case à droite.
t(MM)= t(MM)+1; %% on déplace
else
% t(MM) = tmax= MM+ OrdreCourant et donc on ne peut
% pas déplacer
j=MM;
while( t(j)== j + OrdreCourant)%% on cherche la boules la plus à droite qu'on peut déplacer
j=j-1;
end;
t(j)= t(j)+1;%% on la déplace
for k= (j+1):MM %% toutes les boules qui se trouvent à sa droite sont placées dans la case se trouvant à leur gauche
t(k)= t(j) + k-j;
end;
end;
end;
% la transormation de t en PsiBase, pour chaque entier de
% la séquence alpha_i on laisse alpha_i cases vides et on
% place une boule dans la case suivante et réciproquement,
% pour chaque positionnement de boules donc une liste t,
% chaque entier de la séquence est égale au nombre de cases
% vides entre de boules consécutives
PsiBase{n}(1) = t(1)-1;
for i= 2:MM
PsiBase{n}(i) = t(i) - t(i-1) - 1;
end;
PsiBase{n}(NbRva) = NbRva + OrdreCourant -t(MM)- 1;
if (t(1) == (OrdreCourant + 1)) %% toutes les boules sont à gauche, cette condition est clairement nécessaire
%% si toutes les boules sont à droites, elle est suffisante car si elle est verrifié,
%% il n'y a plus de cases vides. en effet, le nombre de cases restantes est
%% exactement le nombre de boules.
FinGenerer = FinGenerer + 1;%% fini de générer pour l'ordre courant
end;
end;
end;
end;
else
disp ( 'le nombre de variables aléatoires doit être supérieur à 0');
end;
PsiNorme= zeros(1,PsiBaseSize);
for k=1:PsiBaseSize
norme=1;
for j = 1 : NbRva
norme = norme*factorielle(PsiBase{k}(j));
end;
PsiNorme(k)= norme;
end;
CC= cell([1,NbRva]);
for i= 1:NbRva
CC{i}= sparse( PsiBaseSize,PsiBaseSize); %% on crée une matrice clairesemée pour optimisder le stockage
end;
for i= 1:NbRva
fprintf('.');
for j= 1:NbRva
for k= 1:NbRva
Psi_k=PsiBase{k};
Psi_j=PsiBase{j};
% on va tester si Psi_j et Psi_k ne diffère que par le ième
% élément
PresqueEgaux=0;
for l= 1:NbRva
if (l~=i)
if (Psi_k(l)~= Psi_j(l))
PresqueEgaux=1;
end;
end;
end;
if (PresqueEgaux==1)
% les deux vecteurs sont très différents
% CC{i}(jk)= 0 ne sont pas stockés
else
% les deux vecteurs ne diffèrent que par leur ième élément
if ( Psi_k(i)==(Psi_j(i)-1) )
CC{i}(j,k)= PsiNorme(j);
elseif ( Psi_k(i)==(Psi_j(i)+1) )
CC{i}(j,k)= PsiNorme(j)*(Psi_j(i)+1);
else
%C_ijk = 0;
end;
end;
end;
end;
end; |
Partager