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

C++ Discussion :

systèmes linéaires avec gsl


Sujet :

C++

  1. #21
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Si tu regardes la déclaration de la classe matrix, tu vois qu'elle a 2 paramètres template, T et N.
    Si tu regardes la déclaration de matrix::_data, celle-ci te permet de comprendre (au cas où tu n'aurais pas déjà compris) que N sert de dimension pour une matrice carrée, et T sert de type de données contenues dans la matrice.
    Lorsque tu veux créer une instance de la classe matrix, il faut donc que tu spécifies ces 2 paramètres, ce que tu ne fais pas dans ta ligne matrix a_data(4,4);.
    De plus si tu lis bien la déclaration de cette matrix, tu remarqueras qu'elle n'a aucun constructeur prenant 2 paramètres, donc définitivement, ta ligne de déclaration de a_data a des problèmes.

    EDIT:

    Je ne te mets pas la solution, je ne fais que t'aiguiller pour que tu la trouves, la solution.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  2. #22
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    D'accord, donc j'ai modifié et j'ai bien mis deux paramètres: le type (double ici), et la taille qui est 4 ici. Voici le fichier.c
    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
     
    #include <stdio.h>
    #include <gsl/gsl_linalg.h>
     
     
    int
     
     
    namespace dvp
    {
    template<class T, size_t N>
    class matrix
    {
        std::array<T,N*N> _data;
    public:
        matrix() : _data({0}) {}//constructeur par défaut
        matrix(size_t line=0, size_t column=0)//constructeur avec arguments
        // copy & move constructors & operator= left to lecter
        T& operator()(size_t line, size_t column) { return _data[N * column + line]; }
        const T& operator()(size_t line, size_t column) const { return _data[N * column + line]; }
        T* data() { return _data.data(); }
        const T* data() const { return _data.data(); }
    };
    }
     
    main (void)
    {
     matrix <double> a_data(class double, size_t 4);
      double a_data(1,1)=1;
      double a_data(1,2)=3;
      double a_data(4,3)=5;
      double a_data(4,4)=1;
    for (int i=2;i<4;i++)
    {
      a(i,i)=1;
      a(i,i+1)=3;
      a(i+1,i)=5;
    }
     
      double b_data[] = { 1.0, 2.0, 3.0, 4.0 };
     
      gsl_matrix_view m 
        = gsl_matrix_view_array (a_data, 4, 4);
     
      gsl_vector_view b
        = gsl_vector_view_array (b_data, 4);
     
      gsl_vector *x = gsl_vector_alloc (4);
     
      int s;
     
      gsl_permutation * p = gsl_permutation_alloc (4);
     
      gsl_linalg_LU_decomp (&m.matrix, p, &s);
     
      gsl_linalg_LU_solve (&m.matrix, p, &b.vector, x);
     
      printf ("x = \n");
      gsl_vector_fprintf (stdout, x, "%g");
     
      gsl_permutation_free (p);
      gsl_vector_free (x);
      return 0;
    }
    par contre il y'a toujours des erreurs. Je vous remercie pour votre aide.

  3. #23
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Peux-tu m'expliquer textuellement ce qu'est censée faire cette ligne?
    matrix <double> a_data(class double, size_t 4);
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  4. #24
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    En fait, ca deverai être comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     matrix a_data(class double, size_t 4);
    et ca veut dire que a_data est un objet de la classe matrice, t.q ses éléments sont de type double, et sa taille est 4.

  5. #25
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par hinaneee Voir le message
    En fait, ca deverai être comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     matrix a_data(class double, size_t 4);
    et ca veut dire que a_data est un objet de la classe matrice, t.q ses éléments sont de type double, et sa taille est 4.
    Qu'est-ce qui te fait dire que ça devrait être comme ça?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  6. #26
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    C'est parce qu'on a mis template<class T, size_t N> , donc les éléments de la classe ont deux arguments: le type et la taille, je l'ai compris comme ca.

  7. #27
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    comment écrirais-tu l'appel de la fonction int somme(int a, int b)?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #28
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    a_data . somme(2,3) par exemple.

  9. #29
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    Ca, ca aurait été int matrix::somme(int a, int b), mais l'idée y est.

    Tu as bien consciencieusement supprimé les indications de type.
    Concrètement, ce que tu as écrit est une expression d'appel de fonction.

    Avec les templates de classes, c'est le type qu'il faut paramétrer.
    c'est ce que tu fais entre les chevrons qui suivent le nom de la template, comme dans vector<double>.


    Dans les parenthèses, on écrit des arguments de l'expression.
    Tu as écris ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    matrix <double> a_data(class double, size_t 4);
    L'idée derrière est précisément la même que dans int i=4; ou précisément std::string s("bonjour");.

    Il s'agit de déclarer une variable nommée a_data, du type obtenu par la template matrix pour les paramètres double et 4, et avec le constructeur qui va bien.

    Avec ces éclaircissement, comment l'écrirais-tu?
    Et surtout pourquoi?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  10. #30
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    Donc ca doit être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     matrix  <double, 4> a_data
    C'est bien ca?
    et voici le code

    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
     
    #include <stdio.h>
    #include <gsl/gsl_linalg.h>
    #include<math.h>
    #include <gsl/gsl_vector.h>
     
     
    namespace dvp
    {
    template<class T, size_t N>
    class matrix
    {
        std::array<T,N*N> _data;
    public:
        matrix() : _data({0}) {}
        matrix(size_t line=0, size_t column=0)//constructeur avec arguments
        // copy & move constructors & operator= left to lecter
        T& operator()(size_t line, size_t column) { return _data[N * column + line]; }
        const T& operator()(size_t line, size_t column) const { return _data[N * column + line]; }
        T* data() { return _data.data(); }
        const T* data() const { return _data.data(); }
    };
    }
     
    int 
    main(void)
    {
     
    matrix<double, 4> a_data;
     
    double a_data(1,1)=1;
      double a_data(1,2)=3;
      double a_data(4,3)=5;
      double a_data(4,4)=1;
    for (int i=2;i<4;i++)
    {
      a(i,i)=1;
      a(i,i+1)=3;
      a(i+1,i)=5;
    }
     
    }
    Qu'en pensez-vous?

  11. #31
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    Désolée pour le multi-poste, mais il y'a du nouveau. En fait, j'ai fini par écrire le code sans les templates,
    Bonjour,
    je souhaite résoudre un système linéaire $Au^{n+1}= f^n + w$
    ce système linéaire vient du schéma implicite
    $$-a u^{n+1}_{j-1} + b u^{n+1}_j - c u^{n+1}_{j+1}=u^n_j$$
    avec $u^0_j=0$ pour tout $j$ de 1 à $N$, $u^n_0=a$ et u^n_{N+1}=0$ pour tout $n$ de 0 à $M$.
    où $A$ est une matrice tridiagonale de taille N*N, les éléments de sa diagonales sont $b$, de sa sous-diagonales: $-a$, et de sa sur-diagonale $-c$.
    $(f^n)_j=(u^n)_j, j=1,...,N$, $w$ est un vecteur nul partout sauf pour sa première composante qui vaut a.
    $n$ va de 0 à M, et $(u^0_j)_j = 0$ pour $j$ de 1 à N.

    Je souhaite résoudre ce système en utilisant gsl. Mon problème est à quel moment je met la boucle d'itération sur n? Voici le programme que j'ai écris

    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
     
    #include <stdio.h>
    #include <gsl/gsl_linalg.h>
    #include<math.h>
    #include <gsl/gsl_vector.h>
     
     
     int main (void)
    {
        int N=99;
        int M=99;
     
     
    //les data
    double L=1000.;
    double T=3860.;
    double phi=0.3;
    double D=0.1;
    double v=0.05;
     
     
    double delta=T/(M+1);
    double h=L/(N+1);
    double lambda1=(D/phi)*(delta/pow(h,2));
    double lambda2=(v/phi)*(delta/h);
    double a=lambda1+lambda2;
    double b=(2*lambda1)+1+lambda2;
    double c=lambda1;
     
     
     
    double *a_data; //allouer un espace pour a_data
    a_data =(double*) malloc(N*N*sizeof(double));
    a_data[0]=b; 
    a_data[1]= -c;
    a_data[N*N-2]= -a;
    a_data[N*N-1]=b;
    for(int i=2;i<N;i++)
    {
    int j=(i-1)*N + i-1;
    printf("j=%i\n",j);
    a_data[j]=b;
    a_data[j-1]=-a;
    a_data[j+1]=-c;
    printf("a_data[j]=%i\n",j);
    }
     
    double *f_data; //allouer un espace pour b_data
        f_data =(double*) malloc(N*sizeof(double));
     
        f_data[0]=a;
        for(int i=1; i<N;i++) f_data[i]=0;
     
     
      double *w_data; //allouer un espace pour b_data
        w_data =(double*) malloc(N*sizeof(double));
     
        w_data[0]=a;
     
       gsl_matrix_view m = gsl_matrix_view_array (a_data, N, N);
     
       gsl_vector_view f = gsl_vector_view_array (f_data, N);
     
       gsl_vector_view w = gsl_vector_view_array (w_data, N);
     
     
    for (int i=1;i< M;99)
    {
     
     
          gsl_vector *x = gsl_vector_alloc (N);
     
         int s;
     
         gsl_permutation * p = gsl_permutation_alloc (N);
     
         gsl_linalg_LU_decomp (&m.matrix, p, &s);
     
     
         gsl_linalg_LU_solve (&m.matrix, p, &f.vector, x);
     
         printf ("x = \n");
         gsl_vector_fprintf (stdout, x, "%g");
     
         gsl_permutation_free (p);
     
     
        int gsl_vector_memcpy (gsl_vector *f, const gsl_vector *x);  
     
        int gsl_vector_add(gsl_vector *f, const gsl_vector *w);
     
        gsl_vector_free (x);
     
     
        }
     return 0; 
     
    }
    Il ne donne que des 0, sûrement à cause de la boucle qui est mal placée. Comment l'aranger? S'il vous plaît. Je vous remercie par avance.

  12. #32
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par hinaneee Voir le message
    C'est bien ca?
    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
     
    #include <stdio.h>
    #include <gsl/gsl_linalg.h>
    #include<math.h>
    #include <gsl/gsl_vector.h>
     
     
    namespace dvp
    {
    template<class T, size_t N>
    class matrix
    {
        std::array<T,N*N> _data;
    public:
        matrix() : _data({0}) {}
        matrix(size_t line=0, size_t column=0)//constructeur avec arguments
        // copy & move constructors & operator= left to lecter
        T& operator()(size_t line, size_t column) { return _data[N * column + line]; }
        const T& operator()(size_t line, size_t column) const { return _data[N * column + line]; }
        T* data() { return _data.data(); }
        const T* data() const { return _data.data(); }
    };
    }
     
    int 
    main(void)
    {
     
    matrix<double, 4> a_data;
     
    double a_data(1,1)=1;
      double a_data(1,2)=3;
      double a_data(4,3)=5;
      double a_data(4,4)=1;
    for (int i=2;i<4;i++)
    {
      a(i,i)=1;
      a(i,i+1)=3;
      a(i+1,i)=5;
    }
     
    }
    Qu'en pensez-vous?
    Ca m'a l'air bien ça (il va peut-être te manquer un dvp:: mais sinon c'est tout bon). Il ne reste plus qu'à utiliser la matrice crée de la même manière que dans ton message #14. Petit indice, il faut utiliser a_data.data() qui est homogène au type const double[] de la même manière que tu utilisais a_data dans gsl_matrix_view m = gsl_matrix_view_array (a_data, N, N);.

    Citation Envoyé par hinaneee Voir le message
    Désolée pour le multi-poste, mais il y'a du nouveau. En fait, j'ai fini par écrire le code sans les templates,
    Bonjour,
    je souhaite résoudre un système linéaire $Au^{n+1}= f^n + w$
    ce système linéaire vient du schéma implicite
    $$-a u^{n+1}_{j-1} + b u^{n+1}_j - c u^{n+1}_{j+1}=u^n_j$$
    avec $u^0_j=0$ pour tout $j$ de 1 à $N$, $u^n_0=a$ et u^n_{N+1}=0$ pour tout $n$ de 0 à $M$.
    où $A$ est une matrice tridiagonale de taille N*N, les éléments de sa diagonales sont $b$, de sa sous-diagonales: $-a$, et de sa sur-diagonale $-c$.
    $(f^n)_j=(u^n)_j, j=1,...,N$, $w$ est un vecteur nul partout sauf pour sa première composante qui vaut a.
    $n$ va de 0 à M, et $(u^0_j)_j = 0$ pour $j$ de 1 à N.

    Je souhaite résoudre ce système en utilisant gsl. Mon problème est à quel moment je met la boucle d'itération sur n? Voici le programme que j'ai écris

    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
     
    #include <stdio.h>
    #include <gsl/gsl_linalg.h>
    #include<math.h>
    #include <gsl/gsl_vector.h>
     
     
     int main (void)
    {
        int N=99;
        int M=99;
     
     
    //les data
    double L=1000.;
    double T=3860.;
    double phi=0.3;
    double D=0.1;
    double v=0.05;
     
     
    double delta=T/(M+1);
    double h=L/(N+1);
    double lambda1=(D/phi)*(delta/pow(h,2));
    double lambda2=(v/phi)*(delta/h);
    double a=lambda1+lambda2;
    double b=(2*lambda1)+1+lambda2;
    double c=lambda1;
     
     
     
    double *a_data; //allouer un espace pour a_data
    a_data =(double*) malloc(N*N*sizeof(double));
    a_data[0]=b; 
    a_data[1]= -c;
    a_data[N*N-2]= -a;
    a_data[N*N-1]=b;
    for(int i=2;i<N;i++)
    {
    int j=(i-1)*N + i-1;
    printf("j=%i\n",j);
    a_data[j]=b;
    a_data[j-1]=-a;
    a_data[j+1]=-c;
    printf("a_data[j]=%i\n",j);
    }
     
    double *f_data; //allouer un espace pour b_data
        f_data =(double*) malloc(N*sizeof(double));
     
        f_data[0]=a;
        for(int i=1; i<N;i++) f_data[i]=0;
     
     
      double *w_data; //allouer un espace pour b_data
        w_data =(double*) malloc(N*sizeof(double));
     
        w_data[0]=a;
     
       gsl_matrix_view m = gsl_matrix_view_array (a_data, N, N);
     
       gsl_vector_view f = gsl_vector_view_array (f_data, N);
     
       gsl_vector_view w = gsl_vector_view_array (w_data, N);
     
     
    for (int i=1;i< M;99)
    {
     
     
          gsl_vector *x = gsl_vector_alloc (N);
     
         int s;
     
         gsl_permutation * p = gsl_permutation_alloc (N);
     
         gsl_linalg_LU_decomp (&m.matrix, p, &s);
     
     
         gsl_linalg_LU_solve (&m.matrix, p, &f.vector, x);
     
         printf ("x = \n");
         gsl_vector_fprintf (stdout, x, "%g");
     
         gsl_permutation_free (p);
     
     
        int gsl_vector_memcpy (gsl_vector *f, const gsl_vector *x);  
     
        int gsl_vector_add(gsl_vector *f, const gsl_vector *w);
     
        gsl_vector_free (x);
     
     
        }
     return 0; 
     
    }
    Il ne donne que des 0, sûrement à cause de la boucle qui est mal placée. Comment l'aranger? S'il vous plaît. Je vous remercie par avance.
    Trop compliqué pour moi. Il faut avancer étape par étape.
    -- Yankel Scialom

  13. #33
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    Bonjour prgasp77. S'il te plaît, dans ta définition de la classe template matrix, où est le constructeur avec argument et le constucteur de copie? Et par quelle logique tu les as implémenté?
    Merci par avance.

  14. #34
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par hinaneee Voir le message
    Bonjour prgasp77. S'il te plaît, dans ta définition de la classe template matrix, où est le constructeur avec argument et le constucteur de copie? Et par quelle logique tu les as implémenté?
    Merci par avance.
    Bonjour, ils sont ligne 9 (laissés au lecteur). Ils sont assez triviaux à écrire, je te laisse essayer.
    -- Yankel Scialom

  15. #35
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    Oui, je les avais repéré; je parlais de la définition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    matrix(size_t line=0, size_t column=0)//constructeur avec arguments
     
        T& operator()(size_t line, size_t column) { return _data[N * column + line]; }// constructeur de copie
    Mon problème est qu'à chaque fois je cherche d'anciens programme pour faire copier-coller de ces deux définitions, mais je vais les retenir. Peux-tu m'expliquer qu'est ce qu'on doit mettre dans la définition d'un constructeur avec arguments? (moi j'essairai de traduire en C++).
    Pour le constructeur de copie, vous l'avez déjà définie.
    Dans une classe de vecteur template, on définie le constructeur de copie par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template <typename Real>
    vector<Real>::vector(const vector& ref): N(ref.N)
    {
      v = new Real[N];
      for(int i=0; i<N;i++)
        v[i]=ref.v[i];
    }
    c'est à dire qu'il prend un vecteur de reférence et il le copie, mais ca sert à quoi exactement le constructeur de copie? Et pour une matrice, est-ce qu'on peut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    matrix (cont matrix& ref): N*N(ref.N*N)
    {
    m=new [N*N]
    for (int i=0; i<N; i++)
    for(int j=0; j<N;j++)
    a_data[i,j]= ref. a_data[i,j];
    }
    Je vous remercie par avance de me corriger et m'indiquer les bêtises et comment faire afin de les retenir.

  16. #36
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Repartons sur ce code :
    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
    namespace dvp
    {
    template<class T, size_t N>
    class matrix
    {
        std::array<T,N*N> _data;
    public:
        matrix() : _data({0}) {}
        // copy & move constructors & operator= left to lecter
        T& operator()(size_t line, size_t column) { return _data[N * column + line]; }
        const T& operator()(size_t line, size_t column) const { return _data[N * column + line]; }
        T* data() { return _data.data(); }
        const T* data() const { return _data.data(); }
    };
    }
    Il n'y a nul besoin de constructeur avec argument.
    Le constructeur par copie n'est pas défini. L'objectif du constructeur par copie est de pouvoir écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dvp::matrix<int, 4> source;
    source(0,0) = 42;
    dvp::matrix<int, 4> copy(source);
    et d'avoir les objets source et copy dans le même état (c'est à dire copy(0,0) == 42).
    -- Yankel Scialom

  17. #37
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    1- Pourquoi on n'a pas besoin de constructeur avec arguments? Et quand est-ce qu'on en a besoin?
    2- Dans les lignes du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     T& operator()(size_t line, size_t column) { return _data[N * column + line]; }
        const T& operator()(size_t line, size_t column) const { return _data[N * column + line]; }
        T* data() { return _data.data(); }
        const T* data() const { return _data.data(); }
    peux-tu s'il te plaît, m'expliquer avec des mots, ce que tu fais dans chaque ligne? (nottament la première, que veut dire column + line?)
    Je te remercie par avance.

  18. #38
    Débutant
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 71
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,
    peux-tu m'indiquer s'il te plaît, comment on définit le constructeur de copie pour une classe matrice? (sns utiliser dsvp).
    Merci par avance.

  19. #39
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 058
    Points : 12 093
    Points
    12 093
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    namespace dvp
    {
    template<class T, size_t N>
    class matrix
    {
    ...
       matrix(const matrix& m){...};
    ...
    };

Discussions similaires

  1. Système linéaire avec contraintes
    Par SKone dans le forum Mathématiques
    Réponses: 4
    Dernier message: 17/09/2013, 12h27
  2. Résolution système linéaire avec contraintes
    Par Triton972 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 25/10/2011, 20h32
  3. Réponses: 2
    Dernier message: 18/06/2008, 15h45
  4. Résolution système linéaire mais avec paramètre
    Par feynman dans le forum Scilab
    Réponses: 7
    Dernier message: 03/10/2007, 07h55
  5. Vérification de système linéaire, avec tableaux
    Par lenny_ dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 13/06/2006, 18h51

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