Как реализовать метод Ньютона итеративно для оценки корней - PullRequest
0 голосов
/ 31 января 2019

Пользователь вводит число, которому код должен оценивать кубический корень числа для определенного числа итераций (определяется N) или до тех пор, пока изменение в корневых оценках не станет достаточно маленьким (на ваше усмотрение).

Начал с начального приближения (x_initial), равного 1, и пропустил его по формуле, чтобы получить следующую итерацию X. Кажется, чтобы получить разумный ответ, но кроме этого, кажется, не понять, что делать.

print('Enter number for cubed root:')
y=int(input())
x_initial=1
n=0

while n <= 50:
    x_new=1/3*(2*(x_initial) + y/(x_initial**2))
    print(x_new)
    n=n+1

    x_new=1/3*(2*(x_new) + y/(x_new**2))
    print(x_new)
    n=n+1

Оценка просто чередуется между двумя разными значениями.Если не считать определения нового уравнения X после каждой итерации, я не уверен, что еще можно попробовать.

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Пусть f - символическая функция, представляющая рассматриваемое уравнение, dF - символическое уравнение, представляющее производную от f, начальное значение x0, epsilon (конечное условие существования функции, когда вы достаточно близки к корню), и max_iter(сколько итераций вы хотите запустить).Это лучше, чем ваш метод, потому что он работает для любого корня, пока вы пишете соответствующую производную.

def newtons_method(f,Df,x0,epsilon,max_iter):
    xn = x0
    for n in range(0,max_iter):
        fxn = f(xn)
        if abs(fxn) < epsilon:
            print('Found solution after',n,'iterations.')
            return xn
        Dfxn = Df(xn)
        if Dfxn == 0:
            print('Zero derivative. No solution found.')
            return None
        xn = xn - fxn/Dfxn
    print('Exceeded maximum iterations. No solution found.')
    return None

Пример использования:

f = lambda x: x**4 - x**3 - 1
Df = lambda x: 4*x**3 - 3*x
approx = newtons_method(f,Df,1,1e-10,10)
print(approx)
0 голосов
/ 31 января 2019

Не уверен, почему это так сложно в вашем случае и других, но я проверил это, и это работает просто:

def cubenewton(num, ini=1, iters=50):
    for i in range(iters):
        ini = ini - (ini**3 - num)/float(3*ini**2)
    return ini

>>> cubenewton(30) # I tried values from -100 to 100 and all works fine. works for 0 as well.
3.107232505953859
0 голосов
/ 31 января 2019

Кажется, проблема в том, что вы сбрасываете x_new, чтобы оно основывалось на x_initial в начале каждого цикла.Я сверну оба в одну переменную x:

y = int(input('Enter number for cubed root:'))
x = 1
n = 50

for _ in range(n):
    x = 1/3*(2*(x) + y/(x**2))
    print(x)

Я также сделал ваш код немного более Pythonic в нескольких местах, чтобы улучшить читаемость.

...