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;
}