from scipy.interpolate import lagrange1 C6 \8 r) \! o( _* E
0 f: n" Q3 Z6 v( a( h
import matplotlib.pyplot as plt
复制代码
1.numpy: 一个强大的数学库,用于处理数组和矩阵等高级数学运算。7 d; }" x: n/ w6 F, c
2.scipy.interpolate.lagrange: 从 SciPy 库中导入的,用于执行拉格朗日多项式插值的函数。 F9 N- p, [/ t8 N' }( d
3.matplotlib.pyplot: 用于数据可视化的库,可以绘制图表和图形。- C& W5 w6 J: ]0 Y' B, U
( y" x6 e6 J1 W% f4 ]) i( j2. 源数据
x = np.array([4, 5, 6])( s/ p* w( ]& N- F
. n0 Q. D+ y& c1 b+ Y
y = np.array([10, 5.25, 1])
复制代码
这里定义了两个数组 x 和 y,代表了三个数据点的坐标:(4, 10), (5, 5.25), 和 (6, 1)。这些数据点将用于拉格朗日插值。& c5 A9 n+ M# H
3. 拉格朗日插值
poly = lagrange(x, y)+ T: `! V0 g4 E" T
# {6 A" x8 Y! h- D2 S6 c! p2 a" d o( O
res = poly(18)
复制代码
4.使用 lagrange(x, y) 创建一个拉格朗日插值多项式 poly。这个多项式是基于给定的数据点 x 和 y 计算出来的,它能够逼近这些点构成的曲线。 ! y/ L" {" E( I( }: R' r3 g5.poly(18) 计算了在 x = 18 时的插值结果 res。这是通过将 x = 18 代入到拉格朗日多项式中得到的。 M; c3 ^* q: n8 I5 e : L8 t4 a5 {; I. F4. 打印多项式和插值结果
print('poly =\n', poly) # C5 `0 q4 S& X/ C9 \
1 }8 \3 B2 g4 D* P/ c7 ~
print('res =', res)
复制代码
这里打印了插值多项式 poly 和在 x = 18 处的插值结果 res。( [& d$ F+ Y, n5 q
5. 数据可视化
x1 = [i for i in range(-5, 20)] 8 m b% ~: f) }+ W
& @# u1 o, T/ r! h! J9 B4 E
y1 = []# Q8 ^0 `$ }" M: n; R9 N. A9 v
; }; I0 l7 O! m. I0 p
for each in x1: ' ^0 B1 c+ u/ X: i& P+ C
: D5 `8 C6 B' v. }9 l2 G" Y* N
y1.append(poly(each)): K2 B1 V' f) B2 H
2 F4 R6 g0 c" i& I% p: W
2 z) ? I {+ g' a: x, n
8 U* X* J7 S/ ]+ c7 w
plt.plot(x1, y1)8 c! s! T. o$ q- R% k
$ q3 @1 l8 p1 }8 W
plt.scatter(x, y) ) G# \* `9 R4 K
" t0 T" j8 i) V2 \& v
plt.scatter(18, res)
复制代码
6.首先,创建了一个 x 值列表 x1,范围是从 -5 到 19。然后,对于 x1 中的每个 x 值,都计算对应的拉格朗日插值多项式的 y 值,并将这些 y 值存储在列表 y1 中。! I. a8 n! k8 ?( L
7.使用 plt.plot(x1, y1) 绘制插值多项式形成的曲线。 ( ~8 \8 T2 c9 L2 a8.使用 plt.scatter(x, y) 在图上标记原始数据点。$ F1 Z4 v* L# m) K. W' M; X% u
9.使用 plt.scatter(18, res) 在图上标记 x = 18 处的插值结果点。% p6 S. q- o( m( C+ C