使用Python求牛顿插值多项式及其差商表
2021-06-21 02:04
标签:它的 span 数值 bsp width one 转化 inf alt 闲话不多说,直接上代码。 得到的差商表: 牛顿插值多项式(比较长,就截取了部分): 拉格朗日插值多项式代码(使用方法很简单,和牛顿插值多项式一样): 各位大哥点个赞呐(卑微) 使用Python求牛顿插值多项式及其差商表 标签:它的 span 数值 bsp width one 转化 inf alt 原文地址:https://www.cnblogs.com/czy552/p/14906640.html 1 import numpy as np
2 from sympy import *
3
4 # 定义一个求差商表的函数,使用递归求解差商表,返回值是差商的值
5 # x是数组,表示样本点的x
6 # f是数组,表示样本点的函数值f(x)
7 # start是int类型,表示x数组的起始下标,
8 # end是int类型,表示x数组的结束下标,
9 # res是数组类型,表示差商表,对角线以下为各阶差商表
10 def cs(x,f,start,end,res):
11 # 当x中只有两个元素的时候,结束递归
12 if((end-start)==1):
13 # 将一阶差商填入差商表
14 res[end-1][end-start-1]=(f[end]-f[start])/(x[end]-x[start])
15 # 返回差商
16 return res[end-1][end-start-1]
17 # 当x中元素个数大于2时,根据公式递归调用此函数求差商,并将差商填入差商表
18 res[end-1][end-start-1]=(cs(x,f,start+1,end,res)-cs(x,f,start,end-1,res))/(x[end]-x[start])
19 # 返回差商
20 return res[end-1][end-start-1]
21
22 # 定义一个求牛顿插值多项式的函数
23 # x是数组,表示样本点的x
24 # f是数组,表示样本点的函数值f(x)
25 def Newton(x,f):
26 res = np.ones([x.size - 1, x.size - 1])*np.inf # 初始化差商表骨架结构
27 cs(x, f, 0, x.size - 1, res) #调用差商表函数给差商表填值,对角线及以下才是差商表的值
28 X=symbols("x") #定义x变量
29 y=f[0] #初始化牛顿插值多项式,它的第一项是常数项,正好是f[0]
30 for i in range(x.size-1):
31 temp=1 #临时变量,保存 f[x0,x1,...,xn]*(x-x1)(x-x2)...(x-xn-1)
32 for j in range(i+1):
33 temp=temp*(X-x[j]) #(x-x1)(x-x2)...(x-xn-1)
34 temp=res[i,i]*temp #将差商表对角线元素作为系数
35 y=y+temp #将temp添加到多项式中
36 # 返回牛顿插值多项式
37 return y
38
39 if __name__=="__main__":
40 # 样本点
41 x=np.array([2.0,2.1,2.2,2.3,2.4])
42 f=np.array([1.414214,1.449138,1.483240,1.516575,1.549193])
43
44 ##### 可以直接得到差商表
45 res = np.ones([x.size - 1, x.size - 1]) * np.inf # 初始化差商表骨架结构
46 # 调用差商表函数
47 cs(x,f,0,x.size-1,res)
48 print(res)
49
50 #### 也可以直接得到牛顿插值多项式
51 X=symbols("x") #定义自变量x
52 y=Newton(x,f) #调用函数得到牛顿插值多项式,类型是
1 #拉格朗日插值法
2 def L(x,f):
3 X=symbols("x")
4 m=x.size #x个数
5 L=0
6 for i in range(m):
7 temp=1
8 for j in range(m):
9 if(i!=j):
10 temp=temp*((X-x[j])/(x[i]-x[j]))
11 L=L+temp*f[i]
12 return L
上一篇:排序算法分享