2013-05-02 3 views
1
def fvals_sqrt(x): 
    """ 
    Return f(x) and f'(x) for applying Newton to find a square root. 
    """ 
    f = x**2 - 4. 
    fp = 2.*x 
    return f, fp 

def solve(fvals_sqrt, x0, debug_solve = False): 
    """ 
    Solves the sqrt function, using newtons methon. 
    """ 
    iters = 0 
    f, fp = 0. 
    while f > 10**-14 | -f < 10**-14: 
     f, fp = fvals_sqrt(x0) 
     x0 = x0 - (f/fp) 
     iters = iters+1 
     print + " x = %22.15e in %i iterations " % (x0, iters) 
     return x0, iters 

    print "we're done" 

Я хочу, чтобы этот цикл while один раз был менее 10^-14, но я не уверен, как изменить аргумент, чтобы сделать цикл итеративным, любую помощь?в то время как блок не работает так, как ожидалось

+0

Существует также проблема, что вы инициализация 'е = 0.' вне цикла – wim

+0

На самом деле,' е, Fp = 0.' является Синтаксическая ошибка не так ли ??? – wim

+1

@wim - Я не уверен в синтаксической ошибке, но 'TypeError' по крайней мере ... – mgilson

ответ

4

Вы хотите логичный or вместо |:

while f > 10**-14 or -f < 10**-14: 

Обратите внимание, что есть разница в приоритете операций между логическими или (or) и побитовое или (|). Ваше предыдущее заявление, скорее всего разбираемый как:

while (f > (10**-14 | -f)) < 10**-14): 

, который кажется, что это поднимет TypeError ...

Это может быть проще:

2

| оператор используется для bitwise-OR, поэтому здесь вы должны использовать логический or, а во-вторых, оператор return также находится в неправильном месте, и он закончит ваш цикл только после одной итерации.

def solve(fvals_sqrt, x0, debug_solve = False): 
    iters = 0 
    f, fp = 0. 
    while f > 10**-14 or -f < 10**-14: 
     f, fp = fvals_sqrt(x0) 
     x0 = x0 - (f/fp) 
     iters = iters+1 
     print + " x = %22.15e in %i iterations " % (x0, iters) 
    print "we're done" 
    return x0, iters 
2

while f > 10**-14 | -f < 10**-14 использует побитовое ИЛИ, а не логическое ИЛИ. Используйте ключевое слово or:

while f > 10**-14 or -f < 10**-14: 

Кроме того, вы return внутри вашего while цикла. Вы должны отбросить эту линию вниз на один уровень отступа:

return x0, iters 
Смежные вопросы