Euh... "O(x²)?"?
Résolu
Yuku
Messages postés
199
Date d'inscription
Statut
Membre
Dernière intervention
-
Sacabouffe Messages postés 9427 Date d'inscription Statut Membre Dernière intervention -
Sacabouffe Messages postés 9427 Date d'inscription Statut Membre Dernière intervention -
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 ! :)
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 ! :)
A voir également:
- Euh... "O(x²)?"?
- Site x - Guide
- Sites X : Pornhub, YouPorn et Redtube sont de nouveau accessibles en France - Guide
- O&o shutup10 - Télécharger - Confidentialité
- O&o defrag - Télécharger - Optimisation
- Ø arobase - Forum MacOS
21 réponses
Oui aussi.
Sinon, une autre manière, tu peux calculer en deux fois.
Si tu veux calculer la somme jusqu'à 4*N+3 où N est donné.
Sinon, une autre manière, tu peux calculer en deux fois.
Si tu veux calculer la somme jusqu'à 4*N+3 où N 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; }
Salut
Ben...
O(x^n), c'est une fonction, cette notation, c'est une des notations de Landau :
https://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.
https://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 ! ;-)
Ben...
O(x^n), c'est une fonction, cette notation, c'est une des notations de Landau :
https://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.
https://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 ! ;-)
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.
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.
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
C'est là :
https://forums.commentcamarche.net/forum/affich-37622105-langage-c-les-types-de-donnees
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.
https://forums.commentcamarche.net/forum/affich-37622105-langage-c-les-types-de-donnees
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.
Tu fais une boucle où t'incrémentes n de 1, mais dans pour la formule t'utilises 2n+1, et voili voilou...8-)
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; }Où factorielle sera ta fonction pour calculer ta factorielle bien évidemment... (^_^)
-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 ;)
Cdlt
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
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)??
Cela signifie donc que je n'ai pas à me soucier de ce O(x^n)??
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...
Si je veux donc stocker des très grandes variables, qu'est-ce-que je devrais utiliser?
J'utilise actuellement des double...
Ça marche ! Juste une petite question encore, c'est quoi la différence entre un double et un long double ?
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
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
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...
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...
OK !
Enfin voilà... je vais pouvoir t'aider beaucoup plus, ça fait une éternité que j'ai pas touché du C++ :-(
Enfin voilà... je vais pouvoir t'aider beaucoup plus, ça fait une éternité que j'ai pas touché du C++ :-(