Posez votre question Signaler

Euh... "O(x²)?"? [Résolu]

Yuku 203Messages postés 22 mars 2008Date d'inscription 7 novembre 2011Dernière intervention - Dernière réponse le 17 oct. 2008 à 23:13
Bonjour à tous,
Je suis en train de créer un programme qui calcule la puissance, l'exponentielle, le cosinus et le sinus de deux nombres x et n, à partir de quelques formules.
La formule de l'exponentielle est la suivante :
exp(x) = 1 + (x/1!) + (x^2/2!) + (x^3/3!) + ... + (x^n/n!) + O(x^n)
Tout va bien pour la majorité du calcul, j'ai bien déclaré x et n, et un compteur, etc etc...
Mais qu'est ce que c'est que ce O(x^n)??
Voilà, tout d'abord qu'est-ce-que c'est, et surtout comment le déclarer dans mon programme ?!
Merci d'avance ! :)
Lire la suite 

Euh... "O(x²)?" »

21 réponses
Réponse
+3
moins plus
Salut
Ben...
O(x^n), c'est une fonction, cette notation, c'est une des notations de Landau :
http://fr.wikipedia.org/wiki/Notations_de_Landau

En fait, on note O(x^n) (ici on devrait préciser pour x→+∞), toute fonction f telle que f(x)/x^n est bornée (ici en l'occurrence quand x→+∞).

On note o(x^n) (dans le cas qui nous intéresse, pour x→+∞), toute fonction f telle que lim (f(x)/x^n) = 0 (et donc ici, quand x→+∞).

Ta formule est pas fausse mais on peut la raffiner un peu.
exp(x) = 1 + (x/1!) + (x^2/2!) + (x^3/3!) + ... + (x^n/n!) + O(x^(n+1))
Ou
exp(x) = 1 + (x/1!) + (x^2/2!) + (x^3/3!) + ... + (x^n/n!) + o(x^n)

Bref, ici donc, ton O(x^(n+1)) ou ton o(x^n), c'est
(x^(n+1)/(n+1)!) + (x^(n+2)/(n+2)!) + (x^(n+3)/(n+3)!) + ... (jusqu'à +∞)

Parce qu'en fait, la formule que t'as écrite, c'est juste une écriture moins précise de
exp(x) = 1 + (x/1!) + (x^2/2!) + (x^3/3!) + ... + (x^n/n!) + ... (jusqu'à +∞)

Du coup pour ton programme tu t'en occupes pas trop. Tu choisis un n assez grand et tu calcules ta somme jusqu'à n.
Tu peux améliorer le programme en choisissant le n en fonction de x. En effet, un n qui va te donner des résultats très précis pour un x pas trop grand, va donner des résultats beaucoup moins satisfaisants pour un x plus grand. Du coup, tu peux sommer jusqu'à ce que le premier terme du reste ((x^(n+1)/(n+1)!)) soit inférieur à un petit nombre donné.

Par contre, si tu vas jusqu'à des n relativement grands, pense à utiliser une exponentiation rapide.
http://fr.wikipedia.org/wiki/Exponentiation_rapide
Sinon ça va ramer...

Et dernière chose, je pense que si t'essaies de calculer l'exponentielle d'un grand nombre de cette manière (Quel sera exactement "grand" ? Ben je sais pas trop...), tu vas rapidement avoir des soucis. En effet, x^n→+∞) (tout au moins pour x > 1) et n!→+∞.
En théorie (x^n/n!)→+0 mais numériquement, tu vas avoir à évaluer le quotient de deux grands nombres et t'auras des erreurs numériques monstrueuses. Et en plus, passé n=170, le résultat du calcul de n! sera tout simplement +∞.

Voilà... Amuse-toi bien ! ;-)
Ajouter un commentaire
Réponse
+3
moins plus
Oui aussi.
Sinon, une autre manière, tu peux calculer en deux fois.
Si tu veux calculer la somme jusqu'à 4*N+3N est donné.
sinx= 0;
for (n=0; n<=N; n++) {
        fact=factorielle(4*n+1);
	sinx = sinx + (x^(4*n+1))/fact;

}
for (n=0; n<=N; n++) {
        fact=factorielle(4*n+3);
	sinx = sinx - (x^(4*n+3))/fact;

}
Ajouter un commentaire
Réponse
+2
moins plus
Bonsoir

Sans entrer dans les détails, ça veut simplement dire un terme négligeable. Donc tu n'as pas à t'en soucier.
Mais pour appliquer ce genre de formule, il faut être capable de calculer le 'n' c'est à dire le nombre de termes à utiliser pour atteindre la précision voulue dans la réponse.
Ajouter un commentaire
Réponse
+2
moins plus
Ben de rien ;-)

Si tu veux faire un calcul précis, le mieux c'est effectivement des doubles. De toute façon, t'as pas à en stocker une quantité industrielle, juste 3 ou 4, pas de quoi fouetter un chat, tu risques pas d'avoir des soucis d'espace mémoire avec ça :-D
Ajouter un commentaire
Réponse
+2
moins plus
C'est là :
http://www.commentcamarche.net/contents/c/ctype.php3
Un double a une taille de 8 octets et un long double a une taille de 10 octets.
Tu peux essayer avec un long double aussi pour ton code si tu veux.
Ajouter un commentaire
Réponse
+2
moins plus
Tu fais une boucle où t'incrémentes n de 1, mais dans pour la formule t'utilises 2n+1, et voili voilou...8-)
Ajouter un commentaire
Réponse
+2
moins plus
Si tu veux t'arrêter à 43 par exemple (43=2*21+1)
sinx= 0;
for (n=0; n<=21; n++) {
        fact=factorielle(2*n+1);
	sinx = sinx + ((-1)^n)*(x^(2*n+1))/fact;

}
factorielle sera ta fonction pour calculer ta factorielle bien évidemment... (^_^)
Ajouter un commentaire
Réponse
+1
moins plus
-5 7 -9, ça sonne comme un incrément de deux avec changement de signes.
Donc si c'est négatif tu multiplies par -1 et t'ajoutes 2. Sinon tu multiplies par -1 et tu soustrais 2 ;)
coeff=coeff>0?-coeff-2:-coeff+2;

Cdlt
Ajouter un commentaire
Réponse
+0
moins plus
Mais justement, j'incrémente un Compteur qui remplace n et se répète le nombre de fois nécessaires pour faire ce calcul...
Cela signifie donc que je n'ai pas à me soucier de ce O(x^n)??
Ajouter un commentaire
Réponse
+0
moins plus
Alors merci beaucoup, c'est nettement plus clair !

Si je veux donc stocker des très grandes variables, qu'est-ce-que je devrais utiliser?

J'utilise actuellement des double...
Ajouter un commentaire
Réponse
+0
moins plus
Ça marche ! Juste une petite question encore, c'est quoi la différence entre un double et un long double ?
Ajouter un commentaire
Réponse
+0
moins plus
Par contre là je vais avoir besoin d'un petit coup de pouce ><

Pour l'exponentiel c'était assez facile, la formule était :

exp(x) = 1 + (x/1!) + (x^2/2!) + (x^3/3!) + ... + (x^n)/n!

Mais pour le sinus c'est :

x - x3/3! + x5/5! - x7/7! + ... + (-1)^n ((x^2n+1/(2n+1)!)


Comment faire pour passer de +3 à -5 puis +7...??

Je sais comment faire pour incrémenter 1 à chaque fois, mais là... :S
Ajouter un commentaire
Réponse
+0
moins plus
Euh... Perso j'ai pas trop compris là =S
Ajouter un commentaire
Réponse
+0
moins plus
J'ai jamais fait ça, selon les changements de signes donc bon ^^ pas évident...
Ajouter un commentaire
Réponse
+0
moins plus
Ah ouais je vois, ok !

J'avais sinon pensé à créer une boucle do...while dans laquelle j'insère deux if, le premier calculant n+2 et le deuxième calculant (-n+2), avec à chaque fois pour condition que le compteur < n...
Ajouter un commentaire
Réponse
+0
moins plus
Ouais c'est un peu comme ça que je pensais !

Mais j'ai du mal avec la boucle for...
Ajouter un commentaire
Réponse
+0
moins plus
OK !
Enfin voilà... je vais pouvoir t'aider beaucoup plus, ça fait une éternité que j'ai pas touché du C++ :-(
Ajouter un commentaire
Réponse
+0
moins plus
C'est déjà beaucoup ! :)
Ajouter un commentaire
Réponse
+0
moins plus
Si tu le dis... 8-)
Si t'as un problème plus pointu à résoudre, fais un nouveau sujet, parce que là, je serai vite dépassé. Et dans un sujet qu'a déjà reçu des réponses, je suis pas sûr que quelqu'un de compétent vienne y mettre son nez :-D
Ajouter un commentaire
Réponse
+0
moins plus
Ouais mais pour l'instant tout va bien, en tout cas pour ce programme :)
Ajouter un commentaire
Ce document intitulé « Euh... "O(x²)?"? » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook
Euh... "O(x²)?"? - page 2