![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.0.88] |
![]() |
|
Сообщ.
#1
,
|
|
|
Народ! помогите пожалуйста найти алгоритмы аппроксимации двумерных функций Z=f(x,y) или подскажите основные направления для поиска. Точки заданы с определенным шагом(неизменным).
|
![]() |
Сообщ.
#2
,
|
|
Вопрос не до конца непонятен. Надо по массиву определить вид функции? или вид функции известен, и нужно получить интерполяционную функцию?
А вообще Гугль по словам "многомерная аппроксимация" просто захлёбывается от ссылок... |
Сообщ.
#3
,
|
|
|
Цитата 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 Мне интересно правильный ли он. |
![]() |
Сообщ.
#4
,
|
|
Цитата CronOS @ Да, вот только алгоритмов почему-то нигде нету... Да везде есть алгоритмы! Это исходного кода реализации не везде прилагается. Впрочем, и исходных кодов хватает. А в плоскость можно и по МНК аппроксимировать, код написАть элементарно, особенно если сначала ручкой по бумаге повозить - получится обычная линейная система из 4 уравнений.. |
![]() |
Сообщ.
#5
,
|
|
CronOS
Вот самый простой вариант для регулярной сетки, бейсик: ![]() ![]() 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 Эта ф-ция возвращает высоту для точки ландшафта, заданного регулярной сеткой. |