Нахождение корня с использованием метода Ньютона с определенным интервалом - PullRequest
0 голосов
/ 10 ноября 2019

Я могу вычислить корень функции, используя метод Ньютона, вычитая старое значение x из нового и проверяя критерий сходимости. Есть ли способ сделать это при заданном интервале, например,

При заданной функции и интервале [a, b] = [0,1, 3,0] критерий сходимости будет рассчитан путем проверки, если [3.0 -0,1] <0,000001, т. Е. [Ba] <0,000001. </p>

Приведенный мною код рассчитывает критерий сходимости с использованием значений x. Я пытаюсь выяснить, есть ли способ, которым я могу использовать интервал вместо значений х.

from math import *

x = 1.0 #initial value

for j in range(1, 101):
    xnew = (x**2 + cos(x)**2 -4*x)/(2*(x - cos(x)*sin(x) -2))

    if abs(xnew - x) < 0.000001:
        break
    x = xnew

print('Root = %0.6f ' % xnew)
print('Number of iterations = %d' % j)

1 Ответ

0 голосов
/ 12 ноября 2019

Звучит как аппроксимация корней, вдвое уменьшая интервал. Вот подход, который я применил к sympy для модульной настройки его для различных функций (хотя, надеюсь, вы все равно найдете его полезным):

def halving_the_interval(f_x, interval, i):

    v1 = f_x.evalf(subs={x : interval[0]})
    v2 = f_x.evalf(subs={x : interval[1]})

    # half of interval
    half = (interval[0] + interval[1]) / float(2)

    # f_(half)
    v3 = f_x.evalf(subs={x: half})

    if (abs(interval[1] - interval[0]) > 0.000001):
        # check intervals for where root lies
        # recursive step on new interval, update iterations
        if (v1 < 0 and v3 > 0):
            halving_the_interval(f_x, [interval[0],half], i+1)
        else:
            halving_the_interval(f_x, [half, interval[1]], i+1)
    else:
        print ("Root =  %0.6f " % half)
        print ("Number of iterations = %d" % i)

halving_the_interval(x**2 - 2, [1,2], 0)

И тестирование с функцией x^2 - 2 = 0 должно найти root в sqrt (2)то есть. ~ 1.41.

$ halving_the_interval (x ** 2 - 2, [1,2], 0)

Root = 1.414214

Количество итераций = 20

...