具有切比雪夫节点的插值多项式 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.
我试图在我的四个切比雪夫节点中插入一个函数 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.