文章目录
- 准备工作
- 1 分析插值与拟合的联系与区别
- 2 给出函数的n个节点,然后插值
-
- 2.1 y = s i n ( x ) , 0 ⩽ x ⩽ 2 π y=sin(x),0\leqslant x\leqslant 2\pi y=sin(x),0⩽x⩽2π
- 2.2 y = ( 1 − x 2 ) 1 / 2 , − 1 ⩽ x ⩽ 1 y=(1-x^2)^{1/2},-1\leqslant x\leqslant1 y=(1−x2)1/2,−1⩽x⩽1
- 2.3 y = cos 10 x , − 4 ⩽ x ⩽ 4 y= \cos^{10}x,-4\leqslant x\leqslant4 y=cos10x,−4⩽x⩽4
- 2.4 y = e − x 2 , − 2 ⩽ x ⩽ 2 y=e^{-x^2},-2\leqslant x\leqslant2 y=e−x2,−2⩽x⩽2
- 3 已知四个数据点,然后插值求f(4)
- 4 非线性拟合求初始电压v0和充电常数 τ \tau τ
- 5 三次多项式拟合
- 6 非线性最小二乘法拟合
- 学习困惑
先纵览一下插值与拟合的题目


准备工作
导入绘图的库以及插值和拟合的函数。
import numpy as np
import matplotlib.pyplot as plt
# 插值
from scipy.interpolate import lagrange # 拉格朗日插值
from scipy.interpolate import interp1d # 一维插值:对一个自变量的函数进行插值
# 线性拟合 可以使用np.polyfit进行多项式拟合 (当然线性拟合不是只能是多项式只要参数线性,就可以用线性最小二乘拟合)
# 非线性拟合 使用curve_fit
from scipy.optimize import curve_fit
# 初始化设置
plt.rc('font', family='SimHei') # 显示中文字体
plt.rc('axes',unicode_minus=False) # 显示符号
np.set_printoptions(precision=3, suppress=True) # 设置小数位数为3,并关闭print时的科学计数法
np.random.seed(2022) # 设置随机数种子
1 分析插值与拟合的联系与区别
题1:

-
插值:给定一系列不连续的样本点,然后你需要根据这些点给出一种方法,它可以返回未知的更高密度的点,并且保留原来所有的点的位置不变(用你的插值方法)
-
拟合:用一种方法,它可以以最大解释程度来解释你所给出的点,可以是根据各种机理模型给出,也要有判断拟合好坏的标准,一般就是距离。
-
联系:都是要根据已知数据给出近似函数(插值函数和拟合函数)
-
区别:插值需要经过所有数据点,如用于地貌绘测等,本身在每个插值节点的数值往往是实实在在确定的、存在的,才会想到要一个经过所有数据点的函数,当然也会有观测误差存在。拟合则是按照一定的标准,再用某种方法来求得拟合效果最好的函数,所谓“拟合最好的函数”取决于拟合的标准,拟合较插值更有利于反映对象整体的变化趋势。
2 给出函数的n个节点,然后插值
- 使用拉格朗日,分段线性和三次样条三种插值方法
题2:

2.1 y = s i n ( x ) , 0 ⩽ x ⩽ 2 π y=sin(x),0\leqslant x\leqslant 2\pi y=sin(x),0⩽x⩽2π
# 已知数据点
x = np.append(np.random.random(7)*(np.pi*2),[0,np.pi*2]) # 我采用简单随机采样 但是添加了首位两个点 可以避免后续的一些插值范围问题
# 9个数据点都在[0,np.pi*2]上
# x = np.arange(0,np.pi*2+0.0001,np.pi/4) # 等距采样 9个数据点
y = np.sin(x)
# 被插值点
x_ = np.arange(0,np.pi*2+0.0001,np.pi/20)
plt.figure(figsize=(14,4))
# 绘制拉格朗日8次插值,线性插值,三次样条插值,原始曲线sin(x),以及采样点
y1 = lagrange(x, y) # 插值8次多项式 返回的是每一个项数前的系数(从高到低)
plt.plot(x_, np.polyval(y1, x_), '--*b', label=f'拉格朗日{
len(x)-1}次插值')
f2 = interp1d(x, y); y2 = f2(x_)
plt.plot(x_, y2, '-.', label='线性插值')
f3 = interp1d(x, y, 'cubic'); y3 = f3(x_)
plt.plot(x_, y3, '-p', label='三次样条插值')
plt.plot(x_, np.sin(x_), 'r', label='原始曲线')
plt.scatter(x,y,c='k',s=100, label='数据点')
# 装饰性函数
plt.axis('equal')
plt.grid(axis='y')
plt.yticks(np.linspace(-1,1,5))
plt.xticks(np.linspace(0,np.pi*2,9))
plt.title('三种插值方法比较图')
plt.legend()
plt.show()
# 观察到:当取样点距离一样时,三次和拉格会重叠
# 在这个函数上 拉格朗日还算稳定的

- 增加插值节点
- 可以发现拉格朗日和三次样条的拟合曲线越来越接近
- 三种方法的拟合效果也越来越好
- 在插值节点较少时,拉格朗日插值会出现龙格现象
- 在插值节点数为9时,发现拉格朗日插值效果比三次样条插值更好,在一些有的两个点之间,三次样条的拟合曲线会更凸出去,但拉格朗日拟合的曲线却能较好逼近sin函数
2.2 y = ( 1 − x 2 ) 1 / 2 , − 1 ⩽ x ⩽ 1 y=(1-x^2)^{1/2},-1\leqslant x\leqslant1 y=(1−x2)1/2,−1⩽x⩽1
# 已知点
x = np.append(np.random.random(5)*2-1<

本文深入探讨了插值与拟合的区别与联系,通过拉格朗日插值、线性插值和三次样条插值在不同函数上的应用,展示了它们的性能。此外,还介绍了非线性拟合在实际问题中的应用,如求初始电压和充电常数,并展示了如何使用非线性最小二乘法进行拟合。
最低0.47元/天 解锁文章
3452

被折叠的 条评论
为什么被折叠?



