《数学建模简明教程--基于python》学习笔记-第三章-插值与拟合-课后习题解答

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

先纵览一下插值与拟合的题目
在这里插入图片描述

在这里插入图片描述

准备工作

导入绘图的库以及插值和拟合的函数。

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),0x2π

# 已知数据点
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=(1x2)1/2,1x1

# 已知点
x = np.append(np.random.random(5)*2-1<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值