systèmes linéaires avec gsl
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

systèmes linéaires avec gsl



  1. #1
    hinanehinane

    systèmes linéaires avec gsl


    ------

    Bonjour,
    j'ai le schéma suivant

    u_0^{n+1} et u_{N+1}^{n+1} et u^0_j sont données.
    Je l'ai écris à la main sous la forme d'un système matriciel. Comment l'écrire en code c++ pour ensuite le résoudre en utilisant GSL? (en fait on commence par son écriture) s'il vous plaît. Je vous remercie par avance.

    -----

  2. #2
    hinanehinane

    Re : systèmes linéaires avec gsl

    Bon, pour le moment, je commence par écrire mon système matriciel en C++. J'ai réussi à écrire la matrice A, par contre pour l'inconnue X et le second membre F qui sont des vecteur, je n'y arruve pas. Dès que je met include<vector> il refuse de compiler. Voici mon fichier .cpp
    Code:
    #include<iostream>
    #include<boost/numeric/ublas/matrix.hpp>
    #include<boost/numeric/ublas/io.hpp>
    using namespace std
    #include<vector>
    
    int main()
    {
    using namespace boost::numeric::ublas;
    int N=6;
    matrix<double> m(N,N);
    for (unsigned i=0;i<6;++i)
    {
    m(i,i)=1;
    m(i+1,i)=2;
    m(i,i+1)=3;
    std::cout<<m<<std::endl;
    }
    };
    je vous remercie par avance.

  3. #3
    hinanehinane

    Re : systèmes linéaires avec gsl

    Voici ce que j'ai écrit pour résoudre le système
    Code:
    #include <stdio.h>
    #include <gsl/gsl_linalg.h>
    
    int
    main (void)
    {
     int N=4;
    int M=4;
    
      double a_data[N,N]; 
    for (int i=1;i<N;i++)
    {
    for (int j=1;j<N;j++)
    {
    if(i==j) a_data[i,j]=1;
    else
    if(j==i-1) a_data[i,j]=60;
    else
    if (j==i+1) a_data[i,j]=7;
    else
    a_data[i,j]=0;
    }
    }
    
    double b_data[N];
    b_data[1]=1;
    for(i=2: i<N;i++)
    b_data[i]=0;
    
    
    for(int n=0; n<M; n++)
    {
      gsl_matrix_view m 
        = gsl_matrix_view_array (a_data, N, N);
    
      gsl_vector_view b
        = gsl_vector_view_array (b_data, N);
    
      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, &b.vector, x);
    
      printf ("x = \n");
      gsl_vector_fprintf (stdout, x, "%g");
    
      gsl_permutation_free (p);
      gsl_vector_free (x);
      b_data=x;
      return 0;
    }
    }
    il me renvoie ces erreurs:
    matrice.c:10:10: error: array size missing in ‘a_data’
    double a_data[];
    ^
    matrice.c:11:1: error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode
    for (int i=1;i<N;i++)
    ^
    matrice.c:11:1: note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code
    matrice.c:13:1: error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode
    for (int j=1;j<N;j++)
    ^
    matrice.c:15:18: warning: left-hand operand of comma expression has no effect [-Wunused-value]
    if(i==j) a_data[i,j]=1;
    ^
    matrice.c:17:20: warning: left-hand operand of comma expression has no effect [-Wunused-value]
    if(j==i-1) a_data[i,j]=60;
    ^
    matrice.c:19:21: warning: left-hand operand of comma expression has no effect [-Wunused-value]
    if (j==i+1) a_data[i,j]=7;
    ^
    matrice.c:21:9: warning: left-hand operand of comma expression has no effect [-Wunused-value]
    a_data[i,j]=0;
    ^
    matrice.c:25:8: error: array size missing in ‘b_data’
    double b_data[];
    ^
    matrice.c:27:8: error: expected ‘;’ before ‘:’ token
    for(i=2: i<N;i++)
    ^
    matrice.c:27:17: error: expected ‘;’ before ‘)’ token
    for(i=2: i<N;i++)
    ^
    matrice.c:31:1: error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode
    for(int n=0; n<M; n++)
    ^
    matrice.c:54:9: error: assignment to expression with array type
    b_data=x;
    ^
    matrice.c:57:1: warning: control reaches end of non-void function [-Wreturn-type]
    }
    ^

    Ce que je remarque, c'est qu'il n'accepte pas la boucle for, pourtant il faut calculer à chaque fois en utilisant , et en partant du vecteur b_data qui a N composante qui sont toute nulles à part la première.
    Comment l'arranger? S'il vous plaît. Je vous remercie par avance.

  4. #4
    hinanehinane

    Re : systèmes linéaires avec gsl

    Désolée pour le multi-poste, mais il y'a du nouveau. En fait, j'ai fini par écrire le code, et le voici:

    Code:
    #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);
           
     
          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; 
    
    }
    Ce programme résout le système Ax^{n+1}=b^n, n=0,...,M. Où mettre la boucle for pour faire une itération? Je vous remercie par avance.

  5. A voir en vidéo sur Futura
  6. #5
    hinanehinane

    Re : systèmes linéaires avec gsl

    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:
    #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.

Discussions similaires

  1. systèmes linéaires avec plusieurs seconds membres
    Par xavier4166 dans le forum Mathématiques du supérieur
    Réponses: 0
    Dernier message: 29/01/2014, 07h58
  2. Systèmes linéaires
    Par ghada92 dans le forum Physique
    Réponses: 15
    Dernier message: 12/11/2013, 13h58
  3. Systèmes linéaires
    Par invite2c633a3a dans le forum Mathématiques du supérieur
    Réponses: 8
    Dernier message: 08/06/2010, 09h44
  4. systèmes non linéaires
    Par invite018077e1 dans le forum Mathématiques du supérieur
    Réponses: 0
    Dernier message: 11/01/2010, 22h07
  5. Systèmes linéaires
    Par invite10426676 dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 12/02/2008, 21h28