Bonjour,
J'essaie avec mes modestes connaissances en programmation LUA d'écrire un script pour la résolution d'un problème particulier par la méthode des différences finies (Finite Differences Method - FDM).
L'application de cette méthode passe par la discrétisation d'un espace, puis la génération d'un système de n équations et n inconnues, donc solvable sous certaines conditions.
J'ai donc le système Ax = b (avec A une matrice nxn, x un vecteur colonne de taille n, et b un vecteur de taille n).
Il existe certes plusieurs outils pour résoudre un tel système, mais je souhaiterais implémenter de moi-même un algorithme de résolution. Après quelques recherches, je suis tombé sur la Méthode de la surrelaxation, SOR.
J'ai produit le script LUA suivant, qui a l'air de marcher, mais...
Ci-joint au message, j'ai composé une image qui synthétise tout ce que je pose comme soucis par la suite...Cela permettra sans nul doute de voir plus clair dans mes élucubrations...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 --Fonction évaluant la norme d'un vecteur function Norm(m) local n = 0 for i,v in ipairs(m) do n = n + v^2 end return math.sqrt(n) end --Système à résoudre local A = { {4,2,-4,0,2,4,0,0,0}, {2,2,-1,-2,1,3,2,0,-6}, {-4,-1,14,1,-8,-3,5,6,20}, {0,-2,1,6,-1,-4,-3,3,23}, {2,1,-8,-1,22,4,-10,-3,9}, {4,3,-3,-4,4,11,1,-4,-22}, {0,2,5,-3,-10,1,14,2,-15}, {0,0,6,3,-3,-4,2,19,45} } local p,q,ACCURRACY=0,0,1E-4 local w=1.86 --paramètre de relaxation local n = table.getn(A) --taille du système local MAX = 10000 --nombre maximal d'itérations local t = MAX local x = {} for k = 1,n do x[k]=0 end --vecteur solution. --Processus itératif repeat t=t-1 q = Norm(x) for i=1,n do local sigma = 0 for j=1,i-1 do sigma = sigma+A[i][j]*x[j] end for j=i+1,n do sigma = sigma+A[i][j]*x[j] end x[i] = ((1-w)*x[i])+((w/A[i][i])*(A[i][n+1]-sigma)) end p = Norm(x) until ((math.abs(p-q)<ACCURRACY) or (t==0)) --Affichage du vecteur X obtenu en sortie for k,v in ipairs(x) do print(k,v) end
Alors...Voila..Avec le système défini dans le code, le résultat est vite obtenu...Avec d'autres systèmes, ça a l'air de toujours marcher...Sauf que pour un même système d'équations, je remarque que l'algorithme ne marche plus dès que je permute deux lignes...Pourtant , c'est bien le même système...!
Et aussi, chose étrange...Je remarque que lorsque les solutions du système sont des valeurs entières, l'algorithme n'a pas l'air de marcher.Pourtant, SOR est définie comme une méthode de résolution d'un système, sans restriction..Alors ça devrait fonctionner, quelque soit le cas...
Je suis donc persuadé que le problème vient de moi (mauvais code, ou mauvaise interprétation), et je m'en remets aux experts pour me guider vers une solution...
Merci!
Partager