Python Can';t构造一个反向牛顿多项式

Python Can';t构造一个反向牛顿多项式,python,python-3.x,numpy,numerical-methods,Python,Python 3.x,Numpy,Numerical Methods,我已经玩了半天这个代码了,我最多只能改变曲线的方向。我尝试过使用相同的算法(尽管由于方向反转而略有调整)构造一个正向牛顿多项式,但效果很好。我把它们都包括在内,供你比较 将numpy作为np导入 将matplotlib.pyplot作为plt导入 a=-1 b=1 N=201 x=np.linspace(a,b,N) n=[3,7,10,20] plotsPfw=[无,无,无,无] 图1,((plotsPfw[0],plotsPfw[1]),(plotsPfw[2],plotsPfw[3])=

我已经玩了半天这个代码了,我最多只能改变曲线的方向。我尝试过使用相同的算法(尽管由于方向反转而略有调整)构造一个正向牛顿多项式,但效果很好。我把它们都包括在内,供你比较


将numpy作为np导入
将matplotlib.pyplot作为plt导入
a=-1
b=1
N=201
x=np.linspace(a,b,N)
n=[3,7,10,20]
plotsPfw=[无,无,无,无]
图1,((plotsPfw[0],plotsPfw[1]),(plotsPfw[2],plotsPfw[3])=plt.子地块(2,2,gridspec_kw={'hspace':0.5,'wspace':0.5})
plotsPbw=[无,无,无,无]
图2,((plotsPbw[0],plotsPbw[1]),(plotsPbw[2],plotsPbw[3])=plt.子地块(2,2,gridspec_kw={'hspace':0.5,'wspace':0.5})
def Runge(x):
返回1/(1+25*np.幂(x,2))
def findif_forw(功能、订单、i):
如果订单==1:
返回(func[i+1]-func[i])
其他:
返回(findif_forw(func,order-1,i+1)-findif_forw(func,order-1,i))
def findif_backw(函数、命令、i):
如果订单==1:
返回(func[-1-i]-func[-1-i+1])
其他:
返回(findif_backw(func,order-1,i)-findif_backw(func,order-1,i-1))
def Newton_forw(xi,func,n):
h=xi[1]-xi[0]
N=func[0]
q=(x-xi[0])/h
Q=1
对于范围(1,n)内的i:
Q*=(Q-i+1)/i
N+=findif_forw(func,i,0)*Q
返回N
def Newton_backw(xi,func,n):
h=xi[1]-xi[0]
N=func[-1]
q=(x-xi[-1])/h
Q=1
对于范围(1,n)内的i:
Q*=(Q+i-1)/i
N+=findif_backw(func,i,i)*Q
返回N
yRunge=Runge(x)
对于范围(0,len(n))中的i:
席=NP.林空间(A,B,N[i])
yRungei=Runge(xi)
yNewton_forw=牛顿_forw(xi,yRungei,n[i])
yNewton_backw=牛顿_backw(xi,yRungei,n[i])
plotsPfw[i].绘图(x,yRunge,':r',x,yNewton_for W,'-g',线宽=0.25)
plotsPfw[i].set_title('n={}'。格式(n[i]))
plotsPfw[i]。集合xlabel('x')
plotsPfw[i].set_ylabel('Runge,fwdp{}(x)')。格式(n[i]))
绘图SPBW[i]。绘图(x,yRunge,':r',x,yNewton_backw,'-b',线宽=0.25)
plotsPbw[i].set_title('n={}'。格式(n[i]))
plotsPbw[i]。设置标签('x')
plotsPbw[i].set_ylabel('Runge,bkwd P{}(x)')。格式(n[i]))
plt.show()
有限差分似乎没问题,在我手动检查之后,问题可能来自多项式的
q
部分。这在n=3的情况下最为明显——在前进公式中,在步骤1之后,Q是一个上升(沿插值方向)的斜率,而在步骤2之后,Q是一个向下的抛物线,向左移动,因此在最右端,它们似乎相互抵消,导致插值多项式图通过目标图
n

在反向公式中,Q几乎总是下降的(同样,在插值方向上),因此最左端变得极不平衡,这可以在图上看到。我尝试了以下方法:

  • 反转1阶有限差分返回的值的符号

  • 把q的公式符号颠倒过来

  • 在q多项式中使用q+i+1、q+i、q-i+1


我认为要么插值方法被认为朝着相反的方向变得不平衡(正向多项式是错误的),要么正向多项式的行为与它被认为的一样(反向多项式是错误的)

你的后向差异非常奇怪。为什么在顺序1差异中存在
-i
?您可以修复该问题,并通过按顺序0结束这两个过程来进一步简化这两个过程

def findif_forw(func, order, i):
    return  func[i] if order == 0 else findif_forw(func, order-1, i+1) - findif_forw(func, order-1, i);

def findif_backw(func, order, i):
    return  func[i] if order == 0 else findif_backw(func, order-1, i) - findif_backw(func, order-1, i-1)
这将使用来自初始索引的值计算向后差异 向后移动
订单
条款。要将其作为数组末尾的值,只需使用

        N += findif_backw(func, i, -1)*Q

请注意,当您重新计算几个中间差异时,这不是非常有效

从函数的对称性来看,结果前后一致。