programme python
Bonjour
Je ne comprends pas pourquoi le programme ci-dessous me renvoie une erreur dès que n>10.
Pourriez-vous m'expliquer. Merci d'avance.
Je ne comprends pas pourquoi le programme ci-dessous me renvoie une erreur dès que n>10.
Pourriez-vous m'expliquer. Merci d'avance.
from math import * def distance(x1,y1,x2,y2): return sqrt((x1-x2)**2 + (y1-y2)**2) def longueurCourbe(f,a,b,n): longueur = 0 x1,y1 = a,f(a) h = (b-a)/n for i in range(n): x2 = x1 + h y2 = f(x2) longueur = longueur + distance(x1,y1,x2,y2) x1,y1 = x2,y2 return longueur l=2*longueurCourbe(lambda x: sqrt(1-x**2),0,1,10) print(l)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
D'abord, tu pourrais présenter ton code correctement, avec les indentations.
Ensuite, quand tu fais x2=x1+h, le dernier déborde de l'intervalle de définition de ta fonction, il est supérieur à 1.
Cordialement,
Rescassol
Pourquoi le dernier déborde ? Si c'était le cas le problème se poserait pour toutes les valeurs de n, non ? je n'ai pas compris.
-- Schnoebelen, Philippe
J'utilise en fait Sagemath.
Le premier problème, c'est que la dernière valeur de x2 dépasse parfois la valeur $1$ à cause d'erreurs d'arrondi. C'est ce qu'ont déjà dit Rescassol et Foys. Dans ce cas très précis, on peut remplacer la définition de x2 par Au fait, il peut y avoir des erreurs d'arrondi avec des nombres décimaux, par exemple $n=100$, parce que 1./100 ne vaut pas $0.01$ mais un nombre dyadique (de la forme $n/2^k$, $n$ et $k$ entiers) qui est une approximation de $0.01$. Apparemment, $100$ fois ce nombre, ce n'est pas le flottant 1., c'est un peu plus que 1. (ça fait une erreur). En revanche, pas d'erreur avec $n=128$ ou $n=1024$.
Le deuxième problème, c'est que la fonction renvoie toujours zéro, c'est déplaisant. Cela vient du type des nombres manipulés : par défaut, des entiers. Dans le calcul de $h=(b-a)/n$, l'opération en jeu est une division euclidienne entre entiers et pas une division de flottants. Par conséquent, la variable h est l'entier nul.
Pour faire fonctionner le code, il suffit de changer la définition de h en : ce qui force une conversion en flottants et donne un résultat significatif ($3.132$, à peu près la même chose que trouve GaBuZoMeu).
NB 1 : Cela marche aussi directement si on calcule mais bien sûr c'est moins propre / fiable.
NB 2 : Si le calcul fonctionne en l'état avec Sage, c'est parce que Sage calcule dans le corps des rationnels. Autrement dit, pour Sage, $(1-0)/10$ vaut bien $1/10$ et pas zéro et le dernier x2 calculé vaut précisément $1$ et pas plus. Mais Python n'a pas de type "rationnel" par défaut.
J'ai testé un autre programme qui lui ne me retourne pas d'erreurs. Les valeurs obtenues diffèrent toutefois un peu de celles obtenues avec le programme précédent. J'ai un peu de mal à comprendre pourquoi celui-ci fonctionne et l'autre non.
Heureusement, le probleme ne se pose pas avec le code Xcas correspondant de notre document ressource lycee, je rajoute quand meme une remarque.
Sinon, avec les définitions suivantes, je n'ai pas d'erreur (Python 2 ou 3) :
Edit : Déjà dit par remark et skyffer3 (mais sans l'exemple). Je ne sais pas quelle version « les jeunes » utilisent. Par défaut, avec Ubuntu, "python" lance Python 2 et "python3" Python 3.