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 :

Travail de méthodes numériques


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Par défaut Travail de méthodes numériques
    Bonjour ^^
    Je sais pas trop si je poste dans la bonne section donc veuillez m'excuser si je me suis trompé
    Je suis étudiant et j'ai un travail de méthodes numériques à faire mais je ne suis pas très doué Le travail à faire est de créer un programme réalisant les calculs de la diffraction de Fraunhofer. Le programme doit être en C et les graphes tracés avec gnuplot, le tout sous linux. Un sujet similaire au mien se trouve ici (seule la première partie "Rappels" m'a été distribuée).
    Le programme que j'ai fait est très basique:une fonction transmitance et une fonction calculant l'intégrale en chaque point (c'est une simple méthode des rectangles).
    Seulement, si j'augmente le pas d'intégration, l'ordinateur met beaucoup trop de temps pour faire les calculs Je me retrouve limité à un pas de 1 et le résultat est totalement inexploitable...
    En fait l'intégrale à calculer est complexe mais le résultat qui m'intéresse pour le tracé du graphe (l'intensité) est réel et correspond à AA* (A étant l'intégrale écrite sur le sujet). J'aimerai savoir s'il n'y a pas une méthode un peu plus précise que celle que j'utilises ^^' On m'a conseillé d'utiliser la transformée de Fourier seulement ça a pas l'air simple à programmer...

    Voila, j'espères que quelqu'un pourra m'aider un peu ^^ Merci

    Edit: Oops, j'oublie de poster 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
    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
     
    #include<math.h>
    #include<stdio.h>
    #include<stdlib.h>
     
    #define N 10
     
    int transmitance(double lx, double ly, double x, double y);
     
    double sommeReelle(double lx, double ly, double pas, double X, double Y, double constante);
     
    double sommeImmaginaire(double lx, double ly, double pas, double X, double Y, double constante);
     
    int main()
    { 
      double X[N], Y[N], I[N][N];
      double x, y;
      double lx, ly;
      int i, j;
      double pas =1;
      double f, lamda;
      double constante = (2*M_PI)/(lamda*f);
      FILE *fp;
     
      for(i=0;i<=N;i++)   //discrétisation des axes X et Y
      {
         X[i]=-N/2+i*pas;
         Y[i]=X[i];
      }
     
      fp = fopen("intensite.data","w");
     
      printf("Entrez lx et ly:");
      scanf("%lf %lf",&lx,&ly);
     
      printf("Entrez lamda et f:");
      scanf("%lf %lf",&lamda,&f);
     
      for(i=0;i<=N;i++)
      {
          for(j=0;j<=N;j++)
          {
    I[i][j]=pow(sommeReelle(lx,ly,pas,X[i],Y[j],constante),2)+pow(sommeImmaginaire(lx,ly,pas,X[i],Y[j],constante),2);
    fprintf(fp,"%lf %lf %lf \n",X[i],Y[j],I[i][j]);
          }
      }
     
      fclose(fp);
     
      return 0;
    }
     
    int transmitance(double lx, double ly, double x, double y)
    {
      int valeurTransmitance = 0;
      if( (x<=lx/2)&&(x>=-lx/2)&&(y<=ly/2)&&(y>=-ly/2) )
        valeurTransmitance = 1;
     
    return valeurTransmitance;
    }
     
    double sommeReelle(double lx, double ly, double pas, double X, double Y, double constante)
    {
      int x, y;
      double somme = 0;
      for(x=-N/2;x<=N/2;x+=pas)
      {
        for(y=-N/2;y<=N/2;y+=pas);
        {
             somme=somme+pas*pas*transmitance(lx,ly,x,y)*cos(constante*(x*X+y*Y));
        }
      }
     
    return somme;
    }
     
    double sommeImmaginaire(double lx, double ly, double pas, double X, double Y, double constante)
    {
      int x, y;
      double somme = 0;
      for(x=-N/2;x<=N/2;x+=pas)
      {
         for(y=-N/2;y<=N/2;y+=pas)
         {
             somme=somme+pas*pas*transmitance(lx,ly,x,y)*sin(constante*(x*X+y*Y));
         }
      }
     
    return somme;
    }

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Il faut d'abord corriger qquelques erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    { 
      double X[N], Y[N], I[N][N];
    ...
      double f, lamda;
      double constante = (2*M_PI)/(lamda*f);
    lamda et f ne sont pas initialisés et ont n'importe quoi comme valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      for(i=0;i<=N;i++)
      {
          for(j=0;j<=N;j++)
          {
    I[i][j]=pow(sommeReelle(lx,ly,pas,X[i],Y[j],constante),2)+pow(sommeImmaginaire(lx,ly,pas,X[i],Y[j],constante),2);
    i et j ne peuvent prendre la valeur N, sinon on sort des tableaux.
    On verra ensuite pour accélérer le calcul

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Par défaut
    Ok, je vais essayer en modifiant ça, merci ^^ Par contre juste une question, si je sors du tableau, pourquoi la compilation marche?

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Par contre juste une question, si je sors du tableau, pourquoi la compilation marche?
    Parce que le code est syntaxiquement correct.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 7
    Par défaut
    Voilà j'ai essayé ^^ Le résultat est déja mieux, j'arrive à deviner la forme du sinus cardinal ^^ Merci!
    Par contre il y a toujours le problème avec le pas d'intégration, j'ai essayé de le diminuer un peu (0.5) mais ça rallonge condérablement les calculs...

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Peux-tu donner les paramètres typiques du calcul lx, ly, lamda et f ?

Discussions similaires

  1. gradient méthode numérique
    Par utawalpa dans le forum Mathématiques
    Réponses: 0
    Dernier message: 18/01/2010, 22h06
  2. [Débutant] Représentation de fonction par méthode numérique
    Par lucienGr dans le forum MATLAB
    Réponses: 6
    Dernier message: 12/06/2009, 21h31
  3. Réponses: 2
    Dernier message: 22/06/2008, 10h05
  4. Réponses: 12
    Dernier message: 07/06/2007, 21h23
  5. [Debutant] Méthodes numériques
    Par griffu01 dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 24/05/2004, 21h21

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