怎么用python编程实现二次差值多项式_分段二次插值——用Python进行数值计算

事实上在实际使用中,高次插值显然是很不适合的,高次插值将所有样点包涵进一个插值函数中,这是次幂高的原因。高次计算复杂,而且刚开始的一点误差会被方的很大。因此将整个区间分为若干个小区间,在每一个小区间进行插值这样更好,实现容易,也方便在一些嵌入式设备上使用。有不少需要插值方法的场景是在嵌入式的应用中。

我以等距节点的二次插值为例,以每三个节点为一个子区间。

等距节点二次插值很好写,由于每个区间只有三个插值节点,计算差商也不必使用拉格朗日插值中使用的递归,直接列表达式也很简单(实际上等距节点二次插值就是只有三个节点的拉格朗日插值,只是此时在定义域内,有很多个拉格朗日插值函数,每个子区间对应一个)。递归的副作用相当的明显,尽管写成尾递归可以减小副作用,但是能避免递归还是避免吧。

分段插值函数可以表示为:

852353-20161126103817925-482195822.png

每一个插值函数表达式:

852353-20161126104705846-1759516664.png

如上,不需要用递归求差商,方便很多。一个函数即可搞定。

"""

@brief: 获得分段二次插值函数

@param: x 插值节点的横坐标集合

@param: fx 插值节点的纵坐标集合

@return: 参数所指定的插值节点集合对应的插值函数

"""

def get_sub_two_interpolation_func(x = [], fx = []):

def sub_two_interpolation_func(Lx):

result = 0

for index in range(len(x)-2):

if Lx >= x[index] and Lx <= x[index+2]:

result = fx[index]*(Lx-x[index+1])*(Lx-x[index+2])/(x[index]-x[index+1])/(x[index]-x[index+2]) + \

fx[index+1]*(Lx-x[index])*(Lx-x[index+2])/(x[index+1]-x[index])/(x[index+1]-x[index+2]) + \

fx[index+2]*(Lx-x[index])*(Lx-x[index+1])/(x[index+2]-x[index])/(x[index+2]-x[index+1])

return result

return sub_two_interpolation_func

852353-20161126104907596-2084924310.png

"""

demo:

"""

if __name__ == '__main__':

''' 插值节点, 这里用二次函数生成插值节点,每两个节点x轴距离位10 '''

sr_x = [i for i in range(-50, 51, 10)]

sr_fx = [i**2 for i in sr_x]

Lx = get_sub_two_interpolation_func(sr_x, sr_fx) # 获得插值函数

tmp_x = [i for i in range(-45, 45)] # 测试用例

tmp_y = [Lx(i) for i in tmp_x] # 根据插值函数获得测试用例的纵坐标

''' 画图 '''

import matplotlib.pyplot as plt

plt.figure("play")

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()

插值函数图像:

852353-20161126105021768-992420794.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值