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

        Да, вот только алгоритмов почему-то нигде нету...У меня есть формула по которой нужно построить 3д график, после чего аппроксимировать полученое множество точек.Подчеркиваю-не интерполировать а апроксимировать.
        P.S. Я нашёл алгоритм аппроксимации плоскостю но он почему-то неправильно работает (плоскость строится очень далеко от апроксимируемой функции). Вот код:
        ypedef struct // Structure For 3D Points
        {
        double x, y, z; // X, Y & Z Points
        } VERTEX; // Called VERTEX


        typedef struct // Structure For An Object
        {
        // int verts; // Number Of Vertices For The Object
        VERTEX *points; // One Vertice (Vertex x,y & z)
        } OBJECT;
        OBJECT plane,aproxplane;

        void Flat(int numX,int numY)
        {
        int xm,ym; //rozmir masiva surf
        double a[4]={0,0,0,0},b[4]={0,0,0,0},c[4]={0,0,0,0},d1[4]={0,0,0,0};
        double buf,k12,k13,k23;
        int i,j;

        xm=numX; ym=numY;

        a[1]=(xm * (xm + 1) * (2 * xm + 1)) / 6 * (ym + 1);
        b[1] = xm * (xm + 1) * ym * (ym + 1) / 4;
        c[1]= xm * (xm + 1) / 2 * (ym + 1);
        a[2]= b[1];
        b[2]= (ym * (ym + 1) * (2 * ym + 1)) / 6 * (xm + 1);
        c[2]= ym * (ym + 1) / 2 * (xm + 1);
        a[3]= c[1];
        b[3]= c[2];
        c[3]= xm * ym;
        // вычисление правой части системы уравнений
        d1[1] = 0;
        buf = 0;
        for (i = 0; i<=xm; ++i)
        {
        for (j = 0; j<=ym; ++j )

        buf = buf +plane.points[j+i*numX].x;
        d1[1] = d1[1] + buf * i;
        buf = 0;
        }
        d1[2] = 0;
        buf = 0;
        ym=numY;
        for (i= 0; i<=ym; ++i)
        {
        for (j= 0; j<=xm; ++j)
        buf = buf + plane.points[i+j*numX].x;
        d1[2] = d1[2] + buf * i;
        buf = 0;
        }
        d1[3] = 0;
        for(i = 0;i<=xm; i++)
        for( j = 0; j<=ym; j++)
        d1[3] = d1[3] + plane.points[j+i*numX].x;
        // вычисление коэффициентов для умножения на 1-е уравнение
        // для преобразования 2-го и 3-го уравнений системы
        k12 = - a[2] / a[1];
        k13 = - a[3] / a[1];
        // вычисление коэффициента для умножения на 2-е уравнение
        // для преобразования 3-го уравнения системы
        k23 = - (b[3] + k13 * b[1]) / (b[2] + k12 * b[1]);

        // такой вариант вызывает ошибку переполнения типа integer.
        // исключительной ситуации не возникает, а результат неверный
        // {x3 = ((d[3] + k13 * d[1]) + k23 * (d[2] + k12 * d[1])) /
        // ((c[3] + k13 * c[1]) + k23 * (c[2] + k12 * c[1])); }

        // вычисление корней уравнения
        x3 = ((d1[3] + k13 * d1[1]) + k23 * (d1[2] + k12 * d1[1]));
        x3 = x3 / ((c[3] + k13 * c[1]) + k23 * (c[2] + k12 * c[1]));

        x2 = ((d1[2] + k12 * d1[1]) - (c[2] + k12 * c[1]) * x3) / (b[2] + k12 * b[1]);
        x1 = (d1[1] - c[1] * x3 - b[1] * x2) / a[1];

        }
        вот сайт где я его нашел http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1368
        Мне интересно правильный ли он.
          Цитата CronOS @
          Да, вот только алгоритмов почему-то нигде нету...

          Да везде есть алгоритмы! Это исходного кода реализации не везде прилагается. Впрочем, и исходных кодов хватает.
          А в плоскость можно и по МНК аппроксимировать, код написАть элементарно, особенно если сначала ручкой по бумаге повозить - получится обычная линейная система из 4 уравнений..
            CronOS
            Вот самый простой вариант для регулярной сетки, бейсик:
            ExpandedWrap disabled
              Public Function GetHeight(x As Single, z As Single) As Single
              Dim xx As Single, zz As Single, ix As Long, iz As Long
                ix = Int(x)
                iz = Int(z)
                xx = x - ix
                zz = z - iz
                GetHeight = vBuf(ix, iz).Pos.y * (1 - xx) * (1 - zz) + vBuf(ix + 1, iz).Pos.y * xx * (1 - zz) + vBuf(ix, iz + 1).Pos.y * (1 - xx) * zz + vBuf(ix + 1, iz + 1).Pos.y * xx * zz
              End Function

            Эта ф-ция возвращает высоту для точки ландшафта, заданного регулярной сеткой.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0269 ]   [ 15 queries used ]   [ Generated: 18.06.24, 09:56 GMT ]