牛顿插值多项式(插值法)

问题描述

考虑[0,4]内的函数y=f(x)=cos(x)。利用多个(4、5等)节点构造牛顿插值多项式。

输入形式

在屏幕上依次输入在区间[0,4]内的一个值x*,构造插值多项式后求其P(x*)值,和多个节点的x坐标。

输出形式

输出牛顿插值多项式系数向量,差商矩阵和P(x*)值(保留小数点后6位有效数字)。

样例1输入

0.3

0 1 2 3 4

样例输出

[-0.01465683 0.23450012 -0.8492783 0.16973731 1. ]

[[ 1. 0. 0. 0. 0. ]

[ 0.54030231 -0.45969769 0. 0. 0. ]

[-0.41614684 -0.95644914 -0.24837572 0. 0. ]

[-0.9899925 -0.57384566 0.19130174 0.14655916 0. ]

[-0.65364362 0.33634888 0.45509727 0.08793184 -0.01465683]]

P4(0.3)=0.980699

样例说明

输入:x*为0.3,5个节点为(k, cos(k)),其中k = 0, 1, 2, 3, 4。

输出:牛顿插值多项式系数向量,表示P4(x)=0.01466 x^4 + 0.2345 x^3 - 0.8493 x^2 + 0.1697 x + 1; 差商矩阵;当x*为0.3时,P4(0.3)值为0.980699

代码

# 牛顿插值多项式(插值法)
import numpy as np
import math


def Input():
    x_ = np.double(input())
    X = np.array(input().split(), dtype=np.double)
    Y = np.array([math.cos(col) for col in X], dtype=np.double)

    return x_, X, Y


def Newpoly(X, Y):
    n = len(X)
    D = np.zeros([n, n], dtype=np.double)
    D[:, 0] = Y

    for j in range(1, n):
        for k in range(j, n):
            D[k, j] = (D[k, j - 1] - D[k - 1, j - 1]) / (X[k] - X[k - j])
            
    C = D[n - 1, n - 1]

    for k in range(n - 2, -1, -1):
        C = np.convolve(C, np.poly([X[k]]))
        m = len(C) - 1
        C[m] = C[m] + D[k, k]

    return C, D


def output(x):
    print(x)


def main():
    x_, X, Y = Input()

    C, D = Newpoly(X, Y)
    
    ans = np.poly1d(C)

    output(C)
    output(D)
    output("P%d(%g)=%.6f" % (len(ans), x_, ans(x_)))


if __name__ == '__main__':
    main()

你可能感兴趣的:(python,算法,matlab)