Turbo pascal fonction : série exponentielle

Fermé
kaelad - 25 févr. 2009 à 21:11
 Fanaps - 28 déc. 2014 à 17:07
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.
A voir également:

5 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
25 févr. 2009 à 22:45
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 !
0
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.
0
Univ_Béchar
24 nov. 2011 à 18:57
Bonsoir , Programme Factorielle

program factoriel ;
Uses Crt ;
var
d,n : integer ;
function fact( n:integer):integer ;
var c,i : integer ;
begin
c := 1 ;
If n = 0 Then
c:=1;
If n > 0 Then
For i := 1 To n do
c := c * i;
Fact := c ;
end;
BEGIN
Clrscr;
write (' Entrez nombre de Factoriel : ') ;
Read (n);
d := fact(n);
Write ('Fact(',n,')=', d );
ReadKey;
END.
0
Fanaps > Univ_Béchar
28 déc. 2014 à 17:07
L'idee et vrai, mais je une autre idee pour la calcul de factorielle; le voila

PROGRAM calcul_fact;
USES WINCRT;
VAR n,k:integer; fact:longint;
BEGIN
Write('entre un nombre: ');
Readln(n);
fact:=1
For k:=2 to n do fact:=fact*k;
Writeln('le factoriele de ,'n',' est : ', fact)
END.

Essayez Ça... ;) ;) ;) ;)
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
28 févr. 2009 à 12:33
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)
0
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 !
0
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
2 mars 2009 à 10:31
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
0