近似函数和插值

在各种数值计算中,引入近似函数是很方便的. 近似函数可以看作近似实数的推广. 近似实数给出单个数值量的某种精度的值. 而近似函数给出单参数或多参数的量的某种精度的值. 例如,Wolfram 语言使用近似函数表示由 NDSolve 获得的微分方程的数值解,如 "微分方程的数值解" 中所述.

Wolfram 语言中的近似函数用 InterpolatingFunction 对象表示. 这些对象如同 "纯函数" 讨论的纯函数一样运行. 基本思想是当给定自变量的值时,该 InterpolatingFunction 对象求对应的近似函数值.

InterpolatingFunction 对象包含以插值为基础的近似函数表示. 它可以包含一系列点处的函数和导数值. 它假定函数在这些点之间是光滑的. 因此,在求特定自变量点处的函数时,InterpolatingFunction 对象用插值法求近似函数.

Interpolation[{f1,f2,}]构造一个近似函数使得在连续整数点处取值
Interpolation[{{x1,f1},{x2,f2},}]
构造一个近似函数使得在点 处取值

构造近似函数.

这里是sine函数的值表.
In[1]:=
Click for copyable input
Out[1]=
这里构造表示上述值的近似函数.
In[2]:=
Click for copyable input
Out[2]=
该近似函数生成原数据表中的每个值.
In[3]:=
Click for copyable input
Out[3]=
也能得到其它点处的近似值.
In[4]:=
Click for copyable input
Out[4]=
此情形插值是sine函数的相当好的近似.
In[5]:=
Click for copyable input
Out[5]=

可以像使用 Wolfram 语言中的其它函数一样使用近似函数. 可以画近似函数的图形,进行积分或求根等数值运算.

如果给出非数值的自变量,近似函数给出符号形式的结果.
In[6]:=
Click for copyable input
Out[6]=
这里是近似函数的数值积分.
In[7]:=
Click for copyable input
Out[7]=
这里是真实sine函数的数值积分.
In[8]:=
Click for copyable input
Out[8]=
近似函数的图形与真实sine函数的图形基本上是一样的.
In[9]:=
Click for copyable input
Out[9]=

如果对近似函数求导,Wolfram 语言将返回表示导数的另一个近似函数.

这里求近似函数的导数,并求导数在 处的值.
In[10]:=
Click for copyable input
Out[10]=
该结果与导数值很接近.
In[11]:=
Click for copyable input
Out[11]=

InterpolatingFunction 对象包含 Wolfram 语言所需的近似函数的所有信息. 然而在标准 Wolfram 语言输出格式中,仅明显给出 InterpolatingFunction 对象的定义域. 该 InterpolatingFunction 对象中实际的参数列表只用一对括号表示.

在标准输出格式中,仅明显给出 InterpolatingFunction 对象的定义域.
In[12]:=
Click for copyable input
Out[12]=
如果求定义域外的值,Wolfram 语言给出一个警告,然后使用外插值求出结果.
In[13]:=
Click for copyable input
Out[13]=

给出的函数信息越多,Wolfram 语言构造的近似函数就越好. 例如,在一个点的序列上,不仅给出函数值,也给出导数值.

Interpolation[{{{x1},f1,df1,ddf1,},}]
构造在点 处有指定导数的近似函数

构造具有指定导数的近似函数.

这里对一个sine函数以及一阶导数使用线性插值.
In[14]:=
Click for copyable input
Out[14]=
这里对导数寻找比前面使用的插值更好的近似.
In[15]:=
Click for copyable input
Out[15]=

Interpolation 给出指定点的插值多项式曲线. 使用选项 InterpolationOrder 可以指定多项式的次数. 缺省值是 InterpolationOrder->3,产生三次曲线.

这里产生一个Cosine函数的值表.
In[16]:=
Click for copyable input
对表中的值使用线性插值建立近似函数.
In[17]:=
Click for copyable input
Out[17]=
近似函数由直线段组成.
In[18]:=
Click for copyable input
Out[18]=
在缺省设置 InterpolationOrder->3 下,使用三次曲线,函数看起来很光滑.
In[19]:=
Click for copyable input
Out[19]=

提高 InterpolationOrder 对插值多项式的次数的设置可以使近似函数更光滑. 但是如果次数太高,可能产生摆动.

ListInterpolation[{{f11,f12,},{f21,},}]
用二维整数点网格处的值构造近似函数
ListInterpolation[list,{{xmin,xmax},{ymin,ymax}}]
假定列表值来自于指定定义域上的均匀空间网格处
ListInterpolation[list,{{x1,x2,},{y1,y2,}}]
假定列表值来自于指定网格线上的网格处

多维数据组的插值.

这里对整数网格点上的数值数组进行插值.
In[20]:=
Click for copyable input
Out[20]=
这是其在特定点处的值.
In[21]:=
Click for copyable input
Out[21]=
这是另一个数值数组.
In[22]:=
Click for copyable input
要对该数组进行插值,必须明显告诉 Wolfram 语言它的定义域.
In[23]:=
Click for copyable input
Out[23]=

ListInterpolation 对任意维数的数组都有效. 在各种情形下,它生成一个具有适当的自变量个数的InterpolatingFunction 对象.

这里对三维数组进行插值.
In[24]:=
Click for copyable input
产生的 InterpolatingFunction 对象具有三个自变量.
In[25]:=
Click for copyable input
Out[25]=

Wolfram 语言不仅能处理纯数值近似函数,也能处理包含符号参数的近似函数.

这里生成一个依赖于参数 InterpolatingFunction.
In[26]:=
Click for copyable input
Out[26]=
这里显示了在2.2处插值值如何依赖于参数.
In[27]:=
Click for copyable input
Out[27]=
InterpolationOrder 的缺省值下,在该点处的值不再依赖于 .
In[28]:=
Click for copyable input
Out[28]=

使用近似函数,经常得出 InterpolatingFunction 对象的复杂组合. 可以告诉 Wolfram 语言通过使用FunctionInterpolation 可以生成特定定义域上有效的单个 InterpolatingFunction 对象.

这里生成一个在0到1中有效的新的 InterpolatingFunction 对象.
In[29]:=
Click for copyable input
Out[29]=
这是生产一个嵌套 InterpolatingFunction 对象.
In[30]:=
Click for copyable input
Out[30]=
这里生成一个纯二维 InterpolatingFunction 对象.
In[31]:=
Click for copyable input
Out[31]=
FunctionInterpolation[expr,{x,xmin,xmax}]
通过计算 exprx 的值
FunctionInterpolation[expr,{x,xmin,xmax},{y,ymin,ymax},]
构造多维近似函数

通过计算表达式构造近似函数.