插值法

一. 拉格朗日插值多项式(插值法)

【问题描述】考虑[0.0,1.2]内的函数y=f(x)=cos(x)。利用多个(2,3,4等)节点构造拉格朗日插值多项式。

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

【输出形式】输出插值多项式系数矩阵,拉格朗日系数多项式矩阵和P(x*)值(保留小数点后6位有效数字)。

【样例1输入】

0.3

0 0.6 1.2

【样例1输出】

[-0.40043538 -0.05084608 1. ]

[[ 1.38888889 -2.5 1. ]

[-2.77777778 3.33333333 -0. ]

[ 1.38888889 -0.83333333 0. ]]

P2(0.3)=0.948707

【样例1说明】输入:x*为0.3,3个节点的x坐标分别为x0=0,x1=0.6和x2=1.2。

输出:插值多项式系数矩阵,则P2(x)表示为-0.40043538x2-0.05084608x+1;拉格朗日系数多项式矩阵,则P2(x)表示为:y0*(1.38888889x2-2.5x+1)+y1*(-2.77777778x2+3.33333333x-0)+y2*(1.38888889x2-0.83333333x+0);当x*为0.3时,P2(0.3)值为0.948707。

【评分标准】根据输入得到的输出准确

import numpy as np
import math
def f(xx):
    yy=math.cos(xx)
    return yy
#格拉朗日插值法
def lagrange(xx,n,x,y):
    p = 0.0
    # l是格拉朗日系数多项式矩阵
    l = np.zeros([n, n], dtype=np.double)
    for k in range(n):
        v= 1
        for j in range(n):
            if j == k:
                continue
            # v是一个累乘计算
            else:
                v=np.polymul(v,np.poly1d([x[j]],True))/(x[k]-x[j])
        l[k,:] = v
    # 插值多项式系数矩阵
    c = y@l
    #reshape(1,-1)转化成1行:reshape(2,-1)转换成两行: reshape(-1,1)转换成1列:reshape(-1,2)转化成两列
    print(c)
    #print(c.reshape(1,-1))
    print(l)
    # xx代入插值多项式
    yy = np.polyval(c,xx)
    w=n-1
    print("P%d(%.1f)=%.6f"%(w,xx,yy))
def main():
    #所求点x
    xx = float(input())
    # 自定义输入X
    x=np.array( list( map( float, input().split() )) )
    n= len(x)
    #由X和f()所求Y
    y = np.cos(x)
    lagrange(xx,n, x, y)
if __name__ == '__main__':
    main()

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

【问题描述】考虑[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

【样例1输出】

[-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

【样例1说明】输入: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
def lagrange(xx,n,x,y):
    # d为差商矩阵
    d = np.zeros((n, n), dtype=np.double)
    # 第一列,零阶差商
    d[:, 0] = y
    # 一列一列的算,j为列号,也为j阶差商
    for j in range(1, n):
        #k为行号,也为当前x的最大序列
        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.polymul(c, np.poly1d([x[k]], True)) + d[k, k]
    yy = np.polyval(c, xx)
    # 取系数放入牛顿插值多项式系数矩阵
    cc = np.zeros((1, n), dtype=np.double)
    cc[0, :] = c
    print(cc)
    print(d)
    print("P%d(%.1f)=%.6f" % (n-1, xx, yy))
def main():
    xx =float(input())
    x = np.array(input().split() , dtype=np.double)
    y = np.cos(x)
    n = len(x)
    lagrange(xx, n, x, y)
if __name__ == '__main__':
    main()


你可能感兴趣的:(python)