[Python] 牛顿插值

插值公式为:

 

差商递归公式为:

# -*- coding: utf-8 -*-
#Program 0.4 Newton Interpolation

import numpy as np
import matplotlib.pyplot as plt

#递归求差商
def get_diff_quo(xi, fi):
	if len(xi) > 2 and len(fi) > 2:
		return (get_diff_quo(xi[:len(xi)-1], fi[:len(fi)-1]) - get_diff_quo(xi[1:len(xi)], fi[1:len(fi)])) / float(xi[0] - xi[-1])
	return (fi[0]-fi[1]) / float(xi[0]-xi[1])

#求w,使用闭包函数
def get_w(i, xi):
	def wi(x):
		result = 1.0
		for j in range(i):
			result *= (x - xi[j])
		return result
	return wi

#做插值
def get_Newton(xi, fi):
	def Newton(x):
		result = fi[0]
		for i in range(2, len(xi)):
			result += (get_diff_quo(xi[:i], fi[:i]) * get_w(i-1, xi)(x))
		return result
	return Newton

#已知结点
xn = [i for i in range(-50, 50, 10)]
fn = [i**2 for i in xn]

#插值函数
Nx = get_Newton(xn, fn)

#测试用例
tmp_x = [i for i in range(-50, 51)]
tmp_y = [Nx(i) for i in tmp_x]

#作图
plt.plot(xn, fn, 'r*')
plt.plot(tmp_x, tmp_y, 'b-')
plt.title('Newton Interpolation')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

  

转载于:https://www.cnblogs.com/KennyRom/p/6625492.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值