Mathematica Interpolation [], которая остается постоянной, когда находится вне диапазона - PullRequest
5 голосов
/ 18 декабря 2010

Я хочу «изменить» функцию интерполяции [] Mathematica (в 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 ]

4 голосов
/ 18 декабря 2010

Определение функции

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}]
2 голосов
/ 25 декабря 2010

Вот возможная альтернатива ответу Велисария:

interpcut[r_] := Module[{s}, s = SortBy[r, First];
    Composition[Interpolation[r], Clip[#, Map[First, Through[{First, Last}[s]]]] &]]
1 голос
/ 13 января 2015

Позвольте мне добавить обновление в эту старую тему.Начиная с версии V9 вы можете использовать собственный (но все еще экспериментальный) параметр "ExtrapolationHandler"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...