2017-01-16 9 views
1

Epsilon ist auf 0,1 gesetzt, aber es gibt mir Ergebnisse bis 1.2. Ich weiß nicht, was das verursacht. Kann jemand helfen?Python Epsilon falsche Berechnung

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)) 
+0

Bitte zuerst angeben Ihr Problem : Was ist Epsilon, was wollen Sie berechnen, ... –

+0

"Epsilon ist auf 1,1" festgelegt - Ihr Code scheint 0,1 zu verwenden. "Aber es gibt mir Ergebnisse bis 1.2." -- was bedeutet das überhaupt? Sie müssten mehr Details liefern, wenn Sie jemanden davon überzeugen wollen, dass das, was Sie sehen, etwas mehr ist als Gleitkomma-Rundungsfehler. –

+0

@SergeBallesta Ich verstehe, dass (obwohl es mehr wie Newtons Methode aussieht), aber ihr Code verwendet Epsilon = 0,1, während in der Frage, sie sagten, dass sie Epsilon auf 1,1 gesetzt hatten. –

Antwort

2

Epsilon stellt y-Fehler (bewerten Poly wenn man so will), aber Ihr Ergebnis von 1,2 ... ist x-Wert, wobei y 0 in diesem Fall Ihrer y 0,0412 ist und niedriger als 0,1, so Code ist in Ordnung.

Ihre Rückkehr in compute_root ändern:

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

Sie versuchen, numerisch zu lösen x -2 * x + 1 = 0. Wir wissen, dass die Gleichung x = 1 eine doppelte Wurzel . Aber an diesem Punkt (x = 1) ist die Ableitung (2 * x - 2) 0. Das bedeutet, dass der Fehler in y immer eine Größenordnung unterhalb des Fehlers in x ist, also das Ergebnis von x = 1,2, y ~ 0.04 < 0.1 ist überhaupt keine Überraschung.

Die Differenz x n - x n-1 wäre eine viel bessere Schätzung des Fehlers in x sein:

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] 

Es gibt:

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