多项式插值误差的定义

Definition of error in polynomial interpolation

我需要为函数 exp(x) (f(x)) 编写拉格朗日多项式 (g(x)) 的多项式插值程序。

n = 10
x = []
y = []


def f(x):
    return math.exp(x)


def lagranz(x, y, t):
    z = 0
    for j in range(len(y)):
        p1 = 1
        p2 = 1
        for i in range(len(x)):
            if i != j:
                p1 *= (t - x[i])
                p2 *= (x[j] - x[i])
        z = z + y[j] * p1 / p2
    return z


# uniform grid
print('Равномерная сетка') 
for i in range(1, n + 1):
    temp = -1 + 2 * (i - 1) / (n - 1)
    x.append(temp)
    y.append(f(temp))

ynew = [lagranz(x, y, i) for i in x]


# errors
print('#\tx\tf(x)\tg(x)\tпогрешность')
for i in range(0, n):
    print(i, '\t', x[i], '\t', y[i], '\t', ynew[i], '\t', ynew[i]-y[i])

我需要调查错误行为。

增量 g(x) = g(x) - f(x)

但问题是在主节点中错误为零。
我需要在更密集的网格上调查错误,但我不知道该怎么做。

只需计算其他地方的插值值

import math

def f(x):
    return math.exp(x)

def lagranz(x, y, t):
    z = 0
    for j in range(len(y)):
        p1 = 1
        p2 = 1
        for i in range(len(x)):
            if i != j:
                p1 *= (t - x[i])
                p2 *= (x[j] - x[i])
        z = z + y[j] * p1 / p2
    return z


# This is the grid where you *define* interpolant
n = 10
xnode = []
fnode = []

for i in range(1, n + 1):
    temp = -1 + 2 * (i - 1) / (n - 1)
    xnode.append(temp)
    fnode.append(f(temp))

# This is where you calculate interpolant values
# at arbitrary points, but *fixed* grid
xs = [0.5, 1.5, 3.0]
finter = [lagranz(xnode, fnode, x) for x in xs]

# Benchmark
for (x, y) in zip(xs, finter):
    print(x, y, f(x), f(x) - y)

你也可以定义一个闭包,让插值的计算更清晰

finter = lambda x: lagranz(xnode, fnode, x)
for x in xs:
    print(x, finter(x), f(x), finter(x) - f(x))