Метод Ньютона для конвергенции, но я получаю несвязанную ошибку

#python #local-variables #newtons-method

#python #локальные переменные #метод ньютонов

Вопрос:

У меня есть задание, в котором я должен выяснить, сходятся ли некоторые значения для x_0, но мой код, похоже, выдает несвязанную локальную ошибку, когда я проверяю значения выше 0,5.

 import numpy as np

from sympy import *

import sympy
from math import atan
from scipy import misc

x = symbols('x')

def f(x):
    return atan(x) 1

def newton(x):
    if f(x) > 0:
        x_new = x - (f(x)/misc.derivative(f, x))
    return x_new

def newton_iter(x, tol):
    error = abs(f(x))
    iterasjoner = 0
    while error > tol and iterasjoner < 10000:
        try:
            x = newton(x)
        except OverflowError:
            print("Kan ikke konvergere")
            break
        
        error = abs(f(x))
        iterasjoner  = 1
        print(f"Antall iterasjoner: {iterasjoner}, error: {error}")
    print(f"Konvergerer etter {iterasjoner} iterasjoner")
    
newton_iter(1.2, 10e-6)
#print(newton(1.2))
 

и я продолжаю получать:

  File "C:line 39, in <module>
    newton_iter(1.2, 10e-6)

  File "C: line 29, in newton_iter
    x = newton(x)

  File "C:, line 22, in newton
    return x_new

UnboundLocalError: local variable 'x_new' referenced before assignment
 

Что я делаю не так?

Ответ №1:

Вы не определяете переменную во всех случаях. Если f(x) не является положительным, вы его не устанавливаете. Вы не можете ссылаться на значение для возврата. Вам нужно обработать другой случай:

 def newton(x):
    if f(x) > 0:
        x_new = x - (f(x)/misc.derivative(f, x))
    else:
        # Do something to set x_new
    return x_new