%% syntaxe : M i j any --> depose any dans M en a_ij
/put_ij {
5 dict begin
/a exch def
/j exch def
/i exch def
/M exch def
/L M i get_Li def
L j a put
M i L put_Li
end
} def
%% syntaxe : M i j get_ij --> le coeff c_ij
/get_ij {
3 1 roll %% j M i
get_Li %% j L_i
exch get
} def
%% syntaxe : M i L put_Li --> remplace dans M la ligne Li par L
/put_Li {
put
} def
%% syntaxe : M i get_Li --> la ligne Li de M
/get_Li {
get
} def
%% syntaxe : M i --> depose sur la pile la colonne d'indice i de M
/get_Ci {
4 dict begin
/j exch def
/M exch def
M dimmatrix pop /m exch def
/i 0 def
[
m {
M i j get_ij
/i i 1 add store
} repeat
]
end
} def
%% syntaxe : M i j exch_l --> echange les lignes i et j
/exch_L {
3 dict begin
/j exch def
/i exch def
/M exch def
M i get_Li
M i
M j get_Li
put_Li
M j 3 -1 roll
put_Li
end
} def
%% syntaxe : B M i j elimine_coeff --> remplace la ligne j par Lj - (a_ji/a_ii) Li
%% et applique la meme transformation au vecteur colonne B
/elimine_coeff {
4 dict begin
/j exch def
/i exch def
/M exch def
/B exch def
%% le coeff
M j i get_ij
M i i get_ij
div neg
/k exch def
B j
B j get
B i get k mul add
put
M j
M i get_Li {k mul} apply
M j get_Li
{add} fuzapply
put_Li
end
} def
%% syntaxe : B M i echelonne --> echelonne avec le coeff a_ii les lignes Li+1 .. Ln
/echelonne {
4 dict begin
/i exch def
/M exch def
/B exch def
/j i 1 add def
M length 1 sub i sub {
B M i j elimine_coeff
/j j 1 add store
} repeat
end
} def
%% syntaxe : B A pivot_gauss --> A est echelonne
%% ATTENTION : il est suppose que A s'echelonne "bien" (determinant non nul)
/pivot_gauss {
4 dict begin
/A exch def
/B exch def
/i 0 def
A length 1 sub {
A i i get_ij 0 ne %% si a_ii <> 0
{B A i echelonne} %% on echelonne
{ %% sinon on recherche j tq a_ji <> 0
/j i 1 add def
{
A j i get_ij
0 ne
{ %% on a trouve
A i j exch_L %% on echange les lignes Li et Lj
B i get %% idem pour B
B i
B j get put
B j 3 -1 roll put
B A i echelonne %% puis on echelonne
exit %% et on sort de la boucle
}
{ %% on a pas trouve
/j j 1 add store %% on voit la suite
}
ifelse
} loop
}
ifelse
/i i 1 add store %% colonne suivante
} repeat
end
} def
%% B A 0 echelonne
%% B A 1 echelonne
%% B A 0 1 elimine_coeff
%% B A 0 2 elimine_coeff
%% syntaxe : B A solve_trig --> X ou A est une matrice carre
%% triangulaire superieure et X est l'unique vecteur solution de AX = B
/solve_triang {
6 dict begin
/A exch def
/B exch def
/N A length def
/sols N array def
/i N 1 sub def
N {
%% la solution x_i
/j i 1 add def
sols i
B i get
N 1 sub i sub {
A i j get_ij
sols j get
mul sub
/j j 1 add store
} repeat
A i dup get_ij div
put
/i i 1 sub store
} repeat
sols
end
} def
%% syntaxe : B A solve_syst --> X ou A est une matrice carre
%% de determinant non nul
/solve_syst {
2 dict begin
/A exch def
/B exch def
B A pivot_gauss
B A solve_triang
end
} def
%% syntaxe : M view_square_matrix --> depose les coeffs de la matrice carree M sur la pile
/view_square_matrix {
2 dict begin
/M exch def
/i 0 def
(matrix)
M length {
M i get
aload pop ()
/i i 1 add store
} repeat
(fin matrix)
} def
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|