给定一些数据,生成函数的方式有两种:插值,回归。
插值而得到的函数通过数据点,回归得到的函数不一定通过数据点。
下面给出拉格朗日插值,牛顿插值和Hermite插值的程序,
具体原理可参考课本,不再赘述。
拉格朗日插值法
线性插值 一次精度 需要2个节点
二次插值 二次精度 需要3个节点
n次插值 n次精度 需要n+1个节点
拉格朗日插值代码段(根据传入数据自动判断次数):
# 返回多项式
def p(x,a):
"""p(x,a)是x的函数,a是各幂次的系数"""
s = 0
for i in range(len(a)):
s += a[i]*x**i
return s
# n次拉格朗日插值
def lagrange_interpolate(x_list,y_list,x):
"""x_list 待插值的x元素列表y_list 待插值的y元素列表插值以后整个lagrange_interpolate是x的函数"""
if len(x_list) != len(y_list):
raise ValueError("list x and list y is not of equal length!")
# 系数矩阵
A = []
for i in range(len(x_list)):
A.append([])
for j in range(len(x_list)):
A[i].append(pow(x_list[i],j))
b = []
for i in range(len(x_list)):
b.append([y_list[i]])
# 求得各阶次的系数
a = lu_solve(A, b) # 用LU分解法解线性方程组,可以使用numpy的类似函数
a = transpose(a)[0] # change col vec a into 1 dimension
val = p(x,a)
print(x,val)
return val
其中lu_solve(A,b)是自己写的轮子,可以用numpy的numpy.li