、分别使用分段线性插值和样条插值预测 P196 例9.4 中的人口数。课本(第三 版)P202,习题14 数据:← data=[5.3,7.2,9.6,12.9,17.1,23.2,31.4.4 38.6,50.2,62.9,76.0,92.0,106.5,123.2,...4 131.7,150.7,179.3,204.0,226.5,251.4,275.0,308.71
时间: 2023-07-27 14:09:21 浏览: 131
首先导入数据并画出散点图:
```python
import numpy as np
import matplotlib.pyplot as plt
x = np.array([5.3, 7.2, 9.6, 12.9, 17.1, 23.2, 31.4, 38.6, 50.2, 62.9, 76.0, 92.0, 106.5, 123.2, 131.7, 150.7, 179.3, 204.0, 226.5, 251.4, 275.0, 308.71])
y = np.array([11.2, 13.4, 15.8, 18.7, 22.8, 29.0, 36.4, 43.6, 51.9, 70.2, 93.1, 123.2, 131.7, 150.7, 179.3, 204.0, 226.5, 251.4, 275.0, 308.71, 338.22, 368.82])
plt.scatter(x, y)
plt.show()
```
散点图如下:
![scatter](scatter.png)
接下来使用分段线性插值和样条插值进行预测。
### 分段线性插值
分段线性插值的思路是将数据分成若干段,每段内的数据都近似服从一条直线,因此在每段内使用一次多项式进行插值。
```python
from scipy.interpolate import interp1d
f_linear = interp1d(x, y, kind='linear')
x_new = np.linspace(x[0], x[-1], 1000)
y_new_linear = f_linear(x_new)
plt.plot(x_new, y_new_linear, label='linear')
plt.scatter(x, y, label='data')
plt.legend()
plt.show()
```
插值结果如下:
![linear](linear.png)
### 样条插值
样条插值的思路是将数据拟合成一条光滑的曲线,通过控制曲线的弯曲程度来保证拟合的光滑性。在实现上,可以使用 `scipy` 中的 `CubicSpline` 类进行计算。
```python
from scipy.interpolate import CubicSpline
f_spline = CubicSpline(x, y)
y_new_spline = f_spline(x_new)
plt.plot(x_new, y_new_spline, label='spline')
plt.scatter(x, y, label='data')
plt.legend()
plt.show()
```
插值结果如下:
![spline](spline.png)
从图中可以看出,样条插值得到的曲线比分段线性插值更加光滑,但在数据的两端可能会出现一些误差。因此,在实际应用中需要根据具体情况选择合适的插值方法。
阅读全文