【问题标题】:Newton-Raphson method to solve cubic equations求解三次方程的 Newton-Raphson 方法
【发布时间】:2014-01-30 10:42:02
【问题描述】:

我完全是一个编程初学者,因此请告诉我我的问题的答案是否非常明显。

我一周前开始学习 python,并且在学习了使用 Newton-Raphson method 求解方程的基础知识后,我想出了一段代码,可以为您提供至少(仅)一个三次方程的解。这是我设计的代码:-

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)  

牛顿法的缺点之一是 or f'(x)=0,它会给出数学错误并崩溃。为了克服这个问题,我使用 g=g+0.001,如果 g 的当前值给出零导数,其中 g 是当前猜测。 有没有更好的方法来消除这个问题,而不使用复杂的函数?

我的另一个问题是,我是否可以包括提供多个根并对代码进行微小更改? 一个想法是改变猜测,使现在连续迭代带来关于另一个根。但我不知道如何做出这样的猜测,给出一个解决方案。

【问题讨论】:

标签: python equations newtons-method


【解决方案1】:

对导数进行第二次程序。更好的是,为数值函数创建一个类,保存初始化期间获得的系数,并提供值和导数的方法。

使用 x/(eps^2+x^2) 去奇异化函数 1/x。实际上,这应该不起作用,因为收敛到多个根的速度很慢,因此在更高级的实现中,您必须实现代码来检测并加速它。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 2020-05-06
      相关资源
      最近更新 更多