[RESOLU] Calcul d'une série

Calcul d'une série [RESOLU] - C++ - Programmation

Marsh Posté le 22-11-2012 à 20:36:48    

Bnjour a tous !
 
J'ai à trouver les résultats de cette série et les résultats que j'obtiennent ne sont pas bons ...
 
http://www.jppanaget.com/lib/exe/fetch.php/serie.jpg
 
Mon code :  
 

Code :
  1. for (int k=0; k<25; k++){
  2.         for (int n=1;n<100; n++){   
  3.              num=4*sin((double)(n*PI*P_controle[k][0]))*((-1)^(n)-1)*sinh((double)(n*PI*(1-P_controle[k][1])));
  4.              den=(sinh((double)(n*PI))*(n^3)*(PI*PI*PI));
  5.              if(den!=0){
  6.              SolutionExacte[k]=SolutionExacte[k]-num/den;
  7.              }     
  8.     }


 
avec P_controle[k][0] et P_controle[k][1], les coord en x et y du point k
 
Alors je ne comprend pas pourquoi mes results ne sont pas bon .. Voyez vous quelque chose qui cloche ?


Message édité par JPP78750 le 22-11-2012 à 21:55:13

---------------
http://www.jppanaget.com
Reply

Marsh Posté le 22-11-2012 à 20:36:48   

Reply

Marsh Posté le 22-11-2012 à 21:18:12    

Bonsoir !
 
Tout d'abord, quelques questions idiotes, mais je préfère être sûr :)
 
 * Les variables num et den sont-elles bien déclarées en double ?
 * Comment est défini PI ? (vous n'indiquez pas quelle plateforme vous utilisez)
 * Les éléments du tableau "SolutionExacte" sont-ils bien initialisés à 0 ?
 * Avez-vous noté des différences importantes dans vos résultats si vous augmentez le nombre de valeurs de la série ?
 
Ensuite, quelques remarques sur le code :  
 * Cela ne change rien aux résultats, mais le test "if (den != 0)" est inutile, car il ne peut être nul que si n vaut 0, ce qui n'est jamais le cas,
 * Pour gagner en précision, sortez les invariants de boucle du "for" : ne divisez par "PI*PI*PI" qu'une fois que vous avez terminé le calcul de votre série,
 * Pourquoi faire les calculs sur les nombres pairs ? Sauf erreur de ma part, le numérateur vaut 0 pour ces nombres.
 
C'est tout ce que je vois en première lecture ... De quel ordre sont les écarts que vous constatez ?
 

Reply

Marsh Posté le 22-11-2012 à 21:27:31    

Bonsoir Farian et merci pour ta réponse:
*num et den sont bien déclarés en double et initialises à 0 tout comme les éléments de SolutionExacte;
Pi est déclaré comme ça : double PI = 3.141592;
Oui il y a des diff importants.
 
Par contre, si je n'ai pas le "if (den != 0)", les results ne sont plus du tout bon : les résultats deviennent inf ou nan ...  
Je ne me l'explique pas ...  
 

Code :
  1. double SolutionExacte[25];
  2.     double PI = 3.141592;
  3.     double num=0;
  4.     double den=0;
  5.     for (int k=0; k<25; k++){
  6.         SolutionExacte[k]=0;
  7.     }
  8.     for (int k=0; k<25; k++){
  9.         for (int n=1;n<100; n++){
  10.            
  11.            
  12.     num=4*sin((double)(n*PI*P_controle[k][0]))*((-1)^(n)-1)*sinh((double)(n*PI*(1-P_controle[k][1])));
  13.     den=(sinh((double)(n*PI))*(n^3));
  14.    // if(den!=0){
  15.     SolutionExacte[k]=SolutionExacte[k]-num/den;
  16.     //}
  17.            
  18.     }
  19.         SolutionExacte[k]=SolutionExacte[k]/PI/PI/PI;
  20.         printf("    solution en %i :  %2.4f \n",k,SolutionExacte[k]);
  21.      }


 
Merci pour les conseils


Message édité par JPP78750 le 22-11-2012 à 21:29:44

---------------
http://www.jppanaget.com
Reply

Marsh Posté le 22-11-2012 à 21:34:27    

trop puissant ^^
t'as pas de pow [:moundir]


Message édité par antiseptiqueincolore le 22-11-2012 à 21:35:26
Reply

Marsh Posté le 22-11-2012 à 21:37:28    

Ha ! C'est clairement du coté du calcul de den qu'il faut creuser ... Car ce n'est vraiment pas normal ...
 
Je vous conseillerais cette approche :  
 
Vérifiez déjà que vous arrivez parfois à des valeurs nulles (en mettant un else), puis décomposez son calcul ...
 
Par ailleurs, j'aurais tendance à vous conseiller d'augmenter la précision de votre déclaration de PI ou, encore mieux, de déclarer :  
 
double PI = 2*acos(0);
 
Comme ça, vous aurez toute la précision possible ! Vu la rapidité de croissance des fonctions hyperboliques, on peut vite arriver à un écart important.
 
Et après, je reste sec ... Je vais tenter de faire des tests sur une VM :)
 

Reply

Marsh Posté le 22-11-2012 à 21:50:15    

Bon bin c'était bien le coup des pow ... Ca marche nickel maintenant. Merci pour votre aide !


---------------
http://www.jppanaget.com
Reply

Marsh Posté le 22-11-2012 à 21:52:41    

:jap:

Reply

Marsh Posté le 22-11-2012 à 21:54:44    

En effet ...
 
En revanche, je suis surpris que vous n'ayez pas de problème ...
Quelles sont vos valeurs dans le tableau P_controle ? Car on arrive vite aux limites de la fonction sinh, dont le résultat dépasse la valeur maximale d'un flottant dès que son paramètre dépasse un peu trop +/- 700 ...  
 
Note : Se flageller plus tard, pour ne pas avoir vu que l'opérateur "OU exclusif" était utilisé au lieu de la puissance ... :) :) :)

Reply

Marsh Posté le 22-11-2012 à 21:58:08    

Je me suis déjà flagellé ^^  
Dans P_controle, ce sont les coordonnées d'une grille régulière genre [0.25;0.25] ... [0.25][0.75]...


---------------
http://www.jppanaget.com
Reply

Marsh Posté le 22-11-2012 à 22:00:24    

Effectivement, cela peut passer avec 100 éléments dans la série. Dans mon exemple, j'avais pris des valeurs de l'ordre de 5 pour les y, et je voyais apparaître nos amis "inf" et "nan"


Message édité par Farian le 22-11-2012 à 22:01:23
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed