Calcul de la racine carrée à l'aide de la méthode de Newton (erreurs!)
Je suis en train de terminer un problème de maths qui se rapproche de la racine carrée d'un nombre à l'aide de Newton de deviner et de la méthode de contrôle en Python. L'utilisateur doit entrer un numéro, une première estimation pour le nombre, et combien de fois ils veulent vérifier leur réponse avant de retourner. Pour faciliter les choses et de faire connaissance en Python (j'ai seulement commencé l'apprentissage de la langue il y a quelques mois) je l'ai divisé en un certain nombre de petites fonctions; le problème aujourd'hui, cependant, c'est que je vais avoir de la difficulté à l'appel de chaque fonction et de transmettre les numéros de travers.
Voici mon code, avec des commentaires pour les aider (chaque fonction est dans l'ordre d'utilisation):
# This program approximates the square root of a number (entered by the user)
# using Newton's method (guess-and-check). I started with one long function,
# but after research, have attempted to apply smaller functions on top of each
# other.
# * NEED TO: call functions properly; implement a counting loop so the
# goodGuess function can only be accessed the certain # of times the user
# specifies. Even if the - .001 range isn't reached, it should return.
# sqrtNewt is basically the main, which initiates user input.
def sqrtNewt():
# c equals a running count initiated at the beginning of the program, to
# use variable count.
print("This will approximate the square root of a number, using a guess-and-check process.")
x = eval(input("Please type in a positive number to find the square root of: "))
guess = eval(input("Please type in a guess for the square root of the number you entered: "))
count = eval(input("Please enter how many times would you like this program to improve your initial guess: "))
avg = average(guess, x)
g, avg = improveG(guess, x)
final = goodGuess(avg, x)
guess = square_root(guess, x, count)
compare(guess, x)
# Average function is called; is the first step that gives an initial average,
# which implements through smaller layers of simple functions stacked on each
# other.
def average(guess, x) :
return ((guess + x) / 2)
# An improvement function which builds upon the original average function.
def improveG(guess, x) :
return average(guess, x/guess)
# A function which determines if the difference between guess X guess minus the
# original number results in an absolute vale less than 0.001. Not taking
# absolute values (like if guess times guess was greater than x) might result
# in errors
from math import *
def goodGuess(avg, x) :
num = abs(avg * avg - x)
return (num < 0.001)
# A function that, if not satisfied, continues to "tap" other functions for
# better guess outputs. i.e. as long as the guess is not good enough, keep
# improving the guess.
def square_root(guess, x, count) :
while(not goodGuess(avg, x)):
c = 0
c = c + 1
if (c < count):
guess = improveG(guess, x)
elif (c == count):
return guess
else :
pass
# Function is used to check the difference between guess and the sqrt method
# applied to the user input.
import math
def compare(guess, x):
diff = math.sqrt(x) - guess
print("The following is the difference between the approximation")
print("and the Math.sqrt method, not rounded:", diff)
sqrtNewt()
Actuellement, j'ai cette erreur: g, avg = improveG(guess, x)
TypeError: 'float' object is not iterable.
La dernière fonction utilise la dernière itération de la conjecture de soustraire le calcul de la racine carrée de la méthode, et retourne la différence en général.
Suis-je encore à faire de ce droit? Code de travail serait appréciée, avec des suggestions, si vous pouvez fournir. Encore une fois, je suis un débutant, donc je m'excuse pour les idées fausses, ou aveugle, les erreurs évidentes.
OriginalL'auteur user1739537 | 2012-10-11
Vous devez vous connecter pour publier un commentaire.
Mise en œuvre de la méthode de newton:
Il devrait être assez facile d'ajouter un peu de modifications en cas de besoin. Essayez, et dites-nous quand vous êtes coincé.
NOTE: vous trouverez assez exaples sur la façon d'utiliser les entrées brutes ici ou googler, MAIS, si vous comptez les boucles, les
c=0
doit être en dehors de la boucle, ou vous serez coincé dans une boucle infinie.Quiqk et sale, beaucoup de façons d'améliorer:
duffymo -- il est donc, oui 🙂
Merci de racine! Je dois dire que je suis à l'aide de Python version 3.30, donc j'ai fait des modifications en conséquence. Je suppose que je pourrais aussi soustraire le deviner à partir du nombre retourné par les Mathématiques.sqrt ainsi. Encore une fois, cela a été très utile; apprécie vraiment cette!
Va faire! Merci!
OriginalL'auteur root
La réponse choisie est un peu compliqué...pas de manque de respect à l'OP.
Pour tous ceux qui ont déjà Googles dans le futur, c'est ma solution:
OriginalL'auteur Kendrick Ledet
Voici une autre fonction pour calculer des racines carrées; il suppose n est non-négative:
Cet algorithme est similaire à Newton, mais pas identiques. Il a été inventé par un mathématicien grec nommé Héron (son nom est parfois orthographié Héros) vivant à Alexandrie, en Égypte, au premier siècle (environ deux mille ans). Du héron la récurrence de la formule est plus simple que celui de Newton; Héron utilisé
x' = (x + n/x) /2
où Newton utiliséx' = x - (x^2 - n) /2x
.Le premier test est un cas spécial sur zéro; sans elle, le
(n < 1)
test provoque une boucle infinie. Les deux prochaines épreuves normaliser n de la gamme1 < n <= 4
; la plus petite signifie que nous pouvons facilement calculer une première approximation de la racine carrée de n, ce qui est fait dans le premier calcul de x, et puis "dérouler la boucle" et de réitérer la récurrence de l'équation, un nombre fixe de fois, éliminant ainsi la nécessité pour les essais récurrents et si la différence entre les deux successives boucles est trop grand.Par la manière, le Héron était un joli garçon intéressant. En plus d'inventer une méthode pour le calcul des racines carrées, il a construit un moteur à réaction, un monnayeur machine distributrice, et plein d'autres trucs sympa!
Vous pouvez en savoir plus sur le calcul des racines carrées à mon blog.
OriginalL'auteur user448810
il ne devrais pas avoir à être si compliqué que ça j'ai écrit ça
ou vous pouvez le changer comme ça
OriginalL'auteur Shrey
Tout ce que vous devez savoir, c'est le n-ième terme de la séquence. De la Leibniz série, nous savons que c'est ((-1)**n)/((2*n)+1). Simplement calculer la somme de cette série pour tous les i avec une condition initiale de zéro et vous êtes fixés.
OriginalL'auteur HighOnFloyd