Hermite(埃尔米特)插值法

Hermite(埃尔米特)插值法

Hermite插值法是解决数学建模中预测类问题的最常用的方法,可以有效的解决“已知数据”数量不够的问题。

但是,直接使用Hermite插值得到的多项式次数较高,也存在着“龙格现象(Runge phenomenon)”。因此,在实际应用中,往往使用分段三次Hermite插值多项式(PCHIP),来提高“模拟数据的准确性”。

这里要说明一下“龙格现象(Runge phenomenon)”,

龙格现象(Runge phenomenon)

简单的解释为:插值多项式的震荡,即在两段处波动极大,产生明显的震荡。

Hermite插值法的含义

保持插值曲线在节点处有切线(光滑),使得插值函数和被插值函数的密合程度更好。
不但要求在节点处上的函数值相等,而且还要求对应的导数值也相等,甚至要求高阶导数也相等,满足这种要求的插值多项式就是“Hermite插值多项式”。

Hermite插值原理

在这里插入图片描述

Hermite插值法的代码实现

Matlab中的pchip函数

在Matlab中,内置有Hermite插值多项式(PCHIP)函数

格式:“p=pchip(x,y,new_x)”

其中:x是已知的样本点的横坐标,y是已知的样本点的纵坐标,new_x是要插入处的横坐标。

因此,new_x可以是一个区间。

Matlab中的代码实现:

%插值算法 (常用) 

%Hermite(埃尔米特)插值法

a=0;
a=input('请输入数据矩阵的行数:');

b=0;
b=input('请输入数据矩阵的列数:');

%初始化目标矩阵
c=zeros(a,b);
c=input('请依次输入数据矩阵:');
disp('数据矩阵:');
disp(c);

%确定插值区间
d=0;
d=input('请输入插值区间:');


%进行插值
e(1,:)=d;

[n,m]=size(c);

for i=2:n
    e(i,:)=pchip(c(1,:),c(i,:),d);
end

%目标矩阵
disp('Hermite插值后的矩阵:');
disp(e);

Hermite插值法的例题应用

题目“第六届mathorcup大学生数学建模挑战赛A题目”中的数据:
数据
可以看出,题目中的数据只给出了“奇数周”,缺少“偶数周”的实验数据,因此需要进行“完善数据”。

Matlab代码实现:

%第一种方法:Hermite(埃尔米特)插值法

%确定数据矩阵的大小
A=[1:15];
B(1,:)=A;

for i=2:12
    B(i,:)=pchip(h(1,:),h(i,:),B(1,:));
end

ylab={'周数','轮虫','溶氧','COD','水温','PH值','盐度','透明度','总碱度','氯离子','透明度','生物量'}; 

 for j=2:12
     subplot(3,4,j-1), 
     plot(B(1,:),B(j,:),'r');   
     hold on;
     plot(h(1,:),h(j,:),'o');
     axis([0 15,-inf,inf])
     title(ylab{j-1})
 end
 
 legend('三次埃尔米特插值数据','原始数据','Location','SouthEast')

代码结果:

运行结果

### 回答1: Hermite插值法是数值分析中一种经典的插值方法,旨在通过已有的数据点来构建一个多项式模型,以预测其他未知点的数值。相比于其他插值方法,Hermite插值法更加高效和精确,可以在较少的数据点条件下实现高精度的插值。 在Python中,可以使用SciPy库中的interp1d函数来实现Hermite插值。该函数提供了一种简单的方式来构建多项式函数,并对新的数据点进行预测。具体步骤如下: 1. 导入SciPy库。使用以下代码将SciPy库导入你的Python程序中: ```python import scipy.interpolate as interp ``` 2. 定义已有的数据点。假设有N个已知的数据点,将它们按照x轴升序排列,存储为两个数组x和y(长度均为N)。 3. 构建Hermite插值函数。使用以下代码构建Hermite插值函数h: ```python h = interp.interp1d(x, y, kind='cubic') ``` 其中,kind参数表示使用的插值方法,cubic表示采用三次Hermite插值方法。也可以使用其他插值方法,如linear表示线性插值方法。 4. 在新的数据点上进行预测。使用以下代码,对新的数据点x_new进行预测: ```python y_new = h(x_new) ``` 其中,y_new为预测得到的新数据点的y值。 总之,Hermite插值法是数值分析中一种重要的插值方法。在Python中,可以使用SciPy库的interp1d函数进行实现,并且可以轻松预测新的数据点。 ### 回答2: Hermite插值法是一种用于曲线和表面拟合的方法,它通过利用数据点和其导数来进行插值。在数值分析中,Hermite插值法是通过对已知函数的某些导数和函数值进行插值,来得到一个多项式函数,以近似表示这个函数。 在Python中,可以使用SciPy的插值函数来实现Hermite插值法。具体实现过程如下: 1.导入相关模块 ``` from scipy.interpolate import Hermite import numpy as np ``` 2.定义数据点和导数 ``` x = np.array([1, 2, 3, 4, 5]) y = np.array([1, 3, 8, 10, 12]) dydx = np.array([0, 2, 6, 4, 2]) ``` 其中,x和y为已知数据点,dydx为已知导数。 3.进行插值 ``` hermite = Hermite(x, y, dydx) ``` 4.绘制插值曲线 ``` import matplotlib.pyplot as plt plt.plot(x, y, 'o', label='Data') xn = np.linspace(x.min(), x.max(), 100) plt.plot(xn, hermite(xn), label='Hermite') plt.legend(loc='best') plt.show() ``` 运行后即可得到插值曲线。 总的来说,Hermite插值法是一种重要的数值分析方法,可以在数据点和其导数不充分的情况下,通过插值得到一个近似的数据曲线。在Python中,利用SciPy的插值函数可以轻松实现Hermite插值法。 ### 回答3: Hermite插值法是一种高阶插值方法,通过已知的数据点来构造一个多项式来近似曲线。它可以高效地在给出的数据点处进行插值,并且可以处理一些曲线在某些点上的一阶和二阶导数值不确定的情况。 在Python中,可以使用scipy库中的hermite插值函数来进行计算。该函数名为scipy.interpolate.hermite_interp1d。接受的参数包括已知的数据点、相应的一阶导数和二阶导数值。我们可以使用这个函数来计算曲线在给定点的插值值。 具体操作如下: 首先,引入必要的库和数据: ```python import numpy as np from scipy.interpolate import hermite_interp1d # 构造数据点 x = np.linspace(-1,1,9) y = np.cos(x*np.pi) ``` 接下来,计算数据点处的一阶导数和二阶导数。可以使用numpy库中的diff函数来计算一阶导数,使用scipy库中的ndimage函数来计算二阶导数。 ```python # 计算一阶导数 dydx = np.diff(y)/np.diff(x) # 计算二阶导数 from scipy import ndimage dy2dx2 = ndimage.sobel(dydx, axis=0, mode='constant') ``` 使用hermite_interp1d函数来进行插值: ```python f = hermite_interp1d(x,y,dydx,dy2dx2) # 计算插值值 x_new = np.linspace(-1,1,101) y_new = f(x_new) ``` 最后,我们可以使用matplotlib库来绘制原始数据点和计算出的插值曲线。 完整代码如下: ```python import numpy as np from scipy.interpolate import hermite_interp1d import matplotlib.pyplot as plt # 构造数据点 x = np.linspace(-1,1,9) y = np.cos(x*np.pi) # 计算一阶导数 dydx = np.diff(y)/np.diff(x) # 计算二阶导数 from scipy import ndimage dy2dx2 = ndimage.sobel(dydx, axis=0, mode='constant') # 插值 f = hermite_interp1d(x,y,dydx,dy2dx2) # 计算插值值 x_new = np.linspace(-1,1,101) y_new = f(x_new) # 绘制原始数据和插值曲线 plt.plot(x,y,'o',label='data') plt.plot(x_new,y_new,label='hermite interp') plt.legend(loc='best') plt.show() ``` 注意到hermite_interp1d函数要求一阶和二阶导数值在端点处是已知的。因此,当数据点不够多时,需使用其他技术进行外推,来计算边界点的导数值。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Rayme629

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

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

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

打赏作者

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

抵扣说明:

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

余额充值