Скрипт Ньютона-Рафсона зависает при попытке выкорчевать большие числа - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь сделать квадратный корень, используя алгоритм Ньютона-Рафсона случайных чисел, заданных этой формулой: a = m * 10 ^ c, где m - случайное число с плавающей точкой в ​​диапазоне (0,1), а c - случайное целое число в диапазоне (-300300).Код, который я написал, прекрасно работает с точностью до корня 0,01 и c в диапазоне (-30,30), но останавливает или возвращает неверные результаты, когда я использую диапазон c, указанный в задаче.

здесь приведен код функции newton def newton_raphson.(a): iterations_count = 0

x_n_result = a/2

while abs(x_n_result - a / x_n_result) > 0.01:

    x_n_result = (x_n_result + a/x_n_result)/2
    iterations_count = iterations_count + 1

    if x_n_result*x_n_result == a:

        break

iterations.append(iterations_count)
results.append(x_n_result)
print("Result of function", x_n_result)

return

и часть, где числа к корню рандомизированы

for i in range(0, 100):
    m = random.uniform(0, 1)
    c = random.randint(-30, 30)
    a = m * 10 **c
    random_c.append(c)
    numbers.append(a)

    print("Number to root : ", i, "|",  a, '\n')
    newton_raphson(a)

график количества итераций от значения c

plt.bar(random_c, iterations, color='red')

Предполагается, что скрипт выкорчевывает 100 случайных чисел, а затем вычерчивает количество итераций, необходимых для получения корня из значений c.Проблема, как я уже говорил, с правильным диапазоном значения c.Я считаю, что это связано с диапазоном переменных.Любое предложение, как решить эту проблему?

1 Ответ

0 голосов
/ 23 мая 2019

Первое наблюдение состоит в том, что ваша логика даст вам квадратный корень, а не кубический корень.

Во-вторых, ваши случайные числа могут содержать отрицательные значения, которые никогда не сойдутся для квадратного корня.

Если вам действительно нужен кубический корень, вы можете сделать это так:

def cubic(number):
    result = number
    while abs(number/result/result - result) > 0.01:
        result += (number/result/result - result)/2
    return result

Вы также можете приблизиться к этому в общем виде, создав функцию общего назначения Ньютона / Рафсона, которая принимает дельта-функцию в качестве параметра для использования с числовым параметром:

def newtonRaphson(delta,n):
    result = n
    while abs(delta(n,result)) > 0.01:
        result += delta(n,result)/2
    return result

def cubic(n,r): return n/r/r - r
def sqrt(n,r):  return n/r - r

Использование метода newtonRaphson с выбранной вами дельта-функцией:

newtonRaphson(sqrt,25)   # 5.000023178253949

newtonRaphson(cubic,125) # 5.003284700817307
...