Wolfram mathematica 从图中识别Mathematica插值函数(非Hermite)

Wolfram mathematica 从图中识别Mathematica插值函数(非Hermite),wolfram-mathematica,interpolation,splines,Wolfram Mathematica,Interpolation,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,

我是逆向工程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
编辑:谢谢,whuber!那正是我想要的。作为参考,系数如下(顺序):


根据文献,插值器是分段多项式。这有点模糊,所以这里有一些东西需要调查

您可以通过实验确定插值器是数据的线性函数。所有可能数据的良好基础由形式为{1,0,…,0},{0,1,0,…,0},…,{0,…,0,1}的向量组成。为此,让我们构建一个小函数来生成这些长度为$n$的向量:

test[n_, i_] := Module[{x = ConstantArray[0,n]},x[[i]] = 1; x]
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}]
]
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
您可以通过尝试以下示例来确认线性,系数$a$和$b$作用于长度为$n$的$i^\text{th}$和$j^\text{th}$基向量:

test[n_, i_] := Module[{x = ConstantArray[0,n]},x[[i]] = 1; x]
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}]
]
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
因为两个函数是重叠的,所以只有一条曲线

建立了线性后,就足以在$n$基向量上分析插值器的值。您可以通过微分来确定多项式的阶数。默认情况下,阶数为3,但可以使用“InterpolationOrder”参数对其进行修改。以下代码将使用长度为$n$的数据的所有基向量,绘制一张明显分段常数曲线表,该表由插值器的导数产生,用于插值阶数1到ioMax:

test[n_, i_] := Module[{x = ConstantArray[0,n]},x[[i]] = 1; x]
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}]
]
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

输出显示,中断发生在参数的整数值处,对于长度为$n$的数据和次数为$d$的插值器,最多有$n-d$个不同的段。这些信息应该能让您大致了解情况。

为了便于阅读,除了一个绘图之外,它将有助于消除所有绘图,或者使所有绘图都更小。