Интерполяция в математике

Пожалуйста, обратите внимание на следующее распределение:

rs={{400, 0.00929}, {410, 0.0348}, {420, 0.0966}, {430, 0.2}, {440, 0.328}, {450, 0.455}, 
    {460, 0.567}, {470, 0.676}, {480, 0.793}, {490, 0.904}, {500, 0.982}, {510, 0.997}, 
    {520,0.935}, {530, 0.811}, {540, 0.65}, {550, 0.481}, {560, 0.329}, {570,0.208}, 
    {580, 0.121}, {590, 0.0655}, {600, 0.0332}, {610, 0.0159}, {620, 0.00737}, 
    {630, 0.00334}, {640, 0.0015}, {650,0.000677}, {660, 0.000313}, {670, 0.000148}, 
    {680, 0.0000715}, {690,0.0000353}, {700, 0.0000178}}

введите здесь описание изображения

Как я могу интерполировать это распределение, чтобы получить значение для точек в любом месте на оси X?


person 500    schedule 10.10.2011    source источник


Ответы (3)


Просто используйте стандартную функцию Interpolation:

rsInterpolation = Interpolation@rs;
Plot[rsInterpolation@x, {x, 400, 700}]

Результат

Если вы хотите соответствовать определенному классу функций (например, нормальному распределению), вместо этого используйте FindFit.

person Mechanical snail    schedule 10.10.2011
comment
@500 Имейте в виду, что интерполяция [] явно не может работать так, как ожидалось, как экстраполяция. Попробуйте Plot[Interpolation[rs]@x, {x, 1, 1000}], чтобы увидеть это. Это не недостаток этого ответа! - person Dr. belisarius; 11.10.2011
comment
@LeonidShifrin: Хороший улов. Отредактировано. - person Mechanical snail; 11.10.2011
comment
Здорово! Комментарий удален, +1 - person Leonid Shifrin; 11.10.2011
comment
@belisarius, лол, твой сюжет ужасен. Вот как я это использую, похоже, работает: rsi =Interpolation[Transpose@{Range[400, 700, 10], Flatten@rodSensitivity}] rsi /@ Range[#,#+30,1] & /@ { 440, 490, 540} - person 500; 11.10.2011
comment
@LeonidShifrin Просто из любопытства, что ты прокомментировал? - person abcd; 11.10.2011
comment
@yoda: он указал, что то, что я написал, будет медленным, так как я забыл явно указать Evaluate внутри Plot. - person Mechanical snail; 11.10.2011
comment
@Mechanicalsnail Я не думаю, что здесь потребуется соответствие нормальному распределению. Это похоже на кривую чувствительности человеческого глаза (по оси x отложена длина волны в нм). - person Sjoerd C. de Vries; 11.10.2011
comment
@LeonidShifrin Хм. Я считаю, что бесы рекурсии работают сегодня. Комментарий: Удалить этот комментарий: удалить этот... - person Daniel Lichtblau; 11.10.2011
comment
FixedPoint[@Daniel's Comment[#]&, x] - person Dr. belisarius; 11.10.2011

Если вам нужны хорошие производные, вы можете сделать что-то вроде:

interp = Interpolation[rs, InterpolationOrder -> 3, Method -> "Spline"]
Show[Plot[{interp[x], 10 interp'[x]}, {x, Min[First /@ rs], Max[First /@ rs]},
          PlotRange -> Full],
     ListPlot@rs]

введите здесь описание изображения

Посмотрите на разницу в поведении производной при использовании метода «Сплайн»:

interp  = Interpolation[rs, InterpolationOrder -> 3, Method -> "Spline"]
interp1 = Interpolation[rs, InterpolationOrder -> 3]
Show[Plot[{interp1'[x], interp'[x] - .005}, 
          {x, Min[First /@ rs], Max[First /@ rs]}, PlotRange -> Full]]

введите здесь описание изображения

person Dr. belisarius    schedule 11.10.2011
comment
@yoda Я знаю, но мне удобнее указать это. На всякий случай, если будущий выпуск изменит это :) - person Dr. belisarius; 11.10.2011
comment
Поздравляем с получением Золотого значка Mathematica! ## Воздуходувка для вечеринок ## - person Mr.Wizard; 12.10.2011

Если это дистрибутив, я думаю, вам следует использовать SmoothKernelDistribution.

person carlosayam    schedule 10.04.2012