importmatplotlib.pyplotasplt“”@ brief :计算n级差商f[x0,x1,x2 . xn]
@param: xi所有插值节点的横坐标集合o
@param: fi所有插值节点的纵坐标集合/
@return:返回xi的I阶差商(I是从xi的长度中减去1后的值) o )
@notice:a.Xi和fi的长度必须相等//"
b .因为使用了递归,所以注意不要让堆栈爆炸. o o o o
c .递归减少递归(每个递归包含两个递归函数),每个递归次数均为平方增加,总次数为充满二叉树的所有节点的数量(),因此容易发生堆栈溢出) )。
defget_order_diff_quot(Xi=[],fi=[] ) :iflen ) Xi )2andlen ) fi ) 2:return ) get_order_diff ) fi[:len(fi )-1]-get_order_diff_quot ) Xi [ 1: len (Xi ),fi[1:len ) fi ] ]/float ) )
Wi的语义示例w1=(x-x0 ); w2=(x-x0 ) ) x - x1 ); w3=(x-x0 ) ) x - x1 ) ) x - x2 ) )。
@param: i i阶(I阶多项式) ) ) ) ) ) ) ) ) ) ) ) )。
@param: xi所有插值节点的横坐标集合
@return:返回wi(x )函数“”
defget_wi(I=0,xi=[] ) :defWi(x ) x ) :
结果=1.0
foreachinrange(I ) :
result*=(x-Xi[each] ) returnresultreturnwi ' ' @ brief :得到诚实的水壶插值函数
@“”'
defget_Newton_inter(Xi=[],fi=[] ) :defNewton_inter(x ) x ) :
结果=fi [0]基础范围(2,Len ) Xi ) ) :
result=(get _ order _ diff _ quot (Xi [ : I ],fi[:i] ) get_wi(I-1,Xi ) ) ) ) returnresultretreturetureturetureturett
if_name_=='_main_': ' '内插节点,这里是用二次函数生成内插节点,每两个节点生成x轴距离位10 ' ' ' Sr _ x=[ iforinrange (-- ) ]
sr_fx=[i**2 for i insr_x]
NX=get_Newton_inter(Sr_x,sr_fx ) #获取内插函数
tmp _ x=[ iforiinrange (-50,51 ) ] #测试用例
tmp_y=[NX(I ) for i in tmp_x] #根据插值函数得到测试用例的纵轴
“”画图“”PLT.figure('IloveChina ) )。
ax1=PLT.subplot(111 ) )
这是PLT.SCA(ax1 )
PLT.plot(Sr_x,sr_fx,linestyle=',marker='o ',color='b ' )
PLT.plot(tmp_x,tmp_y,linestyle='-- ',color='r ' )
plt.show () ~
~
' linear_test.py' 81L,2764 cwritten 45,5 bot