2009-10-29 12 views
6

Wszystko,funkcji JavaScript dla interpolacji trójliniowe

MYŚLĘ że ja szukam funkcją interpolacji trójliniowe.

Oto dane:

mam trójwymiarowy zestaw danych:

  • wymiar 1 zmienia się od 0 do 100 w przyrostach co 5
  • wymiaru 2 zmienia się od 0 do 100 w przyrostach co 5
  • wymiar 3 waha się od 0 do 1, w odstępach co 0,1

Tak mam 4851 wartości całkowite (21 x 21 x 11).

Jeśli potrzebuję znaleźć wartość (10, 25, 0.3) - to proste - mogę po prostu sprawdzić ją w trójwymiarowej tablicy.

Ale potrzebuję być w stanie wymyślić najlepsze przybliżenie , podając wartości wymiarowe (17,48,0,73), na przykład.

Tak więc, I myślę, że , że to, czego szukam, to interpolacja trójliniowa (chociaż zdecydowanie doceniam wszelkie sugestie dotyczące lepszej metody lub podpowiedź, że jestem na niewłaściwym temacie w ogóle ...)

szybkie wyszukiwanie google okazuje się tę formułę:

Vxyz = 
V000(1-x)(1-y)(1-z) + 
V100x(1-y)(1-z) + 
V010(1-x)y(1-z) + 
V001(1-x)(1-y)z + 
V101x(1-y)z + 
V011(1-x)yz + 
V110xy(1-z) + 
V111xyz 

który wygląda jak co szukam, ale nie jestem pewien, co x, Y i z oznaczają. Gdybym miał zgadywać, x to stosunek - odległość mojej wartości "pierwszego celu" od najbliższych dwóch wartości, które mam, y to stosunek drugiego wymiaru, a z to stosunek trzeciego wymiaru.

Oczywiście, ponieważ tak naprawdę nie wiem, o czym mówię, nie wiedziałbym, czy to dobrze, czy źle.

Idealnie, chciałbym trochę kodu JavaScript lub pseudo-kodu, który pokazuje dokładnie, jak to osiągnąć.

Wielkie dzięki z góry!

+0

Co używasz go? Po prostu ciekawy :) –

+1

Matt - jest to rodzaj aplikacji planowania finansowego. Dostałem stolik od grupy doradztwa inwestycyjnego mojego klienta. Trzy wymiary to twój wiek, planowany wiek emerytalny i stosunek twojego kapitału do portfela/obligacji; tabela przedstawia prognozowany dochód emerytalny, który będzie produkował twój portfel. Tak więc, jeśli masz 30 lat, planujesz przejść na emeryturę w wieku 65 lat, a 85% twojego portfela to kapitał własny, twoje portfolio wygeneruje $ x w przychodach z emerytury. Działa świetnie, z wyjątkiem interwałów są duże i muszę być w stanie oszacować wartość wejść między interwałami. – mattstuehler

Odpowiedz

6

Kod, który oglądasz, próbuje wykonać średnią ważoną 8 punktów sześcianu z wierzchołkami, które znajdują się w zestawie danych, i który obejmuje punkt, dla którego próbujesz znaleźć wartość.

Do punktu p

// Find the x, y and z values of the 
// 8 vertices of the cube that surrounds the point 
x0 = Math.floor(p.x/5); 
x1 = Math.floor(p.x/5) + 1; 

y0 = Math.floor(p.y/5); 
y1 = Math.floor(p.y/5) + 1; 

z0 = Math.floor(p.z/.1); 
z1 = Math.floor(p.z/.1) + 1; 

// Look up the values of the 8 points surrounding the cube 
p000 = dataset[x0][y0][z0]; 
p001 = dataset[x0][y0][z1]; 
// ... 

// Find the weights for each dimension 
x = (x - x0)/5; 
y = (y - y0)/5; 
z = (z - z0)/.1; 

// Compute the guess using the method you found 
// ... 
+0

Daniel, wielkie dzięki za odpowiedź! Wygląda dokładnie to, czego potrzebuję. Pozdrawiam, Matt – mattstuehler