Forum Liberty Basic France

Projets open source » Système d'équations linéaires - mode console Résolution par la méthode de Gauss-jordan
Visiteur
Le 20/12/2011 à 12h42

Libertynaute Inactif

Groupe: Visiteur



En mode "console" ou "texte".
Résolution d'un système de 10 équations à 10 inconnues en 15 millisecondes
en LB404 ou JB.
GUI en gestation, qui sera plus petit car il faudrait 110 textbox pour cet exemple-ci,
pcq il y a 1 colonne supplémentaire pour les termes indépendants.
La limite autorisée est à 100 textbox.

Code :


'GAUSS-JORDAN_XL - système de 10 équations linéaires et 10 inconnues

'LB404 et JB            20 décembre 2011


'résolution d'un système d'équations linéaires par la méthode
'd'élimination de Gauss-Jordan

[PROBLEME]

'---solutions:  x1 = 1,  x2 =2,  x3 = 3,  x4 = -1,  x5 = -2,
'--- x6 = -3,  x7 = 5, x8 = -10, x9 = 12, x10 = -7


PRINT "Systeme de 10 equations et 10 inconnues:"
PRINT
PRINT "x1   - x2   + 2x3  - x4   + x5    + x6   - x7   + x8     - x9   + x10 = -33"
PRINT
PRINT "3x1  + 2x2  +  x3  + x4   - x5    - x6   + 2x7  - x8  + x9   - 2x10=  60"
PRINT
PRINT "2x1  - 3x2  - 2x3  - 2x4  - 3x5   - 2x6  - 3x7  + 2x8 - 3x9 + 3x10= -88"
PRINT
PRINT "4x1  - x2   - 3x3  + 3x4  + 2x5   + 4x6  + x7   - 2x8 + 3x9 + 4x10=  7"
PRINT
PRINT "-6x1 + 5x2  - x3   + 4x4  - 6x5   - 3x6  - 2x7  + 3x8 + 2x9  - 3x10 =  23"
PRINT
PRINT "-5x1 + x2   + x3   + x4   + x5    + x6   + 3x7  - 3x8 - 2x9  -4x10 =  43"
PRINT
PRINT "x1   + x2   + x3   + x4   + x5    + x6   + 4x7  + 4x8 + 4x9 + x10 =  21"
PRINT
PRINT "-2x1 - 2x2  - 3x3  - 4x4  - 5x5   + 6x6  + 7x7  - 8x8 - 5x9 + x10 =  29"
PRINT
PRINT "x1   +  x2  +  x3  - 2x4  - 2x5   - 2x6  + 3x7  + 3x8 + 3x9 - 2x10 =  53"
PRINT
PRINT"2x1  -  2x2 + 3x3 + 4x4 - 5x5   + 6x6  - 7x7  + 8x8 -  3x9 +2x10 = -170"
PRINT: PRINT

[MATRICE]
'---créer la matrice des n coefficients et des termes indépendants 
'---(en  A(n , n+1) et l'afficher

x = 1
n = 10
DIM A(n+1, n+1)          'pour les coefficients + indépendants

DATA  1,    -1,      2,    -1,     1,     1,   -1,    1,    -1,    1, -33
DATA  3,    2,      1,      1,     -1,   -1,    2,    -1,    1,   -2,  60
DATA  2,    -3,    -2,     -2,    -3,    -2,    -3,    2,   -3,    3,  -88
DATA  4,    -1,    -3,     3,      2,     4,     1,    -2,   3,    4,   7
DATA -6,     5,    -1,     4,     -6,    -3,   -2,     3,    2,   -3,  23
DATA  -5,     1,     1,      1,     1,      1,    3,    -3,  -2,  -4,  43
DATA  1,     1,     1,      1,     1,      1,    4,    4,     4,   1,   21
DATA  -2,   -2,   -3,     -4,    -5,      6,    7,   -8,     -5,   1,   29
DATA  1,     1,     1,     -2,    -2,     -2,     3,    3,    3,  -2,  53
DATA  2,    -2,    3,      4,     -5,     6,    -7,    8,    -3,   2, -170

'--- lecture des données

PRINT "Matrice des coefficients et des termes independants:" : PRINT
FOR i = 1 TO n
FOR j = 1 TO n + 1
    READ m
    A(i, j) = m
    PRINT m,
NEXT j
PRINT: PRINT
NEXT i
PRINT

'---vérifier s'il n'y a pas de zéro sur la diagonale des coefficients,
'--- sinon problème insoluble

flag = 0
FOR i = 1 TO n
   IF A(i,i) = 0 THEN flag = 1
NEXT i
IF flag = 1 THEN
PRINT "Un coefficient diagonal nul, cas insoluble"
GOTO [Fin]
END IF

[CALCUL]

'---Calcul (en 17 instructions)
'---(i  et  k  indices de lignes,  j  indice des colonnes)

t1 = TIME$("ms")

'---réduire chaque pivot diagonal A(i,i)  à 1
'--- en divisant toute la ligne par A(i,i)

FOR i = 1 TO n
            p = A(i, i)          'c'est le "pivot" de Gauss,
                                      'sur la diagonale principale des coefficients
    FOR j = 1 TO n + 1
            q = A(i, j)
            A(i, j) = q / p
        NEXT j

'combiner la ligne i avec toutes les autres lignes (donc sauf si  k = i)
'en soustrayant de la ligne k, la ligne i multipliée par le coefficient de X(i)
' à la ligne k, càd A(k,i) ;
'la ligne i reste intacte.

FOR k = 1 TO n

    p = A(k, i)

    IF k <> i THEN
        FOR j = 1 TO n + 1
                q = A(i, j)
                r = A(k, j)
                A(k, j) = r - p*q
        NEXT j
  END IF
NEXT k

NEXT i

'NB: éviter de diviser ou de multiplier les A(i,j) / A(m,n) ou A(i,j) * A(m,n),
'       résultats aberrants surtout avec des décimales et deux dimensions

t2 = TIME$("ms")

'--- *** Fin du calcul *** --- voyons la matrice-résultat

[MATRCE_RESULTAT]

PRINT "Apres transformation de Gauss-Jordan :" : PRINT

FOR i = 1 TO n
    FOR j= 1 TO n+1
       PRINT A(i, j),
    NEXT j
    PRINT: PRINT
NEXT i

PRINT

[RESULTAT_FINAL]

'---Afficher les valeurs des inconnues      'x(i) = A(i, n+1)
'---Il y a une complication à l'affichage parce que les nombres entiers
'---sont transformés par LB en 'float' en cours de calcul,
'---par les divisions répétées je suppose, et affichent 1.0 au lieu de 1
'---Les corrections meilleures conduisent à des résultats erronés.

PRINT "Solutions des 10 équations à 10 inconnues:"
PRINT
FOR i = 1 TO n
x = A(i, n+1)
x$ = STR$(x)
IF RIGHT$(x$, 2) = ".0" THEN
PRINT "x"; STR$(i); " = ", USING("#####", x)
ELSE
PRINT "x"; STR$(i); " = ", x
END IF
NEXT i
PRINT

PRINT "temps de calcul = "; (t2 - t1); " millisecondes"

'NB: temps de calcul 15 millisecondes sur mon PC très moyen
'       on ne compte pas le temps d'affichage,
'       seulement le temps de calcul

[Fin]
END





Edité par Visiteur Le 20/12/2011 à 16h51
____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Projets open source » Système d'équations linéaires - mode console Résolution par la méthode de Gauss-jordan  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie