Erreur de segmentation (séries de Fourier)
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Erreur de segmentation (séries de Fourier)



  1. #1
    Tinordi24

    Erreur de segmentation (séries de Fourier)


    ------

    Voici: mon but est de simuler un système exoplanétaire avec la planète intérieure qui est une supergéante gazeuse ayant 2% de la masse du Soleil, située à un rayon orbital de 1 UA, L'on veut calculer le spectre de puissance (défini comme Ak^2+Bk^2, Ak et Bk étant des coefficients de Fourier) mais j'en arrive à une erreur de segmentation lorsque je veux le faire porter en graphique. (Veuillez m'excuser pour les paramètres de pllab; je n'ai pas encore ajusté le graphique mais je vais le faire une fois l'erreur de segmentation réglée)

    Code:
    #include <stdio.h>
    #include <math.h>
    #include <plplot.h>
    #define NPAS 41000 /* Nombre de pas de temps */
    /* Ce programme integre les deux EDO couplees definisant */
    /* le probleme du pendule lineaire par la methode d'Euler explicite */
    int main(void)
    {
    /* Declarations ---------------------------------------------------- */
    long c=0, k=0, rf, kx ; /* Compteurs d'iterations */
    float h=1./1500 ; /* Taille du pas de temps */
    float mplus, nplus, G, M, splus, wplus;
    double x, y, i, j, xmin, xmax, ymin, ymax, Mj, rp, rx, ry, sx, sy, tx, ty, fbase;
    float t[NPAS], moyenne1, moyenne2 ; /* Le temps */
    double u, v, m, n, w, s, rayon1[NPAS], rayon2[NPAS] ; /* Les deux variables dependantes */
    double Pk[NPAS], ak[NPAS], bk[NPAS];
    xmin=-2.5;xmax=2.5; ymin=-2.5; ymax=2.5;
    plscolbg(255,255,255);
    plinit();
    plenv(xmin, xmax, ymin, ymax, 1, 1);
    pllab("Orbite horizontale (UA)","Orbite verticale (UA)","Orbite en fonction du temps");
    /* Executable ------------------------------------------------------ */
    i=0. ; j=-1; m=0.9*6.2832; n=0.; /* Conditions initiales pour super-Jupiter */
    x = 0. ; y = -1.6; s=6.2832/1.2649; w=0. ; /* Conditions initiales pour petite-planete */
    G= 1.96*pow(10.,-29);
    M= 1.98*pow(10.,30);
    Mj=0.02*M;
    t[0]=0. ;
        for (k=0 ; k < NPAS ; k++ ) /* Boucle temporelle */
        {
      rp     =pow(((pow(x,2))+(pow(y,2))), -1.5); /* Variables intermediaires */
      rx     =pow((pow(((x-i)+h*(s-m)),2)+(pow(((y-j)+h*(w-n)),2))),1.5);
      ry     =pow(((pow((x+h*s),2))+(pow((y+h*w),2))),1.5);
      tx     =x-i+h*s-h*m;
      ty     =y-j+h*w-h*n;
      sx     =pow(((x-i)+h*s-h*m),2);
      sy     =pow(((y-j)+h*w-h*n),2);
        splus  =s - h*G*M*(x+h*s)/ry - h*G*Mj*((x-i)+h*(s-m))/rx;
        wplus  =w - h*G*M*(y+h*w)/ry - h*G*Mj*((y-j)+h*(w-n))/rx;
        x =x+h/2 * ( s+splus ); /* petite-planete, x,y */
        y =y+h/2 * ( w+wplus );
        s =s - (h/2)*G*M*((x*rp) + ((x+h*s)/(pow(((pow((x+h*s),2))+(pow((y+h*w),2))),1.5)))
                +0.02*(((x-i)*pow(((pow((x-i),2))+(pow((y-j),2))), -1.5))+(tx*(pow((sx+sy),-1.5)))));
        w =w - (h/2)*G*M*((y*rp) + ((y+h*w)/(pow(((pow((x+h*s),2))+(pow((y+h*w),2))),1.5)))
                +0.02*(((y-j)*pow(((pow((x-i),2))+(pow((y-j),2))), -1.5))+(ty*(pow((sx+sy),-1.5)))));
        mplus  =m - h*G*M*((i+h*m)/(pow(((pow((i+h*m),2))+(pow((j+h*n),2))),1.5))) ;
        nplus  =n - h*G*M*((j+h*n)/(pow(((pow((i+h*m),2))+(pow((j+h*n),2))),1.5))) ;
        i =i+h/2 * ( m+mplus );  /* super-Jupiter, i,j */
        j =j+h/2 * ( n+nplus );
        m =m - (h/2)*G*M*(((i) *pow(((pow(i,2))+(pow(j,2))), -1.5)) + ((i+h*m)*(pow(((pow((i+h*m),2))+(pow((j+h*n),2))),-1.5))));
        n =n - (h/2)*G*M*(((j) *pow(((pow(i,2))+(pow(j,2))), -1.5)) + ((j+h*n)*(pow(((pow((i+h*m),2))+(pow((j+h*n),2))),-1.5))));
        rayon1[k]=pow(((pow(y,2))+(pow(x,2))), 0.5);
        rayon2[k]=pow(((pow(i,2))+(pow(j,2))), 0.5);
        moyenne1+=rayon1[k]/NPAS;
        moyenne2+=rayon2[k]/NPAS;
        t[k+1] =t[k] +h ;
        }
        fbase=1500*6.2832/NPAS;             /*La frequence de base */
        for (kx=1; kx<NPAS;kx++)    /*Les nombres d'onde */
         {
         ak[kx]=0.;
         bk[kx]=0.;
         for (k=0; k<fabs(NPAS/10); kx++)
            {
            ak[kx]+=(3000./NPAS)*(rayon1[k]-moyenne1)*cos(kx*fbase*t[k]);
            bk[kx]+=(3000./NPAS)*(rayon2[k]-moyenne1)*sin(kx*fbase*t[k]);
            }
         Pk[kx]=ak[kx]*ak[kx]+bk[kx]*bk[kx];  /* Spectre de puissance */
         }
       for (kx=1; kx<fabs(NPAS/10);kx++)
         {
          plcol0(3);
          pljoin (kx*fbase,Pk[kx],(kx+1)*fbase,Pk[kx+1]);
         }
    plend();
    }
    Comment faire pour régler ce fâcheux problème?

    -----

  2. #2
    invite4492c379

    Re : Erreur de segmentation (séries de Fourier)

    Hello,

    d'abord indenter ton code un peu mieux, ensuite enlever les références à une bibliothèque que tout le monde ne possède pas et le mettre en spoiler pour éviter d'avoir un message de 30 pieds de long :

     Cliquez pour afficher


    Ensuite essayer le mode debug (très utile pour debugguer) ...

    J'ai rapidement compilé ton code, puis l'ai exécuter en mode debug. Un bus error sur la ligne 135 :
    bk[kx] += (3000. / NPAS) * (rayon1[k] - moyenne1) * cos (kx * fbase * t[k]);

    Un rapide coup d'oeil sur la boucle for me laisse penser à un pb :

    for (k = 0; k < fabs (NPAS / 10); kx++)

Discussions similaires

  1. Séries de Fourier
    Par invite6c037a13 dans le forum Mathématiques du supérieur
    Réponses: 0
    Dernier message: 04/11/2008, 19h51
  2. Séries de Fourier et séries
    Par Bleyblue dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 16/05/2008, 20h06
  3. Erreur de segmentation sous fedora
    Par invite70eda27f dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 26/02/2008, 21h02
  4. Séries de fourier
    Par invite6ecbe51b dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 03/02/2008, 14h56
  5. c++:erreur de segmentation!
    Par invitef666d0fa dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 06/12/2006, 18h36