拉格朗日插值、牛顿插值、埃尔米特插值的实现

    科技2024-05-29  84

    Lagrange插值

    import numpy as np # lagrange插值法 x = input("请输入x的值:") x = float(x) def lagrange(x): xi = np.array([1,2,3,4,5]) yi = np.array([1,4,7,8,6]) yLagrange = 0 n = len(xi) for i in range(n): t = yi[i] for j in range(n): if j != i: t *= (x - xi[j]) / (xi[i] - xi[j]) yLagrange += t print("Lagrange插值计算结果为:", yLagrange) return yLagrange if __name__ == '__main__': print(lagrange(x))

    Newton插值

    # newton插值法 # 获取插值结点 def data(xlist,ylist): data_list = input("请输入已知的x,y的值:").split(" ") # .split表示以何种方式进行切分 for i in range(0,len(data_list)): if i % 2 == 0: xlist.append(float(data_list[i])) else: ylist.append(float(data_list[i])) return xlist,ylist # newton插值 def newton(xlist,ylist,x): n = len(xlist) # n表示插值结点个数 ylist_copy = ylist.copy() # 存放y值 for i in range(0,n): # 计算0至n-1阶差商 if i == 0: continue # 0阶差商即为本身,不必计算 else: for j in range(i,n): # i阶差商有n-i个 ylist_copy[j] = (ylist[j] - ylist[j-1]) / (xlist[j] - xlist[j-i]) ylist = ylist_copy.copy() # 更新ylist为所计算的差商,用于下一列差商计算 print(ylist) # newton插值多项式的系数 # 计算插值结果 y_ans = ylist[0] # 牛顿插值多项式常数项即为y(0) for p in range(1,n): for q in range(0,p): ylist[p] = ylist[p] * (x - xlist[q]) y_ans = y_ans + ylist[p] return y_ans data_x = [] data_y = [] data_x,data_y = data(data_x,data_y) print(data_x) print(data_y) x = float(input("待预测x值:")) y = newton(data_x,data_y,x) print(y)

    Hermite插值

    # hermite插值 x_list = [] y_list = [] fd_list = [] x_list = input("请输入x的值:").split(" ") y_list = input("请输入对应的函数值:").split(" ") fd_list = input("请输入对应的导数值:").split(" ") x = input("请输入待求的x值:") n = len(x_list) for i in range(n): x_list[i] = float(x_list[i]) for i in range(n): y_list[i] = float(y_list[i]) for i in range(n): fd_list[i] = float(fd_list[i]) x = float(x) def basisfunction(x_list,n,x): lagrange_basis = [] for j in range(n): lj = 1 for i in range(n): if i != j: lj *= (x-x_list[i])/(x_list[j]-x_list[i]) lagrange_basis.append(lj) return lagrange_basis def hermite(x_list,y_list,fd_list,x,n,l_list): H = 0 alpha = 0 beta = 0 for j in range(n): sigma = 0 for k in range(n): if k != j: sigma += 1/(x_list[j]-x_list[k]) alpha = (1-2*(x-x_list[j])*sigma)*(l_list[j]**2) beta = (x-x_list[j])*(l_list[j]**2) H = H +alpha*y_list[j] +beta*fd_list[j] return H if __name__ == '__main__': l_list = basisfunction(x_list,n,x) print("hermite插值结果为{}".format(hermite(x_list,y_list,fd_list,x,n,l_list)))
    Processed: 0.016, SQL: 9