import math # 定义原函数和其导函数计算结果 def FxDiff_n(x,n): result = 0 if n == 0: # 下面改成原函数 ####################3######################################## result = math.log(x) else: # 下面改成n阶导数 ############################################################################## result = (-1)**(n+1) * math.factorial(n-1) / (x**n) return result # 获取与待求x最接近的两个点 def GetClosestTwo(x,list_x): for i in range(0, len(list_x)): if x < list_x[i]: return i-1, i return len(list_x)-2, len(list_x)-1 # 获取与待求x最接近的三个点 def GetClosestThree(x,list_x): if x < list_x[1]: return 0, 1, 2 for i in range(3, len(list_x)): if x < list_x[i]: return i-2, i-1, i return len(list_x)-3, len(list_x)-2, len(list_x)-1 # 线性插值余项计算 def LinearRegression(x,list_x): i, j = GetClosestTwo(x,list_x) ks = max([abs(FxDiff_n(list_x[i],2)), abs(FxDiff_n(list_x[j],2))]) omg = (x-list_x[i])*(x-list_x[j]) return abs(ks*omg/2) # 抛物线插值余项计算 def ParabolaRegression(x,list_x): i, j, k = GetClosestThree(x,list_x) ks = max([abs(FxDiff_n(list_x[i],3)), abs(FxDiff_n(list_x[j],3)), abs(FxDiff_n(list_x[k],3))]) omg = (x-list_x[i])*(x-list_x[j])*(x-list_x[k]) return abs(ks*omg/6) # 线性插值 def LinearInterpolation(x,list_x,list_y): i, j = GetClosestTwo(x,list_x) result = list_y[i] + (x - list_x[i]) * (list_y[j] - list_y[i]) / (list_x[j] - list_x[i]) r = LinearRegression(x,list_x) return (result,r) # 抛物线插值 def ParabolaInterpolation(x,list_x,list_y): i, j, k = GetClosestThree(x,list_x) result = list_y[i] * (x - list_x[j]) * (x - list_x[k]) / (list_x[i] - list_x[j]) / (list_x[i] - list_x[k]) result += list_y[j] * (x - list_x[i]) * (x - list_x[k]) / (list_x[j] - list_x[i]) / (list_x[j] - list_x[k]) result += list_y[k] * (x - list_x[i]) * (x - list_x[j]) / (list_x[k] - list_x[i]) / (list_x[k] - list_x[j]) r = ParabolaRegression(x,list_x) return (result,r) # 拉格朗日插值 def LagrangeInterpolation(x,list_x,list_y): result = 0 for i in range(0, len(list_x)): temp = 1 for j in range(0, len(list_x)): if i != j: temp *= (x - list_x[j]) / (list_x[i] - list_x[j]) result += temp * list_y[i] return result list_x = [10,11,12,13] #改成题干的数值############################# list_y = [2.3026,2.3979,2.4849,2.5649] #改成题干的数值############################# if __name__ == "__main__": print("线性插值 ln11.75 结果为%f, 截断误差%f" % LinearInterpolation(11.75,list_x,list_y)) #改成题干的数值############################# print("抛物线插值 ln11.75 结果为%f, 截断误差%f" % ParabolaInterpolation(11.75,list_x,list_y)) #改成题干的数值############################# # print(LagrangeInterpolation(11.75,list_x,list_y))