Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1788 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Pb code calcul de la diffraction fraunhofer par methode numerique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pb code calcul de la diffraction fraunhofer par methode numerique

n°1667526
Anodo-kun
Posté le 08-01-2008 à 10:23:54  profilanswer
 

Bonjour à tous,
 
Voila je post ce message car j'ai un code en langage c à réaliser qui calcule par une méthode numérique la diffraction de fraunhofer. Voici un sujet similaire au mien : http://www.impmc.jussieu.fr/impmc/ [...] 5/td5.html( attention monsujet ne comporte que la partie I).
J'ai utilisé la méthode de simpson pour faire mon calcul d'intégrale. Mon problème ce que mon code me rend une intensité nulle et je ne comprend pas pourquoi ??? :??:. J'ai utilisé 4 fonctions ( F1, F2, F3, F4) pour séparer la partie cosinus et la partie sinus et aussi pour séparer les x des y.
 
Voila si quelqu'un pourrait m'aider un peu car je patauge depuis un petit moment ?!?! :pt1cable: ^^
Merci d'avance !  
 
Voici la code que j'ai réalisé :

Code :
  1. #include <stdio.h>
  2. #include <math.h>
  3.    
  4. #define pi M_PI
  5. /* Longueur d'onde de la source lumineuse */
  6. #define lambda 500e-9
  7. /* Focale de la lentille */
  8. #define f 0.15
  9.        
  10. double F1(double x, double X)
  11. {
  12.     return cos((2*pi/(lambda*f))*(x*X));
  13. }
  14. double F2(double x, double X)
  15. {
  16.     return sin((2*pi/(lambda*f))*(x*X));
  17. double F3(double y, double Y)
  18. {
  19.     return cos((2*pi/(lambda*f))*(y*Y));
  20. }
  21. double F4(double y, double Y)
  22. {
  23.     return sin((2*pi/(lambda*f))*(y*Y));
  24. double simpson(int N, double x1, double x2,double y1, double y2, double X, double Y)
  25. {
  26.     double xx,yy, h1, IappF10, IappF11, IappF12, IappF1, h2, IappF20, IappF21, IappF22, IappF2, IappF30, IappF31, IappF32, IappF3, IappF40, IappF41, IappF42, IappF4,Iapp;
  27.     int NN, i;
  28.    
  29.     // Etape 1
  30.     h1 = (x2 - x1) / N;
  31.     h2 = (y2 - y1) / N;
  32.     // Etape 2
  33.     IappF10 = F1(x1,X) + F1(x2,X);
  34.     IappF11 = 0.0;
  35.     IappF12 = 0.0;
  36.     IappF20 = F2(x1,X) + F2(x2,X);
  37.     IappF21 = 0.0;
  38.     IappF22 = 0.0;
  39.     IappF30 = F3(y1,Y) + F3(y2,Y);
  40.     IappF31 = 0.0;
  41.     IappF32 = 0.0;
  42.     IappF40 = F4(y1,Y) + F4(y2,Y);
  43.     IappF41 = 0.0;
  44.     IappF42 = 0.0;
  45.     // Etape 3
  46.     NN = N -1;
  47.     for (i=1; i<=NN; i++)
  48.     {
  49. // Etape 4
  50. xx = x1 + i*h1;
  51. yy = y1 + i*h2;
  52.    
  53. // Etape 5
  54. if ((i%2) == 0)
  55. {
  56.     IappF12 = IappF12 + F1(xx,X);
  57.     IappF22 = IappF22 + F2(xx,X);
  58.     IappF32 = IappF32 + F3(yy,Y);
  59.     IappF42 = IappF42 + F4(yy,Y);
  60. }
  61. else
  62. {
  63.     IappF11 = IappF11 + F1(xx,X);
  64.     IappF21 = IappF21 + F2(xx,X);
  65.     IappF31 = IappF31 + F3(yy,Y);
  66.     IappF41 = IappF41 + F4(yy,Y);
  67. }
  68.     }
  69.    
  70.     // Etape 6
  71.     IappF1 = (IappF10 + 2.0 * IappF12 + 4.0 * IappF11) * h1 / 3.0;
  72.     IappF2 = (IappF20 + 2.0 * IappF22 + 4.0 * IappF21) * h1 / 3.0;
  73.     IappF3 = (IappF30 + 2.0 * IappF32 + 4.0 * IappF31) * h2 / 3.0;
  74.     IappF4 = (IappF40 + 2.0 * IappF42 + 4.0 * IappF41) * h2 / 3.0;
  75.     // Etape 7
  76.     Iapp = (IappF1*IappF2-IappF3*IappF4)*(IappF1*IappF2+IappF3*IappF4)+(IappF3*IappF2+IappF1*IappF4)*(IappF3*IappF2+IappF1*IappF4);
  77.     // Etape 8
  78.     return (Iapp);
  79. }
  80. int main(int argc, char *argv[])
  81.     int i,n;
  82.     double X,Y,x1,x2,y1,y2;
  83.    
  84.     x1=-0.000025;       /* Borne inferieure sur x*/
  85.     x2=+0.000025;       /* Borne superieure sur x*/
  86.     y1=-0.0025;         /* Borne inferieure sur y*/
  87.     y2=-0.0025;         /* Borne superieure sur y*/
  88.     n=100;              /* Nombre d'iteration */
  89.    
  90.     double I;
  91. /* Creation d'un fichier de donnée contenant l'intensité I(X,Y) demandé */
  92.     FILE *fp;
  93.     fp=fopen("intensite.data","w" );
  94.     for(X=0 ; X<=49 ; X=X+0.1)
  95.     {
  96. for(Y=0; Y<=49; Y=Y+0.1)
  97. {
  98.      I=simpson(n,x1,x2,y1,y2,X,Y);
  99.     fprintf(fp,"%lf %lf %lf\n",I,X,Y);
  100. }
  101.     }
  102.     fclose(fp);
  103. }


mood
Publicité
Posté le 08-01-2008 à 10:23:54  profilanswer
 

n°1667532
Joel F
Real men use unique_ptr
Posté le 08-01-2008 à 10:31:21  profilanswer
 

ta fonction simpson me parait douteuse à vue de nez.
Tu l'as sort de ou ?
 
 
Et accessoirement, c'est du C pas du C++


Message édité par Joel F le 08-01-2008 à 10:54:46
n°1667663
Anodo-kun
Posté le 08-01-2008 à 12:42:43  profilanswer
 

voici le lien ou j'ai trouvé ma fonction simpson que j'ai ensuite adapté à mon pb :  
http://www.cppfrance.com/codes/INT [...] 27783.aspx

n°1667691
nargy
Posté le 08-01-2008 à 13:42:09  profilanswer
 

Code :
  1. #     y1=-0.0025;         /* Borne inferieure sur y*/
  2. #     y2=-0.0025;         /* Borne superieure sur y*/


si c'est une intégration sur un plan, avec ces bornes ça fera 0 pour toute fonction.

n°1667773
Anodo-kun
Posté le 08-01-2008 à 15:04:22  profilanswer
 

ah ouais merci erreur de frappe je suppose :p
je vais corriger ca !

n°1668117
neg'gwada
rafix 971
Posté le 09-01-2008 à 02:24:20  profilanswer
 

theoriquement ce genre de calcul est possible à coup de transformation de fourier, encore plus pour le cas fraunhofer car tu fais des hypothèses sur le fait que tu te trouves à r>>lambda. Passer par du simpson ne semble pas etre la meilleur idée! (apres j'ai pas vraiment tout lu en detail, je parle juste par experience)  [:spamafote]


---------------
--- WinSplit Revolution ---
n°1668696
Anodo-kun
Posté le 10-01-2008 à 09:54:33  profilanswer
 

ouais va falloir que je modifie qque chose car malgré la correction sur les bornes de y ca me rend toujours une intensité nulle ...

n°1668716
Anodo-kun
Posté le 10-01-2008 à 10:46:13  profilanswer
 

je viens d'installer la librairie fftw3. Quelqu'un aurait un site ou un document qui m'expliquerait comment l'utiliser ?? mci d'avance


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Pb code calcul de la diffraction fraunhofer par methode numerique

 

Sujets relatifs
Methode template intelligenteProblème code VBA
calcul coordonnées pixels d'un droite[PHP] Du code dans un echo
Un menu html qui se répéte dans plusieur page mais un seule code ![C++] undefined reference to WinMain@16 sous Code::Blocks
[Delphi] Problème dans un code / N'affiche jamais la variableInsérer une image DANS le code html
Code windows media player 
Plus de sujets relatifs à : Pb code calcul de la diffraction fraunhofer par methode numerique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR