文章目录
题目1: 插值(综合)
美国的人口普查每10年举行一次,下表列出了从1960年到2020年的人口.(按千人计)。
年 | 1960 | 1970 | 1980 | 1990 | 2000 | 2010 | 2020 |
---|---|---|---|---|---|---|---|
人口(千) | 180671 | 205052 | 227225 | 249623 | 282162 | 309327 | 329484 |
(1)用适当Lagrange插值法分别求在1950年、2005年和2030年人口的近似值。
(2)1950年的人口大约是151326(千人),你认为你得到的2005年和2030年的人口数字精确度如何?
(3)用适当Newton插值法重做(1)和(2)。
(4)使用适当自由三次样条插值法重做(1)和(2)。
Lagrange插值法:
公式:
代码(python):
import matplotlib.pyplot as plt
import numpy as np
x_point = np.arange(1960,2030,10)
y_point = [180671, 205052, 227225, 249623, 282162, 309327, 329484]
x_choice = [1960, 1980, 2000, 2020]
y_choice = [180671, 227225, 282162, 329484]
x = np.arange(1950, 2030+0.01, 0.01)
def lagrange(xk,yk,x):
n = len(xk)
lk = []
y = 0
for k in range(n):
fenzi = 1
fenmu = 1
for j in range(n):
if j != k:
fenzi *= (x - xk[j])
fenmu *= (xk[k] - xk[j])
lk.append(fenzi/fenmu)
for i in range(n):
y += lk[i] * yk[i]
return y
y = lagrange(x_choice,y_choice,x)
plt.plot(x,y,label="拉格朗日拟合曲线",color="black")
plt.scatter(x_point, y_point, label="未选点"