我正在努力完成一个数学问题,该问题使用Newton在Python中的猜测和检查方法来近似数字的平方根。用户应该输入一个数字,该数字的初始猜测,以及他们想要在返回之前检查他们的答案的次数。为了让事情变得更容易并且了解Python(几个月前我才开始学习这门语言)我把它分解成了许多小函数;但现在的问题是,我无法调用每个函数并传递数字。
这是我的代码,有帮助的评论(每个函数按使用顺序):
# 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()
目前,我收到此错误:g, avg = improveG(guess, x)
TypeError: 'float' object is not iterable.
最后一个函数使用猜测的最终迭代从数学平方根方法中减去,并返回整体差异。
我甚至这样做了吗?如果您能提供建议,我们将非常感谢工作代码。再说一遍,我是新手,所以我为误解或盲目的明显错误道歉。
答案 0 :(得分:7)
牛顿法的实施:
在需要时添加一些调整应该相当容易。试着,告诉我们什么时候卡住。
from math import *
def average(a, b):
return (a + b) / 2.0
def improve(guess, x):
return average(guess, x/guess)
def good_enough(guess, x):
d = abs(guess*guess - x)
return (d < 0.001)
def square_root(guess, x):
while(not good_enough(guess, x)):
guess = improve(guess, x)
return guess
def my_sqrt(x):
r = square_root(1, x)
return r
>>> my_sqrt(16)
4.0000006366929393
注意:你会在SO或google搜索中找到足够的关于如何使用原始输入的例子。但是,如果你在计算循环,c=0
必须在循环之外,否则你将陷入困境无限循环。
Quiqk和肮脏,有很多改进方法:
from math import *
def average(a, b):
return (a + b) / 2.0
def improve(guess, x):
return average(guess, x/guess)
def square_root(guess, x, c):
guesscount=0
while guesscount < c :
guesscount+=1
guess = improve(guess, x)
return guess
def my_sqrt(x,c):
r = square_root(1, x, c)
return r
number=int(raw_input('Enter a positive number'))
i_guess=int(raw_input('Enter an initial guess'))
times=int(raw_input('How many times would you like this program to improve your initial guess:'))
answer=my_sqrt(number,times)
print 'sqrt is approximately ' + str(answer)
print 'difference between your guess and sqrt is ' + str(abs(i_guess-answer))
答案 1 :(得分:7)
选择的答案有点令人费解......不要对OP不尊重。
对于将来使用谷歌搜索的人来说,这是我的解决方案:
def check(x, guess):
return (abs(guess*guess - x) < 0.001)
def newton(x, guess):
while not check(x, guess):
guess = (guess + (x/guess)) / 2.0
return guess
print newton(16, 1)
答案 2 :(得分:2)
这是计算平方根的一个相当不同的函数;假设 n 是非负的:
def mySqrt(n):
if (n == 0):
return 0
if (n < 1):
return mySqrt(n * 4) / 2
if (4 <= n):
return mySqrt(n / 4) * 2
x = (n + 1.0) / 2.0
x = (x + n/x) / 2.0
x = (x + n/x) / 2.0
x = (x + n/x) / 2.0
x = (x + n/x) / 2.0
x = (x + n/x) / 2.0
return x
此算法与牛顿类似,但不完全相同。它是由一位名叫Heron的希腊数学家(他的名字有时拼写为Hero)在一世纪(约两千年前)居住在埃及的亚历山大港发明的。苍鹭的复发公式比牛顿更简单;苍鹭使用x' = (x + n/x) / 2
牛顿使用x' = x - (x^2 - n) / 2x
。
第一个测试是零的特殊情况;没有它,(n < 1)
测试会导致无限循环。接下来的两个测试将 n 标准化为范围1 < n <= 4
;使范围更小意味着我们可以轻松计算 n 的平方根的初始近似值,这是在 x 的第一次计算中完成的,然后“展开循环“并且将递归方程迭代固定次数,因此如果两个连续循环之间的差异太大,则无需进行测试和重复。
顺便说一句,苍鹭是一个非常有趣的人。除了发明一种计算平方根的方法外,他还建造了一台工作喷气发动机,一台投币式自动售货机以及许多其他整洁的东西!
您可以在my blog了解有关计算平方根的更多信息。
答案 3 :(得分:0)
我写这篇文章不应该那么复杂
def squareroot(n,x):
final = (0.5*(x+(n/x)))
print (final)
for i in range(0,10):
final = (0.5*(final+(n/final)))
print (final)
或者您可以将其更改为
n = float(input('What number would you like to squareroot?'))
x = float(input('Estimate your answer'))
final = (0.5*(x+(n/x)))
print (final)
for i in range(0,10):
final = (0.5*(final+(n/final)))
print (final)
答案 4 :(得分:0)
您需要知道的是序列中的第n个术语。从Leibniz系列中,我们知道这是((-1)** n)/((2 * n)+1)。只需对初始条件为零的所有i求和这个系列,就可以了。
def myPi(n):
pi=0
for i in range(0,n):
pi=pi+((-1)**i)/((2*i)+1)
return 4*pi
print (myPi(10000))