我完全是编程的初学者,所以请告诉我,我的问题的答案是否非常明显和明显。
我在一周前开始学习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是当前猜测。 有没有更好的方法可以在不使用复杂功能的情况下解决此问题?
我遇到的另一个问题是,我是否可以包含提供多个根的代码,但对代码进行了少量更改?一个想法是改变猜测,以便现在连续迭代带来关于另一个根。但鉴于一个解决方案,我不知道如何做出这样的猜测。
答案 0 :(得分:2)
为衍生物制作第二个程序。更好的是,为包含初始化期间获得的系数的数值函数创建一个类,并提供值和导数的方法。
使用x /(eps ^ 2 + x ^ 2)去除函数1 / x。实际上,这应该不起作用,因为对多个根的收敛是缓慢的,所以在更高级的实现中,你必须实现代码来检测它并加速它。
要获得其他根,请使用Horner-Ruffini方案计算缩小的二次多项式,并使用求解公式求解。
尽量避免多次计算相同的值。这在这里并不重要,但对于更昂贵的功能,这变得至关重要。
答案 1 :(得分:1)
我使用C来编写程序,以计算给定间隔内任何用户输入的多项式的根。这是代码的链接