Метод Ньютона-Рафсона для решения кубических уравнений

Я полностью новичок в программировании, поэтому скажите, пожалуйста, если ответ на мой вопрос очевиден и очевиден.

Я начал изучать Python неделю назад и изучил основы использования метода Ньютона-Рафсона Для решения уравнений я придумал код, который может дать вам только одно (только) решение кубического уравнения. Вот код, который я разработал: -

def deg3(a,b,c,d,g):  
    y=a*g**3+b*g**2+c*g+d
    return y
def solvedeg3equation():
    e=float(input("e= ")) #for ax^3+bx^2+cx+d=0, with maximum error of e
    a=float(input("a= "))
    b=float(input("b= "))
    c=float(input("c= "))
    d=float(input("d= "))
    count=1
    g=0.01
    while abs(deg3(a,b,c,d,g))>e and count<=100:
        count=count+1
        if 3*a*g**2+2*b*g+c==0:
            g=g+0.001
        g=g-deg3(a,b,c,d,g)/(3*a*g**2+2*b*g+c)
    if count<=100:
        print("The best guess is:",g)
        print("iterations required: ",count)
    else:
        print("maximum iterations exceeded ")
        print("iterations: ",count,"current guess: ",g)  

Одним из недостатков метода Ньютона является то, что или f '(x) = 0, он дает математическую ошибку и дает сбой. Чтобы преодолеть это, я использовал g = g + 0.001, если текущее значение g дает нулевую производную, где g - текущее предположение. Есть ли лучший способ решить эту проблему без использования сложных функций?

Другой вопрос, который у меня есть: Могу ли я включить положение о предоставлении более одного корня с небольшими изменениями в коде? Одна идея состоит в том, чтобы изменить предположение таким образом, чтобы теперь последовательные итерации приводили к другому корню . Но я не знаю, как сделать такое предположение, учитывая одно решение.


person stochastic13    schedule 11.01.2014    source источник
comment
Это действительно три вопроса! Для просмотра рабочего кода используйте codereview.stackexchange.com.   -  person jonrsharpe    schedule 11.01.2014
comment
@jonrsharpe Я уменьшу количество вопросов. :)   -  person stochastic13    schedule 11.01.2014


Ответы (2)


Сделайте вторую процедуру для производной. Еще лучше создать класс для числовых функций, содержащий коэффициенты, полученные во время инициализации, и предоставляющий методы для значения и производной.

Используйте x / (eps ^ 2 + x ^ 2), чтобы деингуляризовать функцию 1 / x. На практике это не должно играть никакой роли, поскольку сходимость к нескольким корням происходит медленно, поэтому в более продвинутых реализациях вам нужно реализовать код, чтобы обнаружить это и ускорить его.

Чтобы получить другие корни, используйте схему Хорнера-Руффини для вычисления спущенного квадратичного полинома и решите его, используя формулу решения.

И постарайтесь не вычислять одно и то же значение несколько раз. Здесь это не важно, но для более дорогих функций становится критичным.

person Lutz Lehmann    schedule 11.01.2014

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

person Priyanshu Khandelwal    schedule 03.01.2017