牛顿均差插值多项式

博客介绍了均差定义、均差表和牛顿插值多项式。详细说明了牛顿插值多项式的表达式,它由基函数逐次递推得到。还阐述了用Python实现牛顿插值多项式的均差系数、基函数及多项式本身,同时提及秦九韶算法,并给出测试和运行结果。
Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

1.均差定义

f[x0,xk]=f(xk)−f(x0)xk−x0为函数f(x)关于点x0,xk的一阶均差f[x_0,x_k]=\dfrac{f(x_k)-f(x_0)}{x_k-x_0}为函数f(x)关于点x_0,x_k的\textbf{一阶均差}f[x0,xk]=xkx0f(xk)f(x0)为函数f(x)关于点x0,xk一阶均差
f[x0,x1,xk]=f[x0,xk]−f[x0,x1]xk−x1称为f(x)的二阶均差.f[x_0,x_1,x_k]=\dfrac{f[x_0,x_k]-f[x_0,x_1]}{x_k-x_1}称为f(x)的\textbf{二阶均差.}f[x0,x1,xk]=xkx1f[x0,xk]f[x0,x1]称为f(x)二阶均差.
一般地,称
f[x0,x1,…,xk]=f[x0,…,xk−2,xk]−f[x0,x1,…,xk−1]xk−xk−1f[x_0,x_1,\ldots,x_k]=\dfrac{f[x_0,\ldots,x_{k-2},x_k]-f[x_0,x_1,\ldots,x_{k-1}]}{x_k-x_{k-1}}f[x0,x1,,xk]=xkxk1f[x0,,xk2,xk]f[x0,x1,,xk1]
f(x)的k阶均差(均差也称为差商.)f(x)的\textbf{k阶均差}(均差也称为\textbf{差商.})f(x)k阶均差(均差也称为差商.)

2.均差表

xkx_kxkf(xk)f(x_k)f(xk)一阶均差二阶均差三阶均差四阶均差
x0x_0x0f(x0)f(x_0)f(x0)
x1x_1x1f(x1)f(x_1)f(x1)f[x0,x1]f[x_0,x_1]f[x0,x1]
x2x_2x2f(x2)f(x_2)f(x2)f[x1,x2]f[x_1,x_2]f[x1,x2]f[x0,x1,x2]f[x_0,x_1,x_2]f[x0,x1,x2]
x3x_3x3f(x3)f(x_3)f(x3)f[x2,x3]f[x_2,x_3]f[x2,x3]f[x1,x2,x3]f[x_1,x_2,x_3]f[x1,x2,x3]f[x0,x1,x2,x3]f[x_0,x_1,x_2,x_3]f[x0,x1,x2,x3]
x4x_4x4f(x4)f(x_4)f(x4)f[x3,x4]f[x_3,x_4]f[x3,x4]f[x2,x3,x4]f[x_2,x_3,x_4]f[x2,x3,x4]f[x1,x2,x3,x4]f[x_1,x_2,x_3,x_4]f[x1,x2,x3,x4]f[x0,x1,x2,x3,x4]f[x_0,x_1,x_2,x_3,x_4]f[x0,x1,x2,x3,x4]
⋮\vdots⋮\vdots⋮\vdots⋮\vdots⋮\vdots⋮\vdots

3.牛顿插值多项式

一般情形已知f在插值点xi(i=0,1,…,n)一般情形已知f在插值点x_i(i=0,1,\ldots,n)一般情形已知f在插值点xi(i=0,1,,n)上的值为f(xi)(i=0,1,…,n),要求n次插值多项式Pn(x)满足条件f(x_i) (i=0,1,\ldots,n),要求n次插值多项式P_n(x)满足条件f(xi)(i=0,1,,n),要求n次插值多项式Pn(x)满足条件
Pn(xi)=f(xi),i=0,1,…,n,P_n(x_i)=f(x_i),\quad i=0,1,\ldots,n,Pn(xi)=f(xi),i=0,1,,n,
Pn(x)P_n(x)Pn(x)可表示为
Pn(x)=f(x0)+f[x0,x1](x−x0)+f[x0,x1,x2](x−x0)(x−x1)+…+f[x0,x1,…,xn](x−x0)…(x−xn−1)P_n(x)=f(x_0)+f[x_0,x_1](x-x_0)+f[x_0,x_1,x_2](x-x_0)(x-x_1)+\ldots+f[x_0,x_1,\ldots,x_n](x-x_0)\ldots(x-x_{n-1})Pn(x)=f(x0)+f[x0,x1](xx0)+f[x0,x1,x2](xx0)(xx1)++f[x0,x1,,xn](xx0)(xxn1)
与拉格朗日插值不同,这里Pn(x)P_n(x)Pn(x)是由基函数{1,x−x0,…,(x−x0)…(x−xn−1)}\{1,x-x_0,\ldots,(x-x_0)\ldots(x-x_{n-1})\}{1,xx0,,(xx0)(xxn1)}逐次递推得到.

4.Python实现牛顿插值多项式均差系数

import numpy as np
from sympy import expand
from sympy.abc import x


# 自己原创
def difference_quotient_coefficient(x_array: np.ndarray, y_array: np.ndarray):
    """
    实现牛顿均差插值多项式各阶均差系数
    :param x_array: 横坐标数组
    :param y_array: 纵坐标数组
    :return: 各阶均差系数数组
    """
    nth = x_array.shape[0]
    # 初始化均差系数数组
    difference_quotient_array = np.zeros(nth)
    difference_quotient_array[0] = y_array[0]
    # 求各阶均差
    for i in range(1, nth):
        nth_difference_quotient = np.zeros(nth - i)
        # 求每阶均差
        for j in range(nth - i):
            nth_difference_quotient[j] = (y_array[j + 1] - y_array[j]) / (x_array[i + j] - x_array[j])
        difference_quotient_array[i] = nth_difference_quotient[0]
        y_array = nth_difference_quotient
    return difference_quotient_array

5.Python实现牛顿插值多项式基函数

# 自己原创
def newtown_base_function(symbol_x, x_array: np.ndarray):
    """
    实现牛顿均差插值基函数
    :param symbol_x: 符号变量x
    :param x_array: 横坐标数组
    :return: 牛顿均差插值基函数数组
    """
    nth = x_array.shape[0]
    base_function_array = np.zeros(nth, dtype=np.ndarray)
    # base_function_array = list(np.zeros(nth))
    base_function_array[0] = 1
    for i in range(1, nth):
        base_function_array[i] = np.prod(symbol_x - x_array[:i], dtype=np.ndarray)
    return base_function_array

6.Python实现牛顿插值多项式

# 自己原创
def newtown(x_array: np.ndarray, y_array: np.ndarray, symbol_x):
    """
    实现牛顿均差插值多项式
    :param x_array: 插值结点横坐标数组
    :param y_array: 插值结点纵坐标数组
    :param symbol_x: 符号变量x
    :return: 牛顿均差插值多项式
    """
    return expand(np.sum(difference_quotient_coefficient(x_array, y_array) * newtown_base_function(symbol_x, x_array)))

7.秦九韶算法

# 自己原创
def qin_jiu_shao(coefficient_array: np.ndarray, value, is_ascending_order: bool = False):
    """
    多项式求值的秦九韶算法,即Horner算法
    :param coefficient_array: 多项式系数数组
    :param value: 自变量的值
    :param is_ascending_order: 多项式排列顺序
    :return: the value of polynomial
    example:
    2*x**4 - 3*x**2 + 3*x - 4=((((2x+0)x-3)x+3)x-4)
    3*x**5 - 2*x**3 + x + 7=(((((3x+0)x-2)x+0)x+1)x+7)
    """
    if is_ascending_order:
        coefficient_array = coefficient_array[::-1]
    degree = coefficient_array.shape[0]
    b = coefficient_array[0]
    for i in range(1, degree):
        b = b * value + coefficient_array[i]
    return b

8.测试

if __name__ == '__main__':
	# 牛顿均差插值多项式测试成功,来源详见李庆扬数值分析第5版P48,e.x.1
	x_coefficient_list = [1, -1, 2]
    x_coefficient_array = np.array(x_coefficient_list)
    y = np.array([0, -3, 4])
    # 牛顿均差插值多项式均差系数测试成功
    print("牛顿均差插值多项式均差系数:{}".format(difference_quotient_coefficient(x_coefficient_array, y)))
    # 牛顿均差插值多项式基函数测试成功
    print("牛顿均差插值多项式基函数:{}".format(newtown_base_function(x, x_coefficient_array)))
    newtown_polynomial = newtown(x_coefficient_array, y, x)
    # 计算牛顿插值多项式(降幂排列)在x=2处的值
    print("牛顿插值多项式(降幂排列)在x=2处的值为:{}".format(newtown_polynomial.subs(x, 2)))
    # 创建牛顿插值多项式对象
    newtown_interpolation_polynomial = Poly(newtown_polynomial, x)
    # 获得牛顿插值多项式降幂排列系数
    newtown_polynomial_coefficient = np.array(newtown_interpolation_polynomial.coeffs())  # list 类型
    # 使用秦九韶算法计算牛顿插值多项式(降幂排列)在x=2处的值
    print("秦九韶算法计算牛顿插值多项式(降幂排列)在x=2处的值为:{}".format(qin_jiu_shao(newtown_polynomial_coefficient, 2)))
    # 牛顿插值多项式次数
    print("牛顿插值多项式次数为:{}".format(newtown_interpolation_polynomial.degree()))
    # 牛顿插值多项式子项次数
    print("牛顿插值多项式子项次数为:{}".format(newtown_interpolation_polynomial.monoms()))

9.运行结果

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值