python epsilon错误的计算

时间:2017-01-16 14:02:02

标签: python

epsilon设置为0.1,但它给出了1.2的结果。我不知道是什么原因引起的。有人可以帮忙吗?

def evaluate_poly(poly, x):
    total = 0.0
    for i in range(len(poly)):
        total += poly[i] * (x ** i)

    return total

def compute_deriv(poly):
    deriv = []
    if len(poly) < 2:
        return  [0.0]
    else:
        for i in range(1, len(poly)):
            deriv.append(float(poly[i] * i))
        return deriv

def compute_root(poly, x_0, epsilon):
    num = 0
    root = x_0
    while abs(evaluate_poly(poly, root)) >= epsilon:
        root = root - evaluate_poly(poly, root) / evaluate_poly(compute_deriv(poly), root)
        num += 1
    return [root, num]

print(compute_root((1.0,-2.0,1.0), 14, 0.1))

2 个答案:

答案 0 :(得分:3)

你试图用数值求解x 2 - 2 * x + 1 = 0.我们知道方程在x = 1时有一个双根。但在那时(x = 1),导数(2 * x - 2)为0.这意味着y中的误差总是比x中的误差低一个数量级,所以x = 1.2,y的结果~0.04&lt; 0.1并不奇怪。

差异x n - x n-1 可以更好地猜测x中的错误:

def compute_root1(poly, x_0, epsilon):
    num = 0
    root = x_0
    while True:
        root1 = root - evaluate_poly(poly, root) / evaluate_poly(compute_deriv(poly), root)
        if abs(root1 - root) < epsilon: break
        num += 1
        root = root1
    return [root1, num+1]

它给出了:

>>> print(compute_root1((1.0,-2.0,1.0), 14, 0.1))
[1.05078125, 8]

答案 1 :(得分:2)

epsilon代表y错误(如果你愿意,可以评估poly),但你的1.2 ...的结果是x值,其中y是0.在这种情况下你的y是0.0412并且低于0.1所以代码没问题。< / p>

将compute_root中的返回值更改为:

return [root, num, abs(evaluate_poly(poly, root))]