一. 拉格朗日插值多项式(插值法)
【问题描述】考虑[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()