На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> Интерполяция
    Я сделал интерполяцию произвольной фунцкцией, если надо могу выложить исходники
      2rodion:
      Ето как? Как твоя функция задается? И ето точно интерполяция (може аппроксимация)?
        Цитата Sanya, 23.09.02, 11:34:42
        Вопрос к тебе. У тебя есть набор точек на прлоскости - ты их хочешь соеденить в что-то. Говоришь ето не функция. Через твои точки можно провести бесконечное множество фигур. Интерполяция сплайнами катит для функции, тоесть на каждом отрезке ты интерполируешьполиномом второй степени, с условиями стыковки и гладкости.
         А пример про пушку, насколько я понял и говорит, что нужна именно функция. Или может я не прав?

        Да, очень прав. Ты заметил, что я говорил про гравитацию? Идея в том, чтобы для каждых двух узлов принимать свою ось координат, чтобы иметь функцию. И тогда: для начального узла я принимаю почти любое направление, лечу квадратным полиномом в следующий узел и т.д. Т.е. на каждом шагу принимать, что имеем интерполяцию (уже не сплайновую) параболой при заданых концах и заданом первом дифференциале в первом узле. Верно?
          Цитата rodion, 23.09.02, 12:13:56
          Я сделал интерполяцию произвольной фунцкцией, если надо могу выложить исходники

          Если вы будете так добры :). Знаешь, чтобы посмотреть и сверить. Ты хочешь их прямо здесь выложить?
            2TrivialCore:
              Ну да вообщем. Только такая интерполяция называеться сплайновой :-) (а именно квадратичным сплайном). У тебя есть точки, значения в них. Ты ставишь условие стыковки (f(xi-0)=f(xi+0)) и гладкости (df(xi-0)=df(xi+0)). У тебя получается система уравнений, решая которую на каждом отрезке получаешь полином второй степени. В начальной точке обычно задается df(x0)=0.
              Интерполирует хорошо. Скажу больше: кубичные сплайны интерполируют функцию, что даже глазом не различишь.
              А насчет гравитации - так ето у тебя уже в сторону оптимального управления задача. Она у тебя стоит в такой мат абстракции, или с трактовкой (Пушка не тянет :-))?
              Толбко это не будет обычный сплайн, т.к. я уже говорил, это не функция. (некоторым "х" будет отнесено несколько "у" и наоборот). Ладно, объясню, зачем это всё мне надо. Вот сейчас изучаю winapi и решил развлечься, написать следующую программу: по экрану летают шарики :). Их 15, летают гладко (по кривым). А теперь мне захотелось их соединить чертой. Сначала соединил отрезками, но это выглядит ужасно (немного а ля один из win screensaver'ов), поэтому мне надо соединить их гладкой чертой, в результате получится что-то наподобие извивающейся змейки. Сам видишь, что о никакой ф-ии речи быть не может. Вот так.
                Слушай. А они у тебя летают по бильярдному принципу? Тоесть ты обрабатываешь их столкновения?
                  данана функция вида f(x, k)
                  x вектор пременных
                  k вектор параметров
                  ичется миниум z(k) = E (f(xi, k) - y)2
                  для градиентного метода надо всего лишь знать частные производные f(x, k) по  kj
                  все просто исходники выложу
                    Цитата rodion, 24.09.02, 12:42:03
                    данана функция вида f(x, k)
                    x вектор пременных
                    k вектор параметров
                    ичется миниум z(k) = E (f(xi, k) - y)2
                    для градиентного метода надо всего лишь знать частные производные f(x, k) по  kj
                    все просто исходники выложу

                    О, это звучит заманчиво, только я не въехал, что и что обозначает. Что такое k? какие там параметры. А Е это ожидаемое значение? Вобщем объясни, плиз, поподробнее и исходники покажи, если не трудно :). А то я сидел, думал и не придумал, как менять ось координат :(, а с векторами действительно должно быть проще.

                    Sanya, шары не сталкиваются, они не знают о существовании друг друга. Влом возиться :).
                      2rodion:
                        Я все таки был прав! :-) Ето не интерполяция, а аппроксимация. Только ты забыл что для градиентного методу надо еще и начальное приближение. Произвольное его значение может привести к неверным результатам (локальному минимуму вне допустимой области напр.).
                        2TrivialCore: Чего спросил, просто сам когда-то хотел подобное сделать, а ты упомянул про гравитацию. Помоему сталкивание тоже можно так сделать (только будет вектор не гравитации, а силы).
                        Короче, если хотите посмотреть, как это выглядит, вот бросил сюда програм: http://republika.pl/x_chaos_x/Blockout3.exe (28кВ). Надеюсь, у вас не слишком быстрые компы, а то, кажется, при быстрой графике нихрена не видно :( (btw скорость действия программы я регулировал Sleep(milliseconds), так правильно?). Левая мышь - шары падают, правая - взлетают.
                        (Если нужны сорсы, тоже могу бросить, хотя там смотреть особо не на что :)).
                          TrivialCore
                          Е это знак суммы
                          Насчет к, объясню на примере полинома p(x) = Exiki
                          Кстати чем интерполяция отличается от апроксимации
                          вот исходники
                          ExpandedWrap disabled
                            <br>double *Regres(const double* y, const double* x, double *k, double e, const func *f, int d, int N, int Nk)<br>// d размерность x<br>// dN  размер y<br>// Nk  число параметров<br>{<br>double *ck = new double [Nk];<br>double *yc = new double [N];<br>double ec = 1;<br>e*=e;<br>while (ec > e)<br>{<br>for (int i = 0; i < N; i++) yc[i] = f[0](x + i*d, k, Nk, d);<br>ec = 0;<br>double r = 0;<br>for (int j = 0; j < Nk; j++)<br>  {<br>  double s = 0;<br>  for (int i = 0; i < N; i++)<br>     s+= 2.*(y[i]- yc[i])*f[1 + j](x + i*d, k, Nk, d);<br>  s /= N*N;<br>  ec += s*s;<br>  r += k[j]*k[j];<br>  ck[j] = k[j] + s;<br>  }<br>CopyMemory(k, ck, sizeof(double)*Nk);<br>ec /= r;<br>}<br>delete[] ck, yc;<br>return k;<br>}<br>//---------------------------------------------------------------------------<br>
                            Вот сижу, стараюсь понять, что к чему, а въехать никак не могу >:( ???.
                              func *f это указатель на указатель функцию и ее производные
                              все работает
                              все таки придется класть полностью, только до оформлю.
                                   Можно интерполировать параболами.
                                Т.е. если вначале заданны вершины ломанной и производная в первой вершине, то для каждого отрезка можно построить параболу. А потом по параметру x находить номер отрезка и подставлять в ур-ние параболы для этого отрезка икс.
                                   Вобщем вот так:
                                Дано: y[0],y[1],...,y[n], x[0]<x[1]<...<x[n],  y'[0]
                                Нахождение параболы для i-го отрезка:
                                   ax[i]x[i] + bx[i] + cx[i] = y[i]
                                   ax[i+1]x[i+1] + bx[i+1] = y[i+1]
                                   2ax[i]+b = y'[i]
                                Система из трех уравнений с тремя неизвестными a,b,c
                                   Потом для следущего шага найти y'[i+1] = 2ax[i+1]+b
                                Для каждого отрезка решить такую систему и интерполяция готова :)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0870 ]   [ 15 queries used ]   [ Generated: 8.09.24, 00:53 GMT ]