Programmation d'une somme infinie

Discussion générale entre passionnés et amateurs de mathématiques sur des sujets mathématiques variés
Mendz.Essomb.F
Messages: 9
Enregistré le: 19 Déc 2011, 18:18

programmation d'une somme infinie

par Mendz.Essomb.F » 25 Nov 2013, 11:06

j'aimerai calculer numériquement la fonction suivante


pouvez vous m'aider par un programme informatique



Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 08:03

par ampholyte » 25 Nov 2013, 11:37

Bonjour,

1) Une somme sur l'infini est impossible numériquement à l'aide d'un programme informatique.

2) Si tu souhaites quand même le faire, tu risques des problèmes assez rapidement à cause du n! car en informatique il y a toujours une limite maximale à la taille d'un nombre.

(On peut évidemment s'arranger pour outrepasser cette limite, en stockant un nombre non pas dans une variable mais dans un tableau, ...) cela te demandera pas mal de temps si tu es débutant dans ce domaine.

Essaye de voir comment se comporte cette somme pour n = 0, n = 1, n = 2, n = 3 et essaye de trouver une hypothèse que tu pourras vérifier par la suite.

Mendz.Essomb.F
Messages: 9
Enregistré le: 19 Déc 2011, 18:18

par Mendz.Essomb.F » 25 Nov 2013, 11:47

bonjour, merci pour la réponse.
toutefois,pour les fonctions sinus, cosinus comment procède-t-on

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 08:03

par ampholyte » 25 Nov 2013, 12:00

Je ne comprends pas ta question. Pourquoi me parles-tu de fonction sinus ou cosinus ? En quel langage programmes-tu ?

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 13:39

par Dlzlogic » 25 Nov 2013, 13:00

Bonjour,
Si on est sur que cette somme converge, on peut toujours essayer de faire un calcul et constater qu'à partir d'un certain moment ça ne bouge plus avec 14 chiffres significatifs (double) et décider que c'est la limite. J'ai fait cette manipe sur un défi posé par Ben314, ça marche très bien.

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5475
Enregistré le: 27 Nov 2007, 16:25

par leon1789 » 25 Nov 2013, 13:20

Parfois la convergence d'une série alternée est très lente, mais grâce à la factorielle il n'y a pas ce souci sur l'exemple donné par Mendz.Essomb.F. En plus, c'est une >, donc on peut majorer très facilement l'erreur à tout instant. Tout ça est impeccable pour un calcul numérique brutal.

Mais on peut aussi calculer préalablement la série de manière formelle.



ou, si on divise par (4n)! et non 4.n!



C'est peut-être pour cela que Mendz.Essomb.F parle de cosinus ??

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21512
Enregistré le: 11 Nov 2009, 22:53

par Ben314 » 25 Nov 2013, 14:42

Mendz.Essomb.F a écrit:j'aimerai calculer numériquement la fonction suivante


pouvez vous m'aider par un programme informatique

Ce genre de truc, à programmer, ça ne pose pas de problèmes particulier, mais il ne faut surtout pas calculer les termes "directement" (en particulier la factorielle) :
Algo a écrit:S=0; n=0; U=1/4; Y=(X^2)^2; {X donné précédement}
tant que U0 faire
S=S+U; n=n+4; U=-U*Y/(n*(n-1)*(n-2)*(n-3));
fin du temps que
L'algo utilise le fait que, si on doit calculer TOUT les pour n de 0 à N, le plus rapide est de les calculer par récurrence : et pour
Le "U0" peut éventuellement être remplacé par un "abs(U)<0.0000000001", mais dans presque tout les langage que je connais, U fini par valoir (assez rapidement) exactement 0.

Attention par contre à la précision que tu as concernant le résultat (principalement si x est un peu grand).
Si par exemple ta machine à une précision relative de 14 chiffres, elle va faire des tas de soustractions de nombre assez grands et, éventuellement, assez proche les uns des autres. Comme dans ce cas ce sont les erreurs absolues (et pas relatives) qui s'ajoutent, le résultat risque d'étre trés peu précis, voire même... trés différent du vrai résultat théorique si x est vraiment grand (c'est souvent LE exemple que l'on donne pour montrer qu'il ne faut pas confondre erreur absolue et erreur relative)

En fait, l'erreur absolue que tu aura sur le résultat sera de l'ordre de l'erreur absolue du plus grand des termes de la suite (=taille du plus grand des multiplié par la précision relative de la machine)
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 13:39

par Dlzlogic » 25 Nov 2013, 15:54

e "U0" peut éventuellement être remplacé par un "abs(U)<0.0000000001", mais dans presque tout les langage que je connais, U fini par valoir (assez rapidement) exactement 0.

Avec ma machine, je n'ai pas réussi à avoir 0.
En fait, une variable en virgule flottant ne peut valoir 0 à coup sûr que si on lui a donné la valeur 0.

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5475
Enregistré le: 27 Nov 2007, 16:25

par leon1789 » 25 Nov 2013, 17:10

Pas d'accord : si tu prends le nombre flottant strictement positif minimal (en fonction du codage des flottants, genre IEEE 754) et que tu le divise par 10, le résultat ne peut pas valoir autre chose que 0 pile.
Bref, si tu prends x=1.1 et que tu le divise par 10 mille fois, ça devrait donner 0 pile.
https://fr.wikipedia.org/wiki/IEEE_754

Mendz.Essomb.F
Messages: 9
Enregistré le: 19 Déc 2011, 18:18

par Mendz.Essomb.F » 27 Nov 2013, 20:26

bonjour, merci leon 1789 pour l'égalité. c'est plus facile à présent de calculer

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 13:39

par Dlzlogic » 27 Nov 2013, 21:11

leon1789 a écrit:Pas d'accord : si tu prends le nombre flottant strictement positif minimal (en fonction du codage des flottants, genre IEEE 754) et que tu le divise par 10, le résultat ne peut pas valoir autre chose que 0 pile.
Bref, si tu prends x=1.1 et que tu le divise par 10 mille fois, ça devrait donner 0 pile.
https://fr.wikipedia.org/wiki/IEEE_754

Tu n'es pas d'accord qu'avec ma machine, je n'arrive pas avoir zéro pile, ou tu n'est pas d'accord avec ma seconde phrase (cas général de comparaison de flottants avec 0).
Dans le premier cas, je t'invite à venir voir, dans le second, tu devrais faire un essai avec la tienne.

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 27 Nov 2013, 21:21

Citation:
e "U0" peut éventuellement être remplacé par un "abs(U)<0.0000000001", mais dans presque tout les langage que je connais, U fini par valoir (assez rapidement) exactement 0.


Avec ma machine, je n'ai pas réussi à avoir 0.
En fait, une variable en virgule flottant ne peut valoir 0 à coup sûr que si on lui a donné la valeur 0.

C'est pas parce que t'es incapable d'avoir 0 que l'algorithme ne finira pas par assigner 0 à la variable.
la vie est une fête :)

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 13:39

par Dlzlogic » 27 Nov 2013, 22:22

Je pense tout de même que cette affirmation mérite une vérification ou un exemple, à défaut de preuve.
Le test est simple
si ( val "strictement égal à zéro") alors "on a trouvé zéro".
En C, ça s'écrit
if (val == 0.0) printf("on a trouvé ZERO\n");
Bien entendu val est un float ou double, initialisé comme on veut et qui a été divisé par 10 ou ce qu'on veut le nombre de fois que l'on veut.
Rappelle toi, je te l'ai montré avec une simple division par 2 avec Excel.
Pour la modération : ceci est très important. Ce test et la vérification de cela est très facile.
Petit détail, l'impression qui donnerait val = 0.00000 n'offre aucun intérêt, c'est le test "val == 0.0" dont il s'agit.
PS @ FE, je te l'avais montré, ou tu avais tout simplement zappé ?

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5475
Enregistré le: 27 Nov 2007, 16:25

par leon1789 » 27 Nov 2013, 22:40

Dlzlogic a écrit:Tu n'es pas d'accord qu'avec ma machine, je n'arrive pas avoir zéro pile, ou tu n'est pas d'accord avec ma seconde phrase (cas général de comparaison de flottants avec 0).
Dans le premier cas, je t'invite à venir voir, dans le second, tu devrais faire un essai avec la tienne.

Comme dirais-je ...

Si tu n'arrives pas à obtenir 0 pile, ben c'est que tu ne sais pas t'y prendre, comme souvent...

Et voici un petit programme qui montre qu'on obtient 0 pile après 324 divisions de 1.1 par 10 ,
ce qui est normal puisque le plus petit flottant double précision >0 est :

Code: Tout sélectionner


function test() {
    var i = 1.1 , j ;

    alert ("en divisant 1.1 par 10.0 un grand nombre de fois...") 

    for(j = 0; i>0.0 ; j++) {i = i / 10.0 }

    if (i==0.0) {alert("... on finit par obtenir 0 pile !")}

    alert([i,j]);
}

test() ;



Si tu n'as pas envie de copier/coller, tu n'as qu'à cliquer ici pour voir son exécution :
http://leon1789.perso.sfr.fr/tmp/dlzlogic.html

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5475
Enregistré le: 27 Nov 2007, 16:25

par leon1789 » 27 Nov 2013, 22:48

Dlzlogic a écrit:Avec ma machine, je n'ai pas réussi à avoir 0.
En fait, une variable en virgule flottant ne peut valoir 0 à coup sûr que si on lui a donné la valeur 0.
Dlzlogic a écrit:Tu n'es pas d'accord qu'avec ma machine, je n'arrive pas avoir zéro pile, ou tu n'est pas d'accord avec ma seconde phrase (cas général de comparaison de flottants avec 0).
Dans le premier cas, je t'invite à venir voir, dans le second, tu devrais faire un essai avec la tienne.

Comment dirais-je ?...

Si tu n'arrives pas à obtenir 0 pile, ben c'est que tu ne sais pas t'y prendre, comme souvent...

Et voici un petit programme JavaScript qui montre qu'on obtient 0 pile après 324 divisions de 1.1 par 10 ,
ce qui est normal puisque le plus petit flottant double précision >0 est :

Code: Tout sélectionner


function test() {
    var i = 1.1 , j ;

    alert ("en divisant 1.1 par 10.0 un grand nombre de fois...") 

    for(j = 0; i>0.0 ; j++) {i = i / 10.0 }

    if (i==0.0) {alert("... on finit par obtenir 0 pile !")}

    alert([i,j]);
}

test() ;



Si tu n'as pas envie de copier/coller, tu n'as qu'à cliquer ici pour voir son exécution :
http://leon1789.perso.sfr.fr/tmp/dlzlogic.html

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 27 Nov 2013, 22:55

Je pense tout de même que cette affirmation mérite une vérification ou un exemple, à défaut de preuve.

non je la vérifie pas. C'est une évidence. Si tu veux le vérifier comme il faut, tu prends ton débugger et tu inspectes tes registres.
Chose que je ferai pas pour ça, parce que ca m'intéresse pas.

Tu peux la vérifier également avec un stupide test d'égalité. Mais comme tu contestes l'écriture de ==, il vaut mieux que tu fasses le test ci-dessus...

Ou bien, tu lis la spec du C qui doit forcément dire ce qu'il se passe lorsque la précision de la machine ne suffit plus à représenter le nombre voulu.
Chose que je ferai pas non plus, parce que j'en ai pas besoin.

De manière plus générale, je sens que on va encore s'embourber, donc pour les prochaines interventions de Dlzlogic.
mon silence n'équivaut pas à mon adhésion (ni mon refus)
la vie est une fête :)

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 13:39

par Dlzlogic » 27 Nov 2013, 23:07

Bon, j'ai compris, je peux rien dire de plus.
Donc, je laisse tomber.

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5475
Enregistré le: 27 Nov 2007, 16:25

par leon1789 » 27 Nov 2013, 23:13

Dlzlogic a écrit:Bon, j'ai compris, je peux rien dire de plus.
Donc, je laisse tomber.

:ptdr: Tu pourrais au moins dire merci pour les exemples élémentaires qu'on te donne ...

Avatar de l’utilisateur
leon1789
Membre Transcendant
Messages: 5475
Enregistré le: 27 Nov 2007, 16:25

par leon1789 » 27 Nov 2013, 23:59

Dlzlogic a écrit:Bon, j'ai bien-sûr regardé, j'ai eu une page blanche.
Je viens de recommencer, c'est pareil.

:doh: tu ne vois rien :cry:
Tu n'as vraiment pas de chance : de mon coté, j'ai testé le script avec 4 navigateurs différents sur 4 OS différents, et j'ai toujours eu un résultat à l'écran (sous forme de 3 fenêtres d'alerte successives...)
Ne serait-ce pas là ta mauvaise foi habituelle ?

Dlzlogic a écrit:Disons que, pour ne pas envenimer la discussion, j'ai pas régi.
Bon, j'accepte tout ce que tu veux, FE aussi, que voulez-vous que j'y fasse ?
S'il te plait, fin de discussion, d'ailleurs, tu as bien explique que j'étais pas crédible (on appelle ça de la diffamation), FE a confirmé que j'étais un incompétent sénile, alors tout va bien.
Couche-couche-dodo.

De la diffamation ! :ptdr:

Dlzlogic a écrit:Petit sursaut d’honnête de ma part, pour les débutants en informatique : il ne faut pas tester l'égalité de deux flottants avec le signe '==', sauf si on l'a initialisé comme tel.

Je ne comprends pas vraiment : c'est bien toi qui a écrit cela :
Dlzlogic a écrit:Je pense tout de même que cette affirmation mérite une vérification ou un exemple, à défaut de preuve.
Le test est simple
si ( val "strictement égal à zéro") alors "on a trouvé zéro".
En C, ça s'écrit
if (val == 0.0) printf("on a trouvé ZERO\n");
Bien entendu val est un float ou double, initialisé comme on veut et qui a été divisé par 10 ou ce qu'on veut le nombre de fois que l'on veut.

alors on teste avec == ou pas ? ...et on initialise comme on veut ou pas ?? :stupid_in

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 13:39

par Dlzlogic » 28 Nov 2013, 00:26

Je ne cherche pas à polémiquer.
Toi, Léon, tu ne fais pas de développent, mais il y a des visiteurs de ce forum qui en font. alors il faut se souvenir de ceci : pour une comparaison d'égalité de deux flottants V1 et v2, il faut faire ceci (langage C, testé aussi avec Excel. PHP, j'ai pas essayé) :
if (fabs(V1 - v2) < epsilon) ...
epsilon très petit, par exemple 1.E-50.
Et certainement pas : if (V1 == v2) ...
C'est tellement vrai que ça ne mérite pas de discussion.

Oui, j'ai vu ton script.
Fais la même chose en C et on verra.
La variable i est déclarée, on ne sait comment.
Javascript est un langage interprété, donc, à chaque itération une variable prend une valeur disons "affichable", ou arrondie, comme tu voudras.
Manifestement tu n'as pas lu le gros document expliquant tout cela. Désolé, j'ai perdu les références. Tu vas me dire "trop facile", comme tu voudras.
Fais le même test sur Excel, et on en reparle.
J'aime bien quand tu parles de bonne foi ou de mauvaise foi. :hum:
Juste une question, et j'aimerais bien que tu répondes : pourquoi penses-tu que j'insiste tellement sur ce point ? Pour contredire des "sachant" comme toi ?
C'est marrant, c'est toujours moi qui évoque ce problème, fondamental en informatique.

 

Retourner vers ⚜ Salon Mathématique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 5 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite