Newton-Raphson方法求解三次方程

时间:2014-01-11 11:17:42

标签: python equations newtons-method

我完全是编程的初学者,所以请告诉我,我的问题的答案是否非常明显和明显。

我在一周前开始学习python,并且已经学习了使用Newton-Raphson method求解方程式的基础知识,我想出了一段代码,可以给出atleat(仅)1个三次方程的解。这是我设计的代码: -

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是当前猜测。 有没有更好的方法可以在不使用复杂功能的情况下解决此问题?

我遇到的另一个问题是,我是否可以包含提供多个根的代码,但对代码进行了少量更改?一个想法是改变猜测,以便现在连续迭代带来关于另一个根。但鉴于一个解决方案,我不知道如何做出这样的猜测。

2 个答案:

答案 0 :(得分:2)

为衍生物制作第二个程序。更好的是,为包含初始化期间获得的系数的数值函数创建一个类,并提供值和导数的方法。

使用x /(eps ^ 2 + x ^ 2)去除函数1 / x。实际上,这应该不起作用,因为对多个根的收敛是缓慢的,所以在更高级的实现中,你必须实现代码来检测它并加速它。

要获得其他根,请使用Horner-Ruffini方案计算缩小的二次多项式,并使用求解公式求解。

尽量避免多次计算相同的值。这在这里并不重要,但对于更昂贵的功能,这变得至关重要。

答案 1 :(得分:1)

我使用C来编写程序,以计算给定间隔内任何用户输入的多项式的根。这是代码的链接

Newton's method program (in C) loop running infinitely