Mathematica进阶[9]-计算插值函数生成曲线的函数表达式

  • A+
所属分类:Wolfram语言进阶
摘要最近在处理数据的时候遇到了一个问题,比如在mathematica中使用函数ListInterpolation或者函数Interpolation都能得到一个插值的函数,对于返回的这个函数我们无法知道他具体的表达式但是却可以返回每个x的插值。但是有的时候我们写文章的时候需要计算出插值函数的具体表达式,那么这个时候就应该怎么办呢?下面我们来看一下解决办法。

 

问题来源

最近在处理数据的时候遇到了一个问题,比如在mathematica中使用函数ListInterpolation或者函数Interpolation都能得到一个插值的函数,对于返回的这个函数我们无法知道他具体的表达式但是却可以返回每个x的插值。但是有的时候我们写文章的时候需要计算出插值函数的具体表达式,那么这个时候就应该怎么办呢?下面我们来看一下解决办法。(在这里我给出了一种近似的方法,得到的函数画出的图像并不能和Interpolation得到的图像完全重合)

下面这张图片可以看到返回的东西你并不能看到其具体的表达式。

插值函数

 

解决办法

解决办法就是使用函数,InterpolatingPolynomial。使用这个函数的时候只需要划分好区间就可以了。我们接着看上面的例子。

首先生成一些点

points = Transpose[{Range[6], {1, 2, 3, 5, 8, 5}}]

接着将这些点划分后逐个进行InterpolatingPolynomial,然后生成一个分段函数,就是最后我们要得到的函数表达式。

pf[x_] = Piecewise[{
{InterpolatingPolynomial[Take[points, {1, 4}], x], x < 3},
{InterpolatingPolynomial[Take[points, {2, 5}], x], 3 <= x < 4},
{InterpolatingPolynomial[Take[points, {3, 6}], x], x >= 4}
}]

如下图所示,绿色虚线部分是使用上面代码生成的分段函数的图像,可以看到除了最后有一些区别外,其余地方都是很接近的。

插值多项式的使用

关于区间的划分

到这里还是没有结束的,我们还要说一下上面的区间是怎么划分的,也是说为什么提取第1到4个点,x的范围是x<3。下面我用一张图片帮助大家理解一下。

区间分割

 

由于要保证曲线的光滑,所以我们每次取的时候间隔都是4,即如图上所画1-4,2-5,3-6,这个也是我们上面取点的范围,并且写x的范围的时候,只能取到提取的点的倒数第二个,比如去了点1-4,但是取x的范围的时候只能取到1-3,接下来在从3-(5-1),4-6,大家可以自己结合图片来理解一下。

再看例子

接下来我们看一个之前在Mathematica入门习题里的例子,链接如下Mathematica入门习题[18]–插值。当时我们只使用三次样条插值得到了每个点处的近似温度,但是没有得到具体的插值得到的函数的表达式,下面我们就来计算一下插值函数的表达式。

我们直接来看代码

time = Table[i, {i, 6, 18, 2}];
tempIn = {18, 20, 22, 25, 30, 28, 24};
points = Transpose[{time, tempIn}];
pf[x_] = Piecewise[{
{InterpolatingPolynomial[Take[points, {1, 4}], x], 6 <= x < 10},
{InterpolatingPolynomial[Take[points, {2, 5}], x], 10 <= x < 12},
{InterpolatingPolynomial[Take[points, {3, 6}], x], 12 <= x < 14},
{InterpolatingPolynomial[Take[points, {4, 7}], x], 14 <= x < 18}
}]

分段函数

这里可以得到分段函数的表达式,那么我们把自己求出的分段函数和使用Interpolation求出的函数画出的图像来进行一下比较

fIn = Interpolation[Transpose[{time, tempIn}], Method -> "Spline"];
Show[
Plot[fIn[x], {x, 6, 18.5}, ImageSize -> Large],
Plot[pf[x], {x, 6, 18}, PlotStyle -> {Green, Dashed}],
ListPlot[points, PlotStyle -> Hue[.1]]

分段函数与插值函数的比较

从图中我们可以看出两者的区别不是很大,我们可以把这歌分段函数作为插值得到的近似的函数。

 

 

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: