bar*_*ter 5 interpolation wolfram-mathematica splines
我正在逆向工程Mathematica如何列出插值:
(* Fortunately, Mathematica WILL interpolate an arbitrary list *)
tab = Table[a[i], {i,1,100}]
f = Interpolation[tab]
(* get the coefficient of each term by setting others to zero *)
Plot[{f[42+x] /. {a[42] -> 0, a[43] ->0, a[44] -> 0, a[41] -> 1}},
{x,0,1}]
Plot[{f[42+x] /. {a[41] -> 0, a[43] ->0, a[44] -> 0, a[42] -> 1}},
{x,0,1}]
Plot[{f[42+x] /. {a[42] -> 0, a[41] ->0, a[44] -> 0, a[43] -> 1}},
{x,0,1}]
Plot[{f[42+x] /. {a[42] -> 0, a[43] ->0, a[41] -> 0, a[44] -> 1}},
{x,0,1}]
(* above is neither Hermite, nor linear, though some look close *)
(* these are available at oneoff.barrycarter.info/STACK/ *)
Table[f[42+x] /. {a[42] -> 0, a[43] ->0, a[44] -> 0, a[41] -> 1},
{x,0,1, 1/100}] >> /home/barrycarter/BCINFO/ONEOFF/STACK/coeff41.txt
Table[f[42+x] /. {a[41] -> 0, a[43] ->0, a[44] -> 0, a[42] -> 1},
{x,0,1, 1/100}] >> /home/barrycarter/BCINFO/ONEOFF/STACK/coeff42.txt
Table[f[42+x] /. {a[41] -> 0, a[42] ->0, a[44] -> 0, a[43] -> 1},
{x,0,1, 1/100}] >> /home/barrycarter/BCINFO/ONEOFF/STACK/coeff43.txt
Table[f[42+x] /. {a[41] -> 0, a[42] ->0, a[43] -> 0, a[44] -> 1},
{x,0,1, 1/100}] >> /home/barrycarter/BCINFO/ONEOFF/STACK/coeff44.txt
Run Code Online (Sandbox Code Playgroud)
编辑:谢谢,whuber!这完全符合我的要求.作为参考,系数是(按顺序):
(x-2)*(x-1)*x/-6
(x-2)*(x-1)*(x+1)/2
x*(x+1)*(x-2)/-2
(x-1)*x*(x+1)/6
Run Code Online (Sandbox Code Playgroud)
根据文档,插值器是分段多项式.这有点模糊,所以这里有一些东西需要调查.
您可以通过实验确定插补器是数据的线性函数.所有可能数据的良好基础包括{1,0,...,0},{0,1,0,...,0},...,{0,..., 0,1}.为此,让我们构建一个小函数来生成长度为$ n $的这些向量:
test[n_, i_] := Module[{x = ConstantArray[0,n]},x[[i]] = 1; x]
Run Code Online (Sandbox Code Playgroud)
您可以通过尝试这样的一些示例来确认线性,系数$ a $和$ b $作用于$ i ^\text {th} $和$ j ^\text {th} $基础向量,长度为$ n $:
With[{a=1, b=2.5, n=5, i=2, j=3},
Plot[{Interpolation[a test[n,i] + b test[n,j]][x],
a Interpolation[test[n,i]][x] + b Interpolation[test[n,j]][x]}, {x, 1, n}]
]
Run Code Online (Sandbox Code Playgroud)
只有一条曲线,因为这两个函数是叠加的.
建立线性度后,就可以在$ n $基矢量上分析插值器的值.您可以通过区分来确定多项式的度数.默认情况下,度数为3,但您可以使用"InterpolatingOrder"参数对其进行修改.下面的代码将绘制一个明显的分段常数曲线表,该曲线由插值器的导数产生,用于插入阶数1到ioMax,使用长度为$ n $的数据的所有基矢量:
With[{n=7, ioMax = 5},
Table[
Module[{fns},
fns = Table[Interpolation[test[n,i], InterpolationOrder->io], {i,1,n}];
Table[Plot[Evaluate@D[f[#], {#,io}]&[x], {x,1,n},
PlotRange->Full, PlotStyle->Thick, ImageSize->150], {f, fns}]
], {io, 1, ioMax}
]
] // TableForm
Run Code Online (Sandbox Code Playgroud)
输出显示断点发生在参数的整数值处,并且对于长度为$ n $的数据和度为$ d $的插值器,最多有$ nd $ distinct段.这些信息可以帮助您完成大部分工作.
| 归档时间: |
|
| 查看次数: |
461 次 |
| 最近记录: |