Rechercher : dans
Par :

Turbo pascal fonction : série exponentielle

Dernière réponse le 2 mar 2009 à 10:31:46 kaelad, le 25 fév 2009 à 21:11:06 
 Signaler ce message aux modérateurs

Bonjour à tous !
Je suis élève d'ECE et je boque sur un programme.
J'vous en prie, je ne veux pas la réponse, mais des indices qui me débloqueront.
L'exercice est le suivant :
Nous avons une somme sigma ( premier terme k=0, dernier terme n) pour (x^k)/k! pour x strictement positif.
Le but de l'exercice de calculer sa valeur.

Voilà ce que j'ai fait.

program nom;
var : x,k,fact,n:integer; var s,e,:real;
begin
repeat writeln('x'); readln(x); until (x>=0);
repeat writeln('n'); readln(n); until (n>=0);
fact:=1; e:=1;
for k:=1 to do n do fact:=fact*k;
e:=e+1/fact;
if x=1 then begin
s:=n+1;
writeln(s*e);
end else begin s:=(1-exp((n+1)*ln(x)))/(1-x);
writeln(s*e);
end;
readln;
end.

Donc, peut être que ce n'est pas ça DU TOUT ! Confusion de tout, ca se pourrait bien. Ce qui me gêne c'est la somme de 1/k! en plus, sinon la somme de x^k je connais.
Ensuite la somme que j'étudie ressemble beaucoup à une série exponentielle, et ici elle serait = à e^x, mais on veut pas sa convergence.
Et dans le cas ( on ne sait jamais :p ) où je suis dans la bonne voie, dites moi juste ce qui ne va pas, rectifiez moi !

A vous lecteur, je vous remercie.

Configuration: Windows XP
Internet Explorer 7.0

1

KX, le 25 fév 2009 à 22:45:44

D'un point de vue théorique, effectivement on a :
exp(x)=limite(quand n tend vers l'infini) somme(pour k allant de 0 à n) x^k/k!

Dans ce cas on pourra donc prendre x réel et pas seulement entier positif !

Pour le calcul de fact je suis d'accord sauf que :
_ il y a un do en trop dans l'écriture de ta boucle
_ tu le calcule qu'une seule fois alors qu'il te faut faire le calcul n fois avec n valeurs différentes !

Par contre ce n'est pas le but ici d'utiliser la formule avec exp et ln pour calculer x^k, parce que c'est trop lourd, d'autant que comme précédemment tu vas devoir faire n fois le calcul (d'abord avec 1, puis x, puis x²...)

En fait ce que tu calcules ici (ou ce que t'essayes de calculer) c'est x^n/n! et ce n'est pas ce que tu veux...

Prends trois accumulateurs factorielle, puissance et somme, initialisés pour k=0
Puis fait une boucle pour k allant de 1 à n, à chaque tour de boucle tu met à jour k!, x^k, et ta somme

Et à la fin le résultat obtenu sera la somme ! La confiance n'exclut pas le contrôle 

Répondre à KX

2

kaelad, le 28 fév 2009 à 12:03:32
  • +1

Bonjour !
Un do en trop, en effet erreur de frappe.
Déja , pour x = 2 et n = 2, est ce que le résultat de cette somme sigma fait 5 ?

Ensuite mon grand problème est de faire la somme des puissances et des factiorielles

Je suis d'accord pour factorielle c'est
e:=1; f:=1; g:=1;
for k:=1 to n do f:=f*k;
e:=e+f;
g:=g*x;

mais pour la somme?? je crois avoir oublié aussi un élément pour x^k

ah oui question de plus, quand on doit dériver par les x somme sigma de x^k/k!, la somme nous dérange pas, on dérive normalement ? Merci à vou.

Répondre à kaelad

3

KX, le 28 fév 2009 à 12:33:41

Quand on dérive une somme il faut faire la somme des dérivées c'est à dire que tous tes indices vont s'en retrouver modifier : sigma(x^k,k=a..b)'=sigma((k+1)*x^k,k=a..b-1)

Effectivement pour x=2 et n=2 tu vas avoir 1/1 + 2/1 + 4/2 = 5
Et ensuite, 1/1 + 2/1 + 4/2 + 8/6 + 16/24 + 32/120 ... = exp(2) ~ 7.389

En ce qui concerne ta somme des puissances et de tes factorielles tu auras une boucle

for k:=1 to n do
begin
factorielle:=factorielle*k;
puissance:=puissance*x;
somme:=somme+puissance/factorielle;
end;

Il faut juste que tu initialises correctement tes accumulateurs (quand n=0) La confiance n'exclut pas le contrôle 

Répondre à KX

4

kaelad, le 28 fév 2009 à 12:58:55

Je vous remercie.
initialisation pour n=0 ( je place avant la boucle for ) : factorielle:=1; puissance:=1; somme:=1;
Pour n=0, j'ai fait différent calcul avec le programme, et je trouvais toujours 1.
Ce qui me semble correcte, puisque si nous prenons x=3 et n=0, on a 3^0/0! = 1
Grâce à vous j'ai compris mes erreurs et mes lignes inutiles sur turbo.

D'ailleurs factorielle:=1/factorielle*k;
puissance:=puissance*x;
somme:=somme=factorielle*puissance;

devrait marcher aussi, je vais l'essayer !

Répondre à kaelad

5

kaelad, le 28 fév 2009 à 13:04:33

En fait, ça ne marche pas.
D'une part factorielle passe en real. Et le résultat n'est pas le même quand l'on fait cette somme pour n=2 et x=2.
Je pense qu'il ne faut pas faire le plus compliqué, somme:=somme+puissance/factorielle convient très bien.
Encore merci.

Répondre à kaelad

6

kaelad, le 28 fév 2009 à 13:10:07

En fin de compte ça marche ! J'avais oublié les parenthèses à factorielle:=1/(factorielle*k);
Mais ce qui est intéressant de comprendre c'est que si on met puissance et factorielle en real ou integer, ca ne change rien. et dans le cas d'une fraction, on le met obligatoirement en real.
Désolé de l'innondation.

Répondre à kaelad

7

 KX, le 2 mar 2009 à 10:31:46

Tu ne peut pas faire factorielle:=1/(factorielle*k) sinon tu auras :
0!=1, 1!=1/(1*1)=1, 2!=1/(1*2)=1/2 !!! Or 2!=2, c'est pour ça qu'il faut faire factorielle:=factorielle*k et seulement après (dans somme) diviser par la factorielle
Normalement tu dois mettre x, puissance, et somme dans le meme type, par contre la factorielle est toujours entière donc il faut la mettre en integer (sinon on a des approximations) sauf pour les très grandes valeurs de n La confiance n'exclut pas le contrôle 

Répondre à KX