2010-11-13 7 views
2

J'essaie (encore une fois) d'améliorer la programmation, cette fois en python, et j'ai atteint un barrage routier. J'ai essayé de comprendre pourquoi cela ne fonctionne pas pendant un moment maintenant, donc si je pouvais avoir de l'aide, ce serait vraiment, vraiment génial. Je les instructions comme un commentaire, mais la série ne copier au texte, il est sur wikipedia mais comme http://en.wikipedia.org/wiki/Pi#Estimating_.CF.80Calculer pi en utilisant une série dans mon livre

#19. Write a program that approximates the value of pi by summing the terms of this series: 
#The program should prompt the user for n, the number of terms to sum 
# and then output the sum of the first n terms of this series. 
def pi() : 
n = 0.0 
p = input() 
for i in range(-3,p*4,4): 
    n = n + 4.0/i - 4.0/(i + 2) 
print n 

Quand je dis 1000000, il me donne 5,80825432026; cette valeur ne change pas beaucoup. De toute façon, quelqu'un peut-il m'aider s'il vous plait? À ce stade, je n'ai rien d'autre que je puisse penser.

Répondre

3

Mauvais point de départ. Utilisez des noms de variables sensibles (la question dit n, donc utilisez n, pas p). Vérifiez la limite supérieure ... pour obtenir n termes que vous devez faire (n // 2) itérations, vous faites environ n itérations.

>>> def pi(n): 
... tot = 0.0 
... for i in xrange(1, n * 4, 4): 
...  tot += 4.0/i - 4.0/(i + 2) 
... return tot 
... 
>>> pi(1000) 
3.1410926536210386 
>>> pi(10000) 
3.1415426535898203 
>>> pi(100000) 
3.141587653589818 
>>> 
+0

C'est génial; Grâce à votre aide, j'ai appris à quel point il est facile de définir une variable dans une fonction simplement en l'appelant, ce que je n'ai pas compris dans mon livre. J'ai aussi appris que neat + = trick. Mais un problème que je trouve dans chaque réponse que je peux comprendre est que cela ne se calcule pas avec le bon nombre de termes; c'est toujours deux fois la quantité d'entre eux qu'il devrait être. Je ne peux pas comprendre comment le changer pour fonctionner de cette façon, cependant. – caleb

+0

On dirait qu'il se réduit à: 'def pi (n): return 8 * somme (1.0/(i * (i + 2)) pour i dans xrange (1, n * 4, 4)) ' – hughdbrown

+0

@caleb : Vous avez déjà dit quel est le problème: "Pour obtenir n termes que vous devez faire (n // 2) itérations, vous faites environ n itérations." Essayez 'n * 2' au lieu de' n * 4' comme limite supérieure. Cela vous rapproche du nombre requis :-) –

1

Pourquoi votre gamme commence-t-elle à -3? Votre fonction fonctionne bien avec range(1,p*4,4) bien que p ne soit pas le nombre de termes.

+0

Le premier terme de la série que j'essayais de mettre en œuvre était 1; Je pensais que je devais utiliser -3 pour obtenir le premier nombre donné à 1. Je vois maintenant que je n'avais pas besoin de le faire. Merci beaucoup. Je ne sais pas comment j'y arriverais en faisant p le nombre de termes, je crois que c'est deux fois que maintenant? Donc range (-3, p * 2,4): résoudrait le problème tel qu'il était, mais seulement pour la moitié des problèmes. Bon sang, je n'arrive pas à comprendre comment ça marchera non plus! – caleb

+1

Vous pouvez simplement saisir 'range (a, b, c)' dans une invite Python interactive pour voir ce qu'il fait. Je note dans votre correction à la plage que le «-3» est retombé. –

0

Basé sur la page de wikipedia cité, je pencherais pour cette mise en œuvre:

def pi(p) : 
    def powers(): 
     while True: 
      yield 1.0 
      yield -1.0 
    return 4.0 * sum(p/i for i, p in zip(range(1,2*p+1,2), powers())) 
0

En général pour les mathématiques à virgule flottante, il est une bonne idée d'ajouter les termes les plus petits d'abord pour réduire au minimum les erreurs d'arrondi, donc je recommanderais cette petite modification de la réponse de John Machin

>>> def pi(n): 
... tot = 0.0 
... for i in reversed(xrange(1, n * 4, 4)): 
...  tot += 4.0/i - 4.0/(i + 2) 
... return tot 
Questions connexes