具有切比雪夫节点的插值多项​​式 python

Interpolation polynomial with chebyshev nodes python

我试图在我的四个切比雪夫节点中插入一个函数 f(x),但我在我的拉格朗日函数中得到错误 "list index out of range"

第 47 行,拉格朗日 多边形 = 多边形 + ydata[i]*l[i]

IndexError: 列表索引超出范围

我不太擅长 python,似乎无法解决问题。我已经尝试检查 ydata 的长度,但我的代码太长了,所以如果我注释掉某些内容,它只会给出更多错误:)) 还尝试更改我的 n 和范围内的输入。任何提示和技巧将不胜感激。

import numpy as np
from numpy import pi
import matplotlib.pyplot as plt

newparams = {'figure.figsize': (6.0, 6.0), 'axes.grid': True,
             'lines.markersize': 8, 'lines.linewidth': 2,
             'font.size': 14}
plt.rcParams.update(newparams)

#LEGGER INN NØDVENDIGE FUNKSJONER

#definerer funksjonen f
def f(x):                         
    return 2**(x**2-6*x+9) 


#chebyshev noder
def chebyshev_nodes(a, b, n):
    # n Chebyshev noder i intervallet [a, b]
    i = np.array(range(n))
    x = np.cos((2*i+1)*pi/(2*(n))) # noder over intervallet [-1,1]
    return 0.5*(b-a)*x+0.5*(b+a) # noder over intervallet [a,b]

#kardinalfunksjonene
def cardinal(xdata, x):
    n=len(xdata)
    l = []
    for i in range(n):
        li = np.ones(len(x))
        for j in range(n):
            if i is not j:
                li = li*(x-xdata[j])/(xdata[i]-xdata[j])
        l.append(li)
        return l

#lagrange
def lagrange(ydata, l):
    poly = 0
    for i in range(len(ydata)):
        poly = poly + ydata[i]*l[i]
    return poly
    
            
a, b = 2, 5                      #endepunkter til intervallet                      
x = np.linspace(a,b,101)         #x-veridene for plotting
 
#antall noder/interpolasjonspunktene                                       
n = 4;  
xdata = chebyshev_nodes(a, b, n+1)       #Chebyshev-nodene
ydata = f(xdata);

#evaluering av interpolasjonspolynomet i x-verdiene
l =cardinal(xdata, x)
p =lagrange(ydata, l)

# Plot f(x) og p(x) and the interpolation points
plt.subplot(2,1,2)                  
plt.plot(x, f(x), x, p, xdata, ydata, 'o')
plt.legend(['f(x)','p(x)'])
plt.grid(True)

这是一个非常简单的错误。在您的函数中 cardinal return l 缩进太多,这意味着它将 return 在 for 循环中的第一个值而不是最后。所以无论那个函数 return 将是一个长度为 1 的列表而不是长度为 n.