数学建模插值分析法(附完整代码)python实现(插值&拟合)

直白来说
插值:求过已知有限个数据点的近似函数。
拟合:已知有限个数据点,求近似函数,不要求过已知数据点,只要求在某种意义下它在这些点上的总偏差最小。
插值和拟合都是要根据一组数据构造一个函数作为近似,由于近似的要求不同,二者的数学方法上是完全不同的。而面对一个实际问题,究竟应该用插值还是拟合,有时容易确定,有时则并不明显。
在这里插入图片描述
插值函数的作用就是用于函数的拟合. 通常插值函数的应用就是通过函数表来构造一个足够简单, 并且能够反映函数 的特征的函数。
在这里插入图片描述
并且插值函数具有唯一性
在这里插入图片描述
这样表示的话矩阵为
在这里插入图片描述
在这里插入图片描述
理论大概就是这些吧,CSDN我不会在上面打公式,所以在word里打好直接截图了,做建模的时候可能要费点劲了,那么说句最直白的,插值分析分为两种方法,一种是内插法和外插法,最大的区别就是处理方法不同、职责不同、工作内容不同,
核心区别就是:内插法在样本数据的范围内预测,比外插法要准。用回归方程预测范围以外的数值称为外插法,而内插法是对数据范围内的点进行预测。
内插比外插要准的多。下面用内插法实现。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
plt.rcParams['font.sans-serif'] = ['simhei']
plt.rcParams['axes.unicode_minus'] = False
data=pd.read_excel(open('data.xlsx', 'rb'), sheet_name='Sheet1')
x= data['自变量']
y= data['因变量']
print('光滑因子默认为0.1 如需修改请查看源码')
print('默认内插法分析')
print('请输入要插值自变量的起始值:')
input1=input(int())
print('请输入要插值自变量的中止值:')
input2=input(int())
print('请输入要插入点的个数:')
input3=input(int())
print('请输入图表标题:')
input4=input(str())
print('请输入自变量名称:')
input5=input(str())
print('请输入因变量名称:')
input6=input(str())

xnew = np.linspace(int(input1),int(input2),int(input3))
fSpl1 = UnivariateSpline(x, y, s=0)
y1 = fSpl1(xnew)
fSpl2 = UnivariateSpline(x, y)
y2 = fSpl2(xnew)
fSpl2.set_smoothing_factor(0.1)
y3 = fSpl2(xnew)
print("拟合后最终结果为:%s"%y3)

fig, ax = plt.subplots(figsize=(8,6))
plt.plot(x, y,'s',markersize=15,
         markerfacecolor="black",label="真实值")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.plot(xnew, y3, 'b--', label="插值结果",ms=10)
plt.xlabel(str(input5),size=14)
plt.ylabel(str(input6),size =14)
ax.set_title(str(input4))
plt.legend(loc="best")
with open('插值结果.txt',"w+",encoding='utf-8') as fp:
    fp.write(str(y3))
plt.show()

代码释义fSpl2.set_smoothing_factor(0.1)意思是平滑因子为0.1 当然我认为平滑因子是0.1可以了不用过分追究。
使用时在根目录文件夹下放一个data.xlsx的文件如图所示
在这里插入图片描述
data.xlsx文件内设为两列 一列命名为自变量 另一列命名为因变量如图所示:
在这里插入图片描述
起始值随意 要看预测哪一路段,中止值同起始值。插入值50个点最好,下面就是设置图表格x轴y轴名字。
在这里插入图片描述
运行结果为:
在这里插入图片描述
上次没做好 仅拿了美赛H奖,唉 算是人生的一大遗憾。
请添加图片描述
GOOD LUCK for everybody
——from deyuLiang

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学成七步

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值