2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 интерполяция/аппроксимация медленно меняющихся данных
Сообщение18.10.2010, 22:58 


25/06/07
124
Новосибирск
Добрый день!
У меня возникли некоторые проблемы в решении задачи. Был бы очень благодарен помощи!
Дано:
прямоугольные координаты небесного тела на каждый момент времени из определённого (эквидистантного) ряда.
Моментов времени в ряду может быть от нескольких сотен до нескольких тысяч. Нужно построить ряды скоростей на те же моменты времени. Как я делал: интерполировал полиномиально координаты (покомпонентно, конечно), т.е. получал новую функцию, которая по заданному значению аргумента выдавала соответствующее значение функции. Интерполяцию производил с помощью подпрограммы из Numerical Recipes. Используя полученную функцию, использовал подпрограмму для численного дифференцирования функций из того же Numerical Recipes. Но когда дело дошло до довольно медленно меняющейся координаты (первые десять или более значений совпадали), интерполирующая подпрограмма стала выдавать ошибку, поскольку в определённом её участке происходило деление на ноль. Таким боразом, эта подпрограмма непригодна для интерполяции функций, имеющих плато. Вопрос я "решил" прибавлением к компонентам медленно меняющейся координаты незначительной случайной добавки. Разумеется, это не дело.
Вопрос вот в чём:
как лучше интерполировать или, может быть лучше, аппроксимировать медленно меняющиеся данные? Может быть, есть база готовых подпрограмм на Фортране для таких «азовых» случаев, отличная от Numerical Recipes?
Вот фрагмент моих данных (1-й столбец - время, остальные - компоненты координат):

Код:
              2441380.500000000000000           80884369.073072671890259          122667591.823098182678223          -18562089.534289404749870
              2441380.541666666511446           78080549.537684038281441          124471069.039839655160904          -18562089.534289404749870
              2441380.583333333488554           75236535.588999271392822          126210470.867485880851746          -18562089.534289404749870
              2441380.625000000000000           72130479.918291211128235          128010988.242354601621628          -18562089.534289404749870
              2441380.666666666511446           69207686.132138401269913          129614487.709756731987000          -18562089.534289404749870
              2441380.708333333488554           66478066.641948103904724          131035437.571582004427910          -18562089.534289404749870
              2441380.750000000000000           63256741.014492549002171          132620526.164891511201859          -18562089.534289404749870
              2441380.791666666511446           60231653.118758864700794          134021517.699990123510361          -18562089.534289404749870
              2441380.833333333488554           56939235.665969550609589          135453101.425557762384415          -18562089.534289404749870
              2441380.875000000000000           53851510.255710110068321          136710036.526973426342010          -18562089.534289404749870
              2441380.916666666511446           50724799.210286036133766          137865981.513513892889023          -18818509.460046071559191
              2441380.958333333488554           47341291.023288413882256          139064144.472458094358444          -18818509.460046071559191
              2441381.000000000000000           44174111.094208687543869          140102398.347226381301880          -18818509.460046071559191
              2441381.041666666511446           40984191.155115917325020          141068530.115576475858688          -18818509.460046071559191
              2441381.083333333488554           37525345.399157010018826          142027752.803043246269226          -18818509.460046071559191
              2441381.125000000000000           34293455.630464695394039          142842546.233710557222366          -18818509.460046071559191
              2441381.166666666511446           31294465.844854488968849          143529406.468129813671112          -18818509.460046071559191
              2441381.208333333488554           27778387.999949205666780          144251153.457200020551682          -18818509.460046071559191
              2441381.250000000000000           24498563.973652794957161          144844242.125247180461884          -18818509.460046071559191
              2441381.291666666511446           21206128.542706396430731          145362767.673976957798004          -18818509.460046071559191
              2441381.333333333488554           17648269.160898588597775          145837487.324874281883240          -18818509.460046071559191
              2441381.375000000000000           14335062.846281424164772          146200342.293722242116928          -18818509.460046071559191
              2441381.416666666511446           10758790.775017205625772          146506936.814158380031586          -18818509.460046071559191
              2441381.458333333488554            7432169.723710637539625          146713315.574307531118393          -18818509.460046071559191
              2441381.500000000000000            4101722.729793098289520          146844169.050923794507980          -18818509.460046071559191
              2441381.541666666511446            3845425.181770080234855          146851104.247737258672714          -18818509.460046071559191
              2441381.583333333488554            3589115.919914415571839          146857592.110594719648361          -18818509.460046071559191
              2441381.625000000000000            3845425.181770080234855          146851104.247737258672714          -18818509.460046071559191
              2441381.666666666511446            3589115.919914415571839          146857592.110594719648361          -18818509.460046071559191
              2441381.708333333488554            3589115.919914415571839          146857592.110594719648361          -18818509.460046071559191
              2441381.750000000000000            3332795.724988576490432          146863632.619732946157455          -18818509.460046071559191
              2441381.791666666511446            3076465.377788437996060          146869225.756751567125320          -18818509.460046071559191
              2441381.833333333488554            3076465.377788437996060          146869225.756751567125320          -18818509.460046071559191
              2441381.875000000000000            2820125.659140702337027          146874371.504612892866135          -18818509.460046071559191
              2441381.916666666511446            2563777.349900651723146          146879069.847642093896866          -18818509.460046071559191
              2441381.958333333488554            2563777.349900651723146          146879069.847642093896866          -18818509.460046071559191
              2441382.000000000000000            2307421.230949704069644          146883320.771527200937271          -18818509.460046071559191
              2441382.041666666511446            2051058.083193164551631          146887124.263319134712219          -18818509.460046071559191
              2441382.083333333488554            2307421.230949704069644          146883320.771527200937271          -18818509.460046071559191
              2441382.125000000000000            2051058.083193164551631          146887124.263319134712219          -18818509.460046071559191
              2441382.166666666511446            2051058.083193164551631          146887124.263319134712219          -18818509.460046071559191
              2441382.208333333488554            1794688.687557652126998          146890480.311431825160980          -18818509.460046071559191
              2441382.250000000000000            1538313.824988849926740          146893388.905642151832581          -18818509.460046071559191
              2441382.291666666511446            1538313.824988849926740          146893388.905642151832581          -18818509.460046071559191
              2441382.333333333488554            1281934.276449061930180          146895850.037090063095093          -18818509.460046071559191
              2441382.375000000000000            1025550.822914964286610          146897863.698278516530991          -18818509.460046071559191
              2441382.416666666511446            1025550.822914964286610          146897863.698278516530991          -18818509.460046071559191
              2441382.458333333488554             769164.245375030324794          146899429.883073508739471          -18818509.460046071559191
              2441382.500000000000000             512775.324827282631304          146900548.586704194545746          -18818509.460046071559191
              2441382.541666666511446             769164.245375030324794          146899429.883073508739471          -18818509.460046071559191
              2441382.583333333488554             512775.324827282631304          146900548.586704194545746          -18818509.460046071559191
              2441382.625000000000000             512775.324827282631304          146900548.586704194545746          -18818509.460046071559191
              2441382.666666666511446             256384.842276848095935          146901219.805762797594070          -18818509.460046071559191
              2441382.708333333488554                 -6.421266290335341          146901443.538204729557037          -18818509.460046071559191
              2441382.750000000000000                 -6.421266290335341          146901443.538204729557037          -18818509.460046071559191
              2441382.791666666511446            -256397.684789868479129          146901219.783348381519318          -18818509.460046071559191
              2441382.833333333488554            -512788.167281622183509          146900548.541875392198563          -18818509.460046071559191
              2441382.875000000000000            -512788.167281622183509          146900548.541875392198563          -18818509.460046071559191
              2441382.916666666511446            -769177.087731568724848          146899429.815830469131470          -18818509.460046071559191
              2441382.958333333488554           -1025332.805810885620303          146864796.191553205251694          -19074872.061356138437986
              2441383.000000000000000           -1025332.805810885620303          146864796.191553205251694          -19074872.061356138437986
              2441383.041666666511446           -1025332.805810885620303          146864796.191553205251694          -19074872.061356138437986
              2441383.083333333488554           -1025332.805810885620303          146864796.191553205251694          -19074872.061356138437986
              2441383.125000000000000           -1281658.546017959015444          146862782.961240887641907          -19074872.061356138437986
              2441383.166666666511446           -1537980.382070645457134          146860322.361397176980972          -19074872.061356138437986
              2441383.208333333488554           -1537980.382070645457134          146860322.361397176980972          -19074872.061356138437986
              2441383.250000000000000           -1794297.533168071182445          146857414.399517446756363          -19074872.061356138437986
              2441383.291666666511446           -2050609.218523731455207          146854059.084459871053696          -19074872.061356138437986
              2441383.333333333488554           -2050609.218523731455207          146854059.084459871053696          -19074872.061356138437986
              2441383.375000000000000           -2306914.657367738429457          146850256.426445335149765          -19074872.061356138437986
              2441383.416666666511446           -2563213.068949264008552          146846006.437057375907898          -19074872.061356138437986

 Профиль  
                  
 
 Re: интерполяция/аппроксимация медленно меняющихся данных
Сообщение18.10.2010, 23:09 
Аватара пользователя


31/10/08
1244
Для медленно меняющихся можно применить линейную интерполяцию.
Возможно просто вставить как придельный случай для уже имеющейся у вас алгоритма.

-- Вт окт 19, 2010 00:14:43 --

PS. Вот только у вас не медленно меняющиеся, а придел точности данных. Так что интерполяции вас не приведет не хорошему. Вам сначало данные усреднить надо, т.е сгладить. А это через экстраполяцию можно сделать.

 Профиль  
                  
 
 Re: интерполяция/аппроксимация медленно меняющихся данных
Сообщение19.10.2010, 00:52 


25/06/07
124
Новосибирск
Pavia в сообщении #363413 писал(а):
Для медленно меняющихся можно применить линейную интерполяцию.
Возможно просто вставить как придельный случай для уже имеющейся у вас алгоритма.

-- Вт окт 19, 2010 00:14:43 --

PS. Вот только у вас не медленно меняющиеся, а придел точности данных. Так что интерполяции вас не приведет не хорошему. Вам сначало данные усреднить надо, т.е сгладить. А это через экстраполяцию можно сделать.



Простите, но я не понял. Если мои данные изменяются на пределе точности, то как этому поможет усреднение или сглаживание? Всё равно ведь различия между значениями функции будут на пределе точности.
К слову, проблема была только с последним столбцом, т.е. с координатой Z.

 Профиль  
                  
 
 Re: интерполяция/аппроксимация медленно меняющихся данных
Сообщение20.10.2010, 13:20 
Заслуженный участник
Аватара пользователя


11/03/08
10040
Москва
А можно подробнее про интерполяционные формулы, которые Вы используете? Где у них разности интерполируемой функции в знаменателе?

 Профиль  
                  
 
 Re: интерполяция/аппроксимация медленно меняющихся данных
Сообщение20.10.2010, 22:56 
Заслуженный участник


11/05/08
32166
lexus c. в сообщении #363409 писал(а):
Моментов времени в ряду может быть от нескольких сотен до нескольких тысяч. Нужно построить ряды скоростей на те же моменты времени. Как я делал: интерполировал полиномиально координаты (покомпонентно, конечно),

Совершенно непонятно, что Вы понимаете под словом "интерполяция". Если так, в лоб буквально и интерполируете -- по тысячам узлов (да даже хоть и по сотням) -- то это нелепо. Разумееется, ничего хорошего не выйдет -- погрешности округления забьют всё. что только можно. И тут уж какие угодно чудеса возможны, хоть и деления на ноль -- это просто непредсказуемо.

 Профиль  
                  
 
 Re: интерполяция/аппроксимация медленно меняющихся данных
Сообщение20.10.2010, 23:30 
Заслуженный участник


09/08/09
3438
С.Петербург
lexus c. в сообщении #363409 писал(а):
Таким боразом, эта подпрограмма непригодна для интерполяции функций, имеющих плато.
lexus c. в сообщении #363457 писал(а):
К слову, проблема была только с последним столбцом, т.е. с координатой Z.
У Вас по координате Z три идеальных горизонтальных участка (2 ступеньки).
Изображение
Чем Вы их хотите интерполировать? И зачем?
Если у Вас координата меняется скачком, вполне естественно, что со скоростью могут быть разные неприятности.
Pavia в сообщении #363413 писал(а):
Вам сначало данные усреднить надо, т.е сгладить. А это через экстраполяцию можно сделать.
Вы, наверное, всё-таки аппроксимацию имели в виду, а не экстраполяцию.

 Профиль  
                  
 
 Re: интерполяция/аппроксимация медленно меняющихся данных
Сообщение21.10.2010, 14:25 


25/06/07
124
Новосибирск
Евгений Машеров в сообщении #363882 писал(а):
А можно подробнее про интерполяционные формулы, которые Вы используете? Где у них разности интерполируемой функции в знаменателе?

Вот код на фортране:
Код:
      SUBROUTINE polint(xa,ya,n,x,y,dy)
      INTEGER n,NMAX
      REAL dy,x,y,xa(n),ya(n)
      PARAMETER (NMAX=10000)
      INTEGER i,m,ns
      REAL den,dif,dift,ho,hp,w,c(NMAX),d(NMAX)
      ns=1
      dif=abs(x-xa(1))
      do 11 i=1,n
        dift=abs(x-xa(i))
        if (dift.lt.dif) then
          ns=i
          dif=dift
        endif
        c(i)=ya(i)
        d(i)=ya(i)
11    continue
      y=ya(ns)
      ns=ns-1
      do 13 m=1,n-1
        do 12 i=1,n-m
          ho=xa(i)-x
          hp=xa(i+m)-x
          w=c(i+1)-d(i)
          den=ho-hp
          if(den.eq.0.)pause 'failure in polint'
          den=w/den
          d(i)=hp*den
          c(i)=ho*den
12      continue
        if (2*ns.lt.n-m)then
          dy=c(ns+1)
        else
          dy=d(ns)
          ns=ns-1
        endif
        y=y+dy
13    continue
      return
      END

xa,ya — входные массивы аргумента и функции, x — интересующее значение аргумента,y — сынтерполированное значение функции.
-- Чт окт 21, 2010 14:32:17 --

Maslov в сообщении #364237 писал(а):
У Вас по координате Z три идеальных горизонтальных участка (2 ступеньки).

Это лишь начало данных по координате Z.
Вот графики по координатам x, y, z соответственно:
Изображение Изображение Изображение
Несмотря на разрывы в начале данных по X и Y, интерполяция происходит хорошо, а вот с медленно изменяющимися внечале данными по Z — проблема.

 Профиль  
                  
 
 Re: интерполяция/аппроксимация медленно меняющихся данных
Сообщение22.10.2010, 18:23 
Заслуженный участник
Аватара пользователя


11/03/08
10040
Москва
А у Вас при вызове не перепутаны функция и аргумент?
Там, в программе, деление встречается лишь в одном месте. И делитель зависит лишь от Х.

 Профиль  
                  
 
 Re: интерполяция/аппроксимация медленно меняющихся данных
Сообщение22.10.2010, 23:33 


25/06/07
124
Новосибирск
Евгений Машеров в сообщении #364891 писал(а):
А у Вас при вызове не перепутаны функция и аргумент?
Там, в программе, деление встречается лишь в одном месте. И делитель зависит лишь от Х.

Нет, там не перепутано. Кроме того, эта программа взята из Numerical Recipes ( http://lib.mexmat.ru/books/825 ).

 Профиль  
                  
 
 Re: интерполяция/аппроксимация медленно меняющихся данных
Сообщение25.10.2010, 12:39 
Заслуженный участник
Аватара пользователя


11/03/08
10040
Москва
Ну, так единственное деление - на x[i+m]-x[i].
И единственный способ на Ваших данных получить деление на ноль - подставить в качестве х вместо времени (где все значения различны) какую-то из координат (где есть повторения).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group