2

ニュートン法を使用して、kの平方根の最小値を返そうとしています。

k=float(input("Number? "))
x = k/2

def newton(x):
    while abs(x**(1/2)- k) >= 10**(-10):
        if k >= 0:
            x = (x+k/x)/(2)
            return x
        elif k < 0:
            raise ValueError ("Cannot take the square root of a negative number")


print ("The approximate square root of", k, "is", newton(k))
print ("The error is", abs(x**(1/2)- k))

ただし、上記のコードは最初の反復のみを返します。たとえば、kが2の場合、ニュートン法による正確な平方根は1.41422である必要があります。これは、3回目の反復です。ただし、コードは現在、最初の反復である1.5を返しています。1.5ではなく1.41422のより正確な平方根を返すにはどうすればよいですか?同様に、エラーはこの変更を反映する必要があります。

4

1 に答える 1

9

ステートメントをループの外側に配置する必要がありreturnます。そうしないと、ステートメントは常に最初の反復で返されます。

def newton(x):
    while abs(x**(1/2)- k) >= 10**(-10):
        if k >= 0:
            x = (x+k/x)/(2)
        elif k < 0:
            raise ValueError ("Cannot take the square root of a negative number")
    return x

このようなグローバルスコープの変数を使用することは災害のレシピであることに注意してください。これは不明確であり、関数を簡単に使用できないことを意味します。代わりにパラメータとして渡します。

またk、ループ内で変更することは不可能であるため、すべての反復ではなく、最初に1回チェックを実行できます。

def newton(x, k):
    if k < 0:
            raise ValueError ("Cannot take the square root of a negative number")
    while abs(x ** (1 / 2) - k) >= 10 ** (-10):
        x = (x + k / x) / 2
    return x
于 2012-11-06T22:50:44.500 に答える