区间$[-1, 1]$作等距划分：$x_k = -1 + \frac{2k}{n}, k = 0, 1, 2, ..., n$
以$x_k$为节点对函数$f(x) = \frac{1}{5 + x^{2}}$进行插值逼近，分别取$n = 1, 5, 10, 15, 20, 25$，
用牛顿插值对$f(x)$进行逼近，并在同一坐标系下画出函数图像进行比较


# 3. 计算牛顿插值多项式
def newton_interpolation(x, coef, xp):
    n = len(coef)
    p = coef[-1]
    for k in range(1, n):
        p = coef[-(k + 1)] + (xp - x[-(k + 1)]) * p
    return p



def coffetients(n, i, j):
    # 基准条件
    if n == 0:
        return f()
    # 递归条件
    else:
        return (coffetients(n - 1, i + 1, j) - coffetients(n - 1, i, j - 1))/()



from typing import List

def newton_interpolation(x: List[float], y: List[float], point: float) -> float:
    n = len(x)
    df_list = [y]
    
    for k in range(1, n):
        df = 0
        for i in range(k + 1):
            X = 1
            for j in range(k + 1):
                if i == j:
                    continue
                X *= (x[i] - x[j])
            df += y[i] / X
        df_list.append(df)
    
    result = y[0]
    X = 1
    for i in range(1, n):
        X *= (point - x[i - 1])
        result += df_list[i] * X
    
    return result




#牛顿插值
from sympy import *

def f(a):
    f = sinh(a)
    return f
x_list = [0, 0.20, 0.30, 0.50]
y_list = []
for x in x_list:
    y = f(x)
    y_list.append(y)

n = len(x_list)
df_list = [y_list[0]]
for k in range(1,n):
    df = 0
    for i in range(k+1):
        X = 1
        for j in range(k+1):
            if i == j:
                pass
            else:
                X = X * (x_list[i]-x_list[j])
        df += y_list[i] / X
    df_list.append(df)
print(df_list)
P = df_list[0]
n = len(df_list)
x = Symbol('x')
a = 0.23
for i in range(n-1):
    X = 1
    for j in range(i+1):
        X = X * (x - x_list[j])
    P += df_list[i+1] * X
    print(f'{i+1}次牛顿差值多项式：',P,';',f'f({a})={P.subs(x,a)}')


0.16666666666666666
0.16688422877009454
0.16710170207523842
0.16731907710589983
0.16753634442409085
0.16775349463003403
0.1679705183621623
0.1681874062971192
0.16840414914975868
0.16862073767314517
0.16883716265855359


0.16666666666666666
0.16688919458063947
0.16711141903472496
0.1673333353264966
0.16755493873280008
0.1677762245101323
0.16799718789501494
0.1682178241043632
0.16843812833584967
0.16865809576826377
0.1688777215618665
0.1690970008587415




















