Python实现线性插值和三次样条插值


关于Python数据分析在数学建模中的更多相关应用:Python数据分析在数学建模中的应用汇总(持续更新中!)

(1)、函数

y = sin(x)

(2)、数据准备

#数据准备
X=np.arange(-np.pi,np.pi,1) #定义样本点X,从-pi到pi每次间隔1
Y= np.sin(X)#定义样本点Y,形成sin函数
new_x=np.arange(-np.pi,np.pi,0.1) #定义差值点

(3)、样条插值

#进行样条差值
import scipy.interpolate as spi
 
#进行一阶样条插值
ipo1=spi.splrep(X,Y,k=1) #样本点导入,生成参数
iy1=spi.splev(new_x,ipo1) #根据观测点和样条参数,生成插值
 
#进行三次样条拟合
ipo3=spi.splrep(X,Y,k=3) #样本点导入,生成参数
iy3=spi.splev(new_x,ipo3) #根据观测点和样条参数,生成插值

(4)、绘图

##作图
fig,(ax1,ax2)=plt.subplots(2,1,figsize=(10,12))

ax1.plot(X,Y,'o',label='样本点')
ax1.plot(new_x,iy1,label='插值点')
ax1.set_ylim(Y.min()-1,Y.max()+1)
ax1.set_ylabel('指数')
ax1.set_title('线性插值')
ax1.legend()

ax2.plot(X,Y,'o',label='样本点')
ax2.plot(new_x,iy3,label='插值点')
ax2.set_ylim(Y.min()-1,Y.max()+1)
ax2.set_ylabel('指数')
ax2.set_title('三次样条插值')
ax2.legend()

(5)、综合代码

import numpy as np
import matplotlib.pyplot as plt
 
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
  
#数据准备
X=np.arange(-np.pi,np.pi,1) #定义样本点X,从-pi到pi每次间隔1
Y= np.sin(X)#定义样本点Y,形成sin函数
new_x=np.arange(-np.pi,np.pi,0.1) #定义差值点
 
#进行样条差值
import scipy.interpolate as spi
 
#进行一阶样条插值
ipo1=spi.splrep(X,Y,k=1) #样本点导入,生成参数
iy1=spi.splev(new_x,ipo1) #根据观测点和样条参数,生成插值
 
#进行三次样条拟合
ipo3=spi.splrep(X,Y,k=3) #样本点导入,生成参数
iy3=spi.splev(new_x,ipo3) #根据观测点和样条参数,生成插值

 
 
##作图
fig,(ax1,ax2)=plt.subplots(2,1,figsize=(10,12))

ax1.plot(X,Y,'o',label='样本点')
ax1.plot(new_x,iy1,label='插值点')
ax1.set_ylim(Y.min()-1,Y.max()+1)
ax1.set_ylabel('指数')
ax1.set_title('线性插值')
ax1.legend()

ax2.plot(X,Y,'o',label='样本点')
ax2.plot(new_x,iy3,label='插值点')
ax2.set_ylim(Y.min()-1,Y.max()+1)
ax2.set_ylabel('指数')
ax2.set_title('三次样条插值')
ax2.legend()
 
 

(6)、结果展示

在这里插入图片描述
在这里插入图片描述

为了使用线性插值三次样条插值得到特定温度下的过热蒸汽体积,我们首先需要对给定的数据点进行处理。线性插值是一种简单的近似方法,它假设数据之间的变化是线性的;而三次样条插值则更复杂,能捕捉到数据局部的曲率变化。 **线性插值代码示例(Python)**: ```python import numpy as np # 数据 temperatures = np.array([700, 720, 740, 760, 780]) volumes = np.array([0.0977, 0.1218, 0.1406, 0.1551, 0.1664]) # 线性插值 def linear_interpolation(x): idx = np.searchsorted(temperatures, x) if idx == 0 or idx == len(temperatures): return volumes[idx - 1] else: slope = (volumes[idx] - volumes[idx - 1]) / (temperatures[idx] - temperatures[idx - 1]) return volumes[idx - 1] + slope * (x - temperatures[idx - 1]) # 计算并打印结果 volume_750_linear = linear_interpolation(750) volume_770_linear = linear_interpolation(770) print(f"线性插值下,T=750的体积变化大约为 {volume_750_linear}") print(f"线性插值下,T=770的体积变化大约为 {volume_770_linear}") # 可以通过matplotlib绘制线性插值图 import matplotlib.pyplot as plt plt.scatter(temperatures, volumes) x = np.linspace(min(temperatures), max(temperatures)) y_line = [linear_interpolation(temp) for temp in x] plt.plot(x, y_line, label='线性插值') ``` **三次样条插值代码示例(Python,使用SciPy库)**: ```python from scipy.interpolate import CubicSpline # 创建样条插值器 spline = CubicSpline(temperatures, volumes) # 计算并打印结果 volume_750_cubic = spline(750) volume_770_cubic = spline(770) print(f"三次样条插值下,T=750的体积变化大约为 {volume_750_cubic}") print(f"三次样条插值下,T=770的体积变化大约为 {volume_770_cubic}") # 绘制三次样条插值图 x_grid = np.linspace(min(temperatures), max(temperatures)) plt.scatter(temperatures, volumes) plt.plot(x_grid, spline(x_grid), label='三次样条插值') plt.legend() plt.show() ``` 注意:以上代码示例仅用于演示目的,实际应用中可能需要根据具体环境调整导入模块数据格式。同时,真实环境中可能会有数值计算误差,实际结果需根据具体插值算法得到。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值