0

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

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

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 是当前猜测。有没有更好的方法来消除这个问题,而不使用复杂的功能?

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

4

2 回答 2

2

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

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

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

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

于 2014-01-11T14:07:27.630 回答
1

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

牛顿法程序(C 语言)循环无限运行

于 2017-01-03T09:53:00.977 回答