IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Comment extraire une matrice 3x3 d'une série de données ?


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Comment extraire une matrice 3x3 d'une série de données ?
    Bonjour à tous
    Je possède six colonnes de N réels. les colonnes X,Y,Z,A,B,C et N>30
    J'ai défini et initialisé deux variables telles que
    XYZ, ABC : array[0..N,0..2] of double (ou tableaux dynamiques)
    Je sais que les valeurs de chaque colonne sont liées entre elles par la relation [A,B,C] = M[X,Y,Z] telle que M est une matrice 3x3
    Comment extraire les coefficients de la matrice M ?
    Matheux à vos claviers et merci d'avance
    Exemple des 15 premières lignes
    X Y Z A B C
    0.0014 0.0000 0.0065 0.0000 0.0000 0.0065
    0.0042 0.0001 0.0201 0.0001 0.0001 0.0201
    0.0143 0.0004 0.0619 0.0010 0.0001 0.0619
    0.0435 0.0012 0.2074 0.0015 0.0010 0.2074
    0.1344 0.0040 0.6456 0.0043 0.0038 0.6456
    0.2839 0.0116 1.3856 0.0096 0.0128 1.3856
    0.3483 0.0230 1.7471 0.0141 0.0282 1.7471
    0.3362 0.0380 1.7721 0.0177 0.0499 1.7721

  2. #2
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    en fait il y a 1 erreur d'eciture M3x3 est défini par


    (a,b,c ) = M * Transposée[(x, y, z ) ]

    M est alors une matrice carrée dont

    la ligne 1 est définie par M11 M12 M13
    la ligne 2 est définie par M21 M22 M23
    la ligne 3 est définie par M31 M32 M33


    chaque ligne du tableau permet d'écrire les 3 équations



    A = M11 * X + M12 * Y + M13 * Z ( a )
    B = M21 * X + M22 * Y + M23 * Z ( b )
    C = M31 * X + M32 * Y + M33 * Z ( c )

    Si on rassemble toutes les équations (a) créé avec les n lignes du tableau de données on obtient 1 système de n équations à 3 inconnues qui n'a de solution que si M existe effectivement
    de même avec les lsituations (b) et (c).

    pour trouver 1 solution à chaque système de n équations, il suffit d'en extraire un système non lié ( determinant <> 0 ) , de calculer alors une solution particulière et de vérifier qu'elle est solution de toutes les n-3 autres lignes.
    Si ce n'est pas le cas, M n'existe pas;
    Si il n'existe pas de sous système de 3 lignes non liés alors il y a une infinités de solutions (dégénérecence 1,2 ou 3 suivant la cas).

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Merci beaucoup
    Ok c'est astucieux, je m'y essaye tout de suite

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    petit correctif il faut bien sur lire



    Transposée[(a,b,c )] = M * Transposée[(x, y, z ) ]

    et non

    (a,b,c ) = M * Transposée[(x, y, z ) ]

    !!

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Encore 1 petit complément.

    Du point de vue math, prendre un système libre de 3 equations le résoudre et vérifier qu'il est solution des des autres équations est OK. Du point de vue calcul numérique il est préférable de résoudres chacun des systèmes n équations à 3 inconnues par moindre carrés et vérifier que le résidu obtenu pour chacune des équations ( théoriquement 0 si M existe ) est en fait numériquement suffisament petit pour êrtre imputé au codage des float, aux erreurs d'arrondis, ... et non à la non existance de M

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut
    Serait-ce trop te demander que de m'écrire un algo sur l'exemple suivant ?
    X Y Z A B C
    0.0014 0.0000 0.0065 0.0000 0.0000 0.0065
    0.0042 0.0001 0.0201 0.0001 0.0001 0.0201
    0.0143 0.0004 0.0619 0.0010 0.0001 0.0619
    0.0435 0.0012 0.2074 0.0015 0.0010 0.2074
    0.1344 0.0040 0.6456 0.0043 0.0038 0.6456
    0.2839 0.0116 1.3856 0.0096 0.0128 1.3856
    0.3483 0.0230 1.7471 0.0141 0.0282 1.7471
    0.3362 0.0380 1.7721 0.0177 0.0499 1.7721
    0.2908 0.0600 1.6692 0.0233 0.0816 1.6692
    0.1954 0.0910 1.2876 0.0375 0.1225 1.2876
    0.0956 0.1390 0.8130 0.0690 0.1802 0.8130
    0.0320 0.2080 0.4651 0.1192 0.2604 0.4651
    0.0049 0.3230 0.2720 0.2031 0.3937 0.2720
    0.0093 0.5030 0.1582 0.3377 0.6005 0.1582
    0.0633 0.7100 0.0782 0.5077 0.8293 0.0782
    0.1655 0.8620 0.0421 0.6551 0.9840 0.0421
    0.2904 0.9540 0.0203 0.7689 1.0632 0.0203
    0.4334 0.9949 0.0087 0.8537 1.0782 0.0087
    0.5945 0.9950 0.0039 0.9169 1.0410 0.0039
    0.7621 0.9520 0.0021 0.9528 0.9516 0.0021
    0.9163 0.8700 0.0017 0.9564 0.8191 0.0017
    1.0263 0.7570 0.0011 0.9214 0.6600 0.0011
    1.0622 0.6310 0.0008 0.8486 0.5027 0.0008
    1.0026 0.5030 0.0003 0.7373 0.3649 0.0003
    0.8544 0.3810 0.0002 0.5955 0.2545 0.0002
    0.6424 0.2650 0.0000 0.4329 0.1660 0.0000
    0.4479 0.1750 0.0000 0.2951 0.1042 0.0000
    0.2835 0.1070 0.0000 0.1842 0.0615 0.0000
    0.1649 0.0610 0.0000 0.1063 0.0343 0.0000
    0.0874 0.0320 0.0000 0.0561 0.0178 0.0000
    0.0468 0.0170 0.0000 0.0300 0.0094 0.0000
    0.0227 0.0082 0.0000 0.0145 0.0045 0.0000
    0.0114 0.0041 0.0000 0.0073 0.0022 0.0000
    0.0058 0.0021 0.0000 0.0037 0.0012 0.0000
    0.0029 0.0010 0.0000 0.0018 0.0005 0.0000
    Comme c'est dimanche je ne me fâcherai pas si tu refuses
    Promis

  7. #7
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    pour Delphi ( base pascal ) ou BC++ ( C).
    Comment est introduit le tableau ( clavier pour les courageux), fichier text
    (séparateur?), fichier bin ( type de float)

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut
    Les valeurs A,B,C ont été obtenues sous excel à partir de X,Y,Z avec la matrice suivante :
    0.3897 0.6890 -0.0787
    -0.2298 1.1834 0.0464
    0.0000 0.0000 1.0000
    La matrice M existe donc bien et tu connais ses coefficients...
    Ce serait vraiment sympa si tu pouvais me fournir le code source

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut
    Dans l'appli que je développe les valeurs pour delphi sont passées dans deux variables tableau dynamique telle que
    ABC,XYZ : Array[0..N,0..2] of double
    à partir de la lecture d'un fichier texte

  10. #10
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    code ecrit sans control donc à vérifier:

    pour test il faut créer un Bouton pour démarer, créer un memo pour la
    matrice en sortie mettre les data dans le fichier data.txt dans le
    repertoire courant ( formatté comme proposé dans votre demande )
    pour suivre le code, suivre les actions depuis Button1Click. Cela est
    suffisament simple pour eviter tout autre comment
    en cas de doute me contacter. Pour envoyer le Projet dans son entier il faudrait une E-Mail si necessaire.
    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
    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
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Math;
     
    type
      TForm1 = class&#40;TForm&#41;
        Button1&#58; TButton;
        Memo1&#58; TMemo;
        procedure Button1Click&#40;Sender&#58; TObject&#41;;
        procedure FormClose&#40;Sender&#58; TObject; var Action&#58; TCloseAction&#41;;
        procedure FormActivate&#40;Sender&#58; TObject&#41;;
      private
        &#123; Déclarations privées &#125;
      public
        &#123; Déclarations publiques &#125;
      end;
     
    var
      Form1&#58; TForm1;
     
    implementation
     
    &#123;$R *.dfm&#125;
     
     
    type   _3        = array&#91;1..3&#93; of   Double;
     
    type   _1ligne = record
                        xyz,
                        abc &#58; _3;
                        end;
     
    var     T   &#58; TextFile;
            St  &#58; String;
            P   &#58; pointer;
    function Extract &#40; S &#58; string; var f &#58; _1ligne &#41; &#58; boolean;
    var U           &#58; string;
        FF          &#58; array&#91;1..6&#93; of Double absolute f;
        status,
        i,j         &#58; integer;
       begin
       Extract &#58;= false;
       S &#58;= Trim&#40;S&#41; + ' ';
       j&#58;=0;
          repeat
          u&#58;='';
          i&#58;=1;
          while S&#91;i&#93; <> ' ' do
             inc&#40;i&#41;;
          U &#58;= Trim&#40;copy&#40;S,1,i&#41;&#41;;
          delete&#40;S,1,i&#41;;
          S&#58;=Trim&#40;S&#41; + ' ';
          if &#40; U = '' &#41; then
             exit;
          inc&#40;j&#41;;
          val&#40; U, FF&#91;j&#93;, status&#41;;
          if &#40; status <> 0 &#41; then
             exit;    //
          until &#40; j = 6&#41;;
       Extract &#58;= true;
       end;
    var P_Sz  &#58; integer;
        n     &#58; integer;
        M33,
        bj,
        aij &#58; array&#91;1..3,1..3&#93; of double;
    procedure Make_mat_33;
    var s    &#58; integer;
        f    &#58; _1ligne;
        p1   &#58; pointer;
        j,k  &#58; Byte;
       begin
       FillChar&#40;aij,0,sizeof&#40;aij&#41;&#41;;
     
       p1 &#58;= P;
     
       for s&#58;=1 to n do
          begin
          f &#58;= _1ligne&#40;p1^&#41;;
          inc&#40;longint&#40;p1&#41;,sizeof&#40;_1ligne&#41;&#41;;
          for  j&#58;=1 to 3 do
          for  k&#58;=1 to j do  // k <= j
             aij&#91;j,k&#93;&#58;= aij&#91;j,k&#93;+ f.xyz&#91;j&#93;*f.xyz&#91;k&#93;;
          end;
       aij&#91;1,2&#93;&#58;=aij&#91;2,1&#93;;
       aij&#91;1,3&#93;&#58;=aij&#91;3,1&#93;;
       aij&#91;2,3&#93;&#58;=aij&#91;3,2&#93;;
       end;
    procedure Make_XK;
    var s    &#58; integer;
        f    &#58; _1ligne;
        p1   &#58; pointer;
        j,b  &#58; Byte;
       begin
     
       FillChar&#40;bj,0,sizeof&#40;bj&#41;&#41;;
     
       p1 &#58;= P;
     
       for s&#58;=1 to n do
          begin
          f &#58;= _1ligne&#40;p1^&#41;;
          inc&#40;longint&#40;p1&#41;,sizeof&#40;_1ligne&#41;&#41;;
          for b&#58;=1 to 3 do
          for j&#58;=1 to 3 do
             bj&#91;j,b&#93;&#58;= bj&#91;j,b&#93;+ f.xyz&#91;j&#93;*f.abc&#91;b&#93;;
          end;
     
       end;
    function deter &#40; u11,u21,u31, u12,u22,u32,  u13,u23,u33 &#58; double &#41; &#58; double;
       begin
       deter &#58;=  u11 * &#40;u22*u33-u32*u23&#41;  - u12*&#40;u21*u33-u23*u31&#41; + u13 * &#40;u21*u32-u22*u31&#41;;
       end;
    var D, Residu_Max &#58; double;
    var Dx, Dy, Dz, R &#58; array&#91;1..3&#93; of  double;
     
    const  Error_Max_allowed = 1e-3;
     
    function  Control_des_ecarts &#58; boolean;
    var i   &#58; integer;
        p1  &#58; pointer;
        f &#58; _1ligne;
        b &#58; Byte;
       begin
       //
       p1 &#58;= P;
       Residu_Max&#58;=0;
       for i&#58;=1 to n do
          begin
          f &#58;= _1ligne&#40;p1^&#41;;
          for b&#58;=1 to 3 do
             begin
             R&#91;b&#93;&#58;= f.abc&#91;b&#93; - M33&#91;b,1&#93;*f.xyz&#91;1&#93; - M33&#91;b,2&#93;*f.xyz&#91;2&#93; - M33&#91;b,3&#93; * f.xyz&#91;3&#93;;
             Residu_Max &#58;= Math.Max&#40;Residu_Max,R&#91;b&#93;&#41;;
             end;
          inc&#40;LongInt&#40;p1&#41;,Sizeof&#40;f&#41;&#41;;
          end;
       Control_des_ecarts &#58;= &#40; Residu_Max < Error_Max_allowed &#41;;
       end;
    function Make_Mij &#58; boolean;
    var b &#58; byte; RR &#58; string;
       begin
       &#40;*
       ici ki = a,b,c suivant i      ki = Mi1*x + Mi2*y + Mi3*z à résoudre
       en fait numériquement cela n'est jamais le cas
       chaque equation 1..n presente un ecatr Epsilon&#91;j&#93; = &#91;ki - &#40;Mi1*x + Mi2*y + Mi3*z&#41;&#93; j= 1..n
       on cherche à minimiser le Résidu sigma &#40; Espilon&#91;j&#93; ^2 &#41;
       R =   Sigma    &#91; ki&#40;j&#41; - Mi1* X&#40;j&#41; + Mi2 * Y&#40;j&#41; + Mi2 * Z&#40;j&#41; &#93; ^2
           j = 1..n
     
       soit @R/@Mia = 0 a=1..3
     
            @R@Mia =    Sigma    &#91; ki&#40;j&#41; - Mi1* X&#40;j&#41; + Mi2 * Y&#40;j&#41; + Mi2 * Z&#40;j&#41; &#93; * 2 *  HH&#91;j&#93;   HH = X, Y ou Z pur a = 1,2 ,3
                        j = 1..n
       donc le système résolvant s'écrit
     
       Mi1 * Sigm X^2 + Mi2 * Sima &#40; X*Y &#41; + Mi3 * Sigma&#40;X*Z&#41; = Sima&#40; X* Ki&#41;
       Mi1 * Sigm Y*X + Mi2 * Sima &#40; Y^2 &#41; + Mi3 * Sigma&#40;Y*Z&#41; = Sima&#40; Y* Ki&#41;
       Mi1 * Sigm Z*X + Mi2 * Sima &#40; Z*Y &#41; + Mi3 * Sigma&#40;Z^2&#41; = Sima&#40; Z* Ki&#41;
     
       on note que la matrice carré  résolvant le système est la même pour i=1,2,3
       =A> on la cacule qu'une X.
       les solutions Mia diffèrent pour les differents i que par Sigma&#40;x,y,z   * Ki &#40;a,b,c suivant i &#41;
       de + A est symétrique
       *&#41;
       Make_mat_33;
       D &#58;= deter&#40; aij&#91;1,1&#93;, aij&#91;2,1&#93;,aij&#91;3,1&#93;,
                   aij&#91;1,2&#93;, aij&#91;2,2&#93;,aij&#91;3,2&#93;,
                   aij&#91;1,3&#93;, aij&#91;2,3&#93;,aij&#91;3,3&#93;
                 &#41;;
       if &#40; abs&#40; D &#41; < 1e-15 &#41; then
          begin
          Make_Mij &#58;= false;
          ShowMessage&#40;'M n''existe pas système dégénéré...'&#41;;
          exit;
          end;
       Make_Mij &#58;= true;
       D &#58;= 1/D;
       Make_XK ;
       for  b&#58;=1 to 3 do
          begin
          Dx&#91;b&#93; &#58;=  deter&#40; bj&#91;1,b&#93;, aij&#91;2,1&#93;,aij&#91;3,1&#93;,
                           bj&#91;2,b&#93;, aij&#91;2,2&#93;,aij&#91;3,2&#93;,
                           bj&#91;3,b&#93;, aij&#91;2,3&#93;,aij&#91;3,3&#93;
                          &#41;;
          Dy&#91;b&#93; &#58;=  deter&#40; aij&#91;1,1&#93;, bj&#91;1,b&#93;,aij&#91;3,1&#93;,
                           aij&#91;1,2&#93;, bj&#91;2,b&#93;,aij&#91;3,2&#93;,
                           aij&#91;1,3&#93;, bj&#91;3,b&#93;,aij&#91;3,3&#93;
                          &#41;;
          Dz&#91;b&#93; &#58;=  deter&#40; aij&#91;1,1&#93;, aij&#91;2,1&#93;,bj&#91;1,b&#93;,
                           aij&#91;1,2&#93;, aij&#91;2,2&#93;,bj&#91;2,b&#93;,
                           aij&#91;1,3&#93;, aij&#91;2,3&#93;,bj&#91;3,b&#93;
                          &#41;;
          M33&#91;b,1&#93;&#58;=D*Dx&#91;b&#93;;
          M33&#91;b,2&#93;&#58;=D*Dy&#91;b&#93;;
          M33&#91;b,3&#93;&#58;=D*Dz&#91;b&#93;;
          end;              
       str&#40;Residu_Max&#58;20&#58;10,RR&#41;;
       RR &#58;=Trim&#40;RR&#41;;
       if &#40; Control_des_ecarts &#41; then
          Form1.Caption &#58;= 'Matrice trouvée avec R max = ' + RR
       else
          ShowMessage&#40;'Aucune matrice 3X3 trouvée dans le cadre de la tolérance envisagée   Résidu = ' + RR&#41;;
       end;
    function Make_M3x3 &#58; boolean;
       var i &#58; byte;
       begin
       &#40;*
       pour chaque ligne on a  &#40; k1,k2,k3 &#41; =  &#40; a,b,c &#41;
     
                    k1     M11  M12  M13          x
                    k2 =   M21  M22  M23    *     y
                    k3     M31  M32  M33          z
       soit
     
                    ki = Mi1*x + Mi2*y + Mi3*z        i=1..3
       *&#41;
       if &#40; not Make_Mij &#41; then
          begin
          Make_M3x3 &#58;= false;
          exit;
          end;
       Make_M3x3 &#58;= true;
       end;
    procedure TForm1.Button1Click&#40;Sender&#58; TObject&#41;;
    var f &#58; _1ligne;
        fl &#58; file;
        i,j &#58; byte;
        coef &#58; array&#91;1..3,1..3&#93; of String;
    begin
    Memo1.Clear;
    if &#40; P <> NIL&#41; then
       begin
       freemem&#40;P,P_Sz&#41;;
       P&#58;=NIL;
       end;
    if &#40; FileExists&#40;'data.txt'&#41; &#41; then
       begin
       n &#58;= 0;
       assignfile&#40;fl,'data.bin'&#41;;
       rewrite&#40;fl,sizeof&#40;_1ligne&#41;&#41;;
       assignfile&#40;T,'data.txt'&#41;;
       reset&#40;T&#41;;
       // recherche des lignes acceptées => suite de 6 float ecrits sous forme ---.--- séparés par space
       while not eof&#40;T&#41; do
          begin
          readln&#40;T,St&#41;;
          if &#40; Extract&#40;St,f&#41; &#41; then
             begin
             blockwrite&#40;fl,f,1&#41;;
             inc&#40;n&#41;; // 1 de + OK   !!
             end;
          end;
       closefile&#40;T&#41;;
       closefile&#40;fl&#41;;
       if &#40; n < 3 &#41; then
          begin
          P &#58;= NIL;
          erase&#40;fl&#41;;
          ShowMessage&#40;'Un minimum de 3 lignes valides sont NECESSAIRES !!!'&#41;
          end
       else
          begin
          P_Sz &#58;= n*Sizeof&#40;_1ligne&#41;;
          getmem&#40;P,P_Sz&#41;;
          reset&#40;fl,P_Sz&#41;;
          blockread&#40;fl,p^,1&#41;;
          closefile&#40;fl&#41;;
          erase&#40;fl&#41;;
          if &#40; Make_M3x3 &#41; then with Memo1 do
             begin
             for i&#58;=1 to 3 do for j&#58;=1 to 3 do
                str&#40;M33&#91;i,j&#93;&#58;20&#58;6,coef&#91;i,j&#93;&#41;;
             lines.add &#40; Coef&#91;1,1&#93; + '   ' + Coef&#91;1,2&#93;  + '   '  + Coef&#91;1,3&#93;&#41;;
             lines.add &#40; Coef&#91;2,1&#93; + '    ' + Coef&#91;2,2&#93;  + '   '  + Coef&#91;2,3&#93;&#41;;
             lines.add &#40; Coef&#91;3,1&#93; + '    ' + Coef&#91;3,2&#93;  + '   '  + Coef&#91;3,3&#93;&#41;;
             end;
          end
       end
    else
       ShowMessage&#40;' Le fichier text data.txt est absent'&#41;;
    end;
    procedure TForm1.FormClose&#40;Sender&#58; TObject; var Action&#58; TCloseAction&#41;;
    begin
     
    if &#40; P <> NIL&#41; then
       begin
       freemem&#40;P,P_Sz&#41;;
       P&#58;=NIL;
       end;
    end;
     
    procedure TForm1.FormActivate&#40;Sender&#58; TObject&#41;;
    begin
     
    Memo1.Clear;
    end;
     
    initialization
    P_Sz &#58;= 0;
    P &#58;= NIL;
    end.

  11. #11
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    avec le petit programme et les data proposés je trouve la matrice



    0.389703 0.689003 -0.078704
    -0.229795 1.183407 0.046382
    0.000000 0.000000 1.000000


    avec un résidu max de 0.0000500644

    remarque : pour un probleme d'affichage, il faut appuyer 2 fois le bouton pour voir le résidu s'afficher... Cela ne change en rien l'algorithme ni les résultats obtenus.

    Ce residu est d'ailleur presque evident ( si M existe ). Il n'est pas lié au calcul mais aux données qui sont données avec 4 digits et donc ont une erreur d'arrondi de +- 5 10^-5
    la partie 644 10^-10 pourrait correspondre à l'erreur de calcul elle même. Cette analyse est + délicate!

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut
    Ok vraiment sympa.
    Je viens de me remettre au clavier, je m'empresse de mettre ce code source en musique sous Delphi.
    Si on arrondi le résultat à la quatrième décimale, on obtient très exactement les coefficients utilisés.
    Encore mille fois merci

  13. #13
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    good luck!

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Ca marche !
    Je viens de vérifier sous delphi avec un copié collé...
    Tout baigne.
    Je vais maintenant essayer de comprendre.
    Nota : Par contre je n'ai pas vu le résidu s'afficher même en cliquant deux fois sur le bouton. Mais ce n'est pas grave je vais rès certainement trouver.

    Encore une fois mille merci

  15. #15
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    je l'ai mis dans le caption de la form primaire afin d'aller au + vite. Ce n'est pas tres design mais pour 1 test c'est rapide et fonctionnel!

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut
    Ok ! Vu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] comment extraire deux lignes aleatoires d'une matrice?
    Par linda05 dans le forum MATLAB
    Réponses: 5
    Dernier message: 15/05/2014, 20h23
  2. Réponses: 82
    Dernier message: 05/02/2011, 15h34
  3. [Débutant] Transformation d'une matrice 3D en une matrice 1D
    Par Alucard9800XT dans le forum MATLAB
    Réponses: 7
    Dernier message: 10/05/2007, 16h07
  4. Réponses: 18
    Dernier message: 24/07/2006, 20h30
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 22h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo