威尔金森多项式用修正函数确定新根

时间:2018-02-05 09:58:39

标签: python numerical-methods newtons-method

  

Wilkinson [1963]的一个例子表明,多项式系数的微小变化可能对根有很大的影响。让

f(x) = (x − 1)(x − 2) · · · (x − 20)
     

已被称为威尔金森多项式。当函数更改为r = 20时,尝试确定零f(x) − 10^(−8) * x^19会发生什么。提示:在双精度中使用割线方法

所以我试图做的首先是f的零,显然是整数1, 2, . . . , 20。但我相信我需要使用割线方法在(20, 21)之间找到零?我该怎么办?

这是我的割线代码:

def SecantMethod(f,x0,x1,nmax,error):

    for i in range(nmax):

        if f(x1)-f(x0) == 0 or abs(f(x1)-f(x0)) <= error:
            return x1

        x2 = x1 - (f(x1)*(x1-x0))/(f(x1)-f(x0))
        x0 = x1
        x1 = x2
    return x1

1 个答案:

答案 0 :(得分:0)

试图解释你严重错误的公式我得到以下解释

def f(x):
    res = 1;
    for k in range(20): res *= x-k-1
    return res

def f1(x): return f(x)-1e-8*x**19

x1, x2 = 20, 20.1
while abs(x2-x1)>1e-13: 
    print "x=%.16f,  f(x)=%.12g"%(x1, f1(x1)); 
    x1,x2 = x2, x2 - (f1(x2)*(x2-x1))/(f1(x2)-f1(x1))
print "x=%.16f,  f(x)=%.12g"%(x1, f1(x1)); 
print "x=%.16f,  f(x)=%.12g"%(x2, f1(x2)); 

使用迭代序列的结果输出

x=20.0000000000000000,  f(x)=-5.24288e+16
x=20.1000000000000014,  f(x)=-4.0426485012e+16
x=20.4368223967820448,  f(x)=1.4159426847e+17
x=20.1748076541532662,  f(x)=-2.31966692518e+16
x=20.2116899573180113,  f(x)=-1.12078103606e+16
x=20.2461694572670474,  f(x)=2.5395983862e+15
x=20.2397999600010081,  f(x)=-2.01198072116e+14
x=20.2402675359738211,  f(x)=-3.21814911103e+12
x=20.2402751363869271,  f(x)=4179299808
x=20.2402751265293332,  f(x)=-86592
x=20.2402751265295358,  f(x)=-776
x=20.2402751265295393,  f(x)=752

这是最好的情节

plt.plot(I,f1(20.24027512652954+1e-14*I));plt.grid(); plt.show()

enter image description here

演示,在浮点精度中,-776和752之间没有中间值。