Mathematica插值[]在外部范围内保持不变

时间:2010-12-18 02:07:07

标签: wolfram-mathematica

我想“修改”Mathematica的Interpolation []函数(1 维度)通过用常数值替换外推法 输入超出范围。

换句话说,如果插值域是[1,20]并且f [1] == 7和 f [20] == 12,我想:

f[x] = 7 for x<=1 
f[x] = 12 for x>=20 
f[x] = Interpolation[...] 

然而,这失败了:

(* interpolation w cutoff *) 
interpcut[r_] := Module[{s, minpair, maxpair}, 

(* sort array by x coord *) 
s = Sort[r, #1[[1]] < #2[[1]] &]; 

(* find min x value and corresponding y value *) 
minpair = s[[1]]; 

(* ditto for max x value *) 
maxpair = s[[-1]]; 

(* return the pure function representing cutoff interpolation *) 
Piecewise[{ 
{minpair[[2]] &, #1 < minpair[[1]] &}, 
{maxpair[[2]] &, #1 > maxpair[[1]] &}, 
{Interpolation[r], True} 
}]] 

test = Table[{x,Prime[x]},{x,1,10}] 

InputForm[interpcut[test]] 

Piecewise[{{minpair$59[[2]] & , #1 < minpair$59[[1]] & },  
  {maxpair$59[[2]] & , #1 > maxpair$59[[1]] & }},  
 InterpolatingFunction[{{1, 10}}, {3, 1, 0, {10}, {4}, 0, 0, 0, 0},  
  {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}, {{2}, {3}, {5}, {7}, {11}, {13}, {17},  
   {19}, {23}, {29}}, {Automatic}]] 

我确定我遗漏了一些基本的东西。什么?

3 个答案:

答案 0 :(得分:4)

功能定义

interpcut[r_, x_] := 
   Module[{s},(*sort array by x coord*)
       s = SortBy[r, First];
       Piecewise[
        {{First[s][[2]], x < First[s][[1]]},
         {Last [s][[2]], x > Last [s][[1]]},
         {Interpolation[r][x], True}}]]; 

测试

test = Table[{x, Prime[x]}, {x, 1, 10}];
f[x_] := interpcut[test, x]
Plot[f[x], {x, -10, 30}]  

alt text

修改

回答有关纯函数的评论。

我这样做只是为了清晰,而不是作弊。使用纯函数只需“遵循配方”:

interpcut[r_] := Module[{s},
  s = SortBy[r, First];
  Function[Piecewise[
    {{First[s][[2]], # < First[s][[1]]},
     {Last [s][[2]], # > Last [s][[1]]},
     {Interpolation[r][#], True}}]]
  ] 

test = Table[{x, Prime[x]}, {x, 1, 10}];
f = interpcut[test] // InputForm
Plot[interpcut[test][x], {x, -10, 30}]

答案 1 :(得分:2)

这是belisarius答案的可能替代方案:

interpcut[r_] := Module[{s}, s = SortBy[r, First];
    Composition[Interpolation[r], Clip[#, Map[First, Through[{First, Last}[s]]]] &]]

答案 2 :(得分:1)

让我为这个旧线程添加更新。从V9开始,您可以使用原生(但仍然是实验性的)&#34; ExtrapolationHandler&#34;参数

test = Table[{x, Prime[x]}, {x, 1, 10}];

g = Interpolation[test, "ExtrapolationHandler" -> 
      {If[# <= test[[1, 1]], test[[1, 2]], test[[-1, 2]]] &, 
        "WarningMessage" -> False}];

Plot[g[x], {x, -10, 30}]

enter image description here