Accueil

Annexe 3

Sous-Programme Visual Basic de Régression Multiple

 

Public Sub RGRS_MULT(XYZ(), Coef())
'XYZ(3,200) arguments d'entrée :
' - XYZ(1,0) nombre de points à traiter, largement supérieur au degré du polynôme
' - XYZ(2,0) degré du polynôme de régression multiple ( 1 à 10 )

' - XYZ(1,I) abscisse du point I
' - XYZ(2,I) ordonnée du point I
' - XYZ(3,I) élévation du point I

'Coef() arguments de sortie :
' -Coef() contient les coefficients du polynôme de régression multiple par ordre croissant :
'  
Coef(Constante), Coef(Y), Coef(X), Coef(Y²), Coef(XY), Coef(X²), ...

ReDim A(150, 150), B(150, 150), C(150, 300), Mat_Ligne(150)
ReDim Exp_X(150, 150), Exp_Y(150, 150), Exp_XZ(150), Exp_YZ(150)

N_Pt = XYZ(1, 0)
Deg = XYZ(2, 0)

'Calcul des dimensions de la matrice
Dim_Mat = (Deg + 1) * (Deg + 2) / 2

'Calcul des deux suites d'exposants :
' 0 0 1 0 1 2 0 1 2 3 pour X et 0 1 0 2 1 0 3 2 1 0 pour Y , correspondants aux termes :
' Constante , Y, X , Y^2 , YX , X^2, Y^3 , Y2X , YX^2, X^3, ...

K = 0
For I = 0 To Deg
  For J = 0 To I
    Exp_I(K) = J
    Exp_J(K) = I - J
    K = K + 1
  Next J
Next I

'Remplissage de la matrice carrée
For I = 1 To Dim_Mat
  For J = 1 To Dim_Mat
    Som = 0
    For K = 1 To N_Pt
      Som = Som + XYZ(1, K) ^ (Exp_I(Dim_Mat - J) + Exp_I(Dim_Mat - I)) * XYZ(2, K) ^ (Exp_J(Dim_Mat - J) + Exp_J(Dim_Mat - I))
    Next K
    A(I, J) = Som
  Next J
Next I

'Remplissage de la matrice ligne
For I = 1 To Dim_Mat
  Som = 0
  For K = 1 To N_Pt
    Som = Som + XYZ(1, K) ^ Exp_I(Dim_Mat - I) * XYZ(2, K) ^ Exp_J(Dim_Mat - I) * XYZ(3, K)
  Next K
  Mat_Ligne(I) = Som
Next I

'Inversion de la matrice
For I = 1 To Dim_Mat
  For J = 1 To Dim_Mat
    B(I, J) = A(I, J)
  Next J
  For J = Dim_Mat + 1 To 2 * Dim_Mat
    B(I, J) = 0
  Next J
  B(I, I + Dim_Mat) = 1
Next I
For K = 1 To Dim_Mat
  For J = 1 To 2 * Dim_Mat
    C(K, J) = B(K, J) / B(K, K)
  Next J
  For I = 1 To Dim_Mat
    If K <> I Then
      For J = 1 To 2 * Dim_Mat
         C(I, J) = B(I, J) - B(I, K) * C(K, J)
      Next J
    End If
  Next I
  For I = 1 To Dim_Mat
    For J = 1 To 2 * Dim_Mat
      B(I, J) = C(I, J)
    Next J
  Next I
Next K

'Calcul du polynôme par multiplication des deux matrices
For I = 1 To Dim_Mat
  Som = 0
  For J = 1 To Dim_Mat
    Som = Som + B(I, J + Dim_Mat) * Mat_Ligne(J)
  Next J
  Coef(Dim_Mat + 1 - I) = Som
Next I
End Sub