Model hiperboli

0

Witam
Zależy mi na stworzeniu 'modelu' hiperboli na podstawie współrzędnych. Na wejściu mam N punktów(x,y). Dla jakiejś określonej liczby punktów K << N chciałbym stworzyć model pasujący do tych K puntów. Po wygenerowaniu jakiejś ilości pseudolosowych modeli chce przepuścić wszystko przez Ransaca, tak aby znaleźć ten najlepiej pasujący. Niestety mój problem pojawia się na samym początku. Nie wiem jak wyznaczyć model hiperboli z K punktów, a niestety opisu z wikipedii nie rozumiem zbyt dobrze: http://en.wikipedia.org/wiki/Hyperbola#Quadratic_equation

Czy mógłbym prosić kogoś o jakieś wskazówki/wytłumaczenie jak się do tego zabrać? :)

0

To to jest niby model hiperboli? Chodzi ci może o interpolacje/aproksymacje zbioru punktów hiperbolą?

0

taki dość prymitywny sposób przybliżenia. nie jest to dokładny przepis a jedyne wskazówka jak można się do tego zabrać.
jeśli hiperbola dana jest równaniem ogólnym: y = a/(x-x0) + y0
gdy a>0, to x0 i y0spełniają warunki:
dla każdego x >= x0: y >= y0 oraz dla każdego x <= x0: y <= y0. analogicznie gdy a<0.
oczywiście dane punkty nie muszą układać się dokładnie na hiperboli, więc mogą być drobne odstępstwa i niektóre punkty nie będą spełniać tych warunków.
gdy mamy wyznaczony punkt (x0, y0) to należy jeszcze wyliczyć współczynnik a. jak? liczymy pole pod wykresem hiperboli. w przypadku gdy a>0 to bierzemy tylko fragment dla x>=x0, y>=y0 i liczymy pole wielokąta który tworzą te punkty, dodając jeszcze (xi, y0), (xi, ymax), (xmax, yj). (xmax, y0), gdzie xi to x dla którego y jest największe, yj to y dla którego x jest największe i ze wzoru Gaussa (http://pl.wikipedia.org/wiki/Metoda_analityczna_obliczania_pól). pole pod wykresem hiperboli łatwo policzyć. a*ln(xmax/xi) porównać oba wyniki i mamy współczynnik a, czyli wszystko co jest potrzebne do równania.

EDIT:
wyznaczanie x0: x_0 = \frac{\sum x_i |y_i|}{\sum |y_i|}. analogicznie dla y0.
jeżeli suma wszystkich y odpowiadających x większym od x0 jest większa od 0, to przyjmujemy że a>0

1

@up: totalnie bezsensu, bo twoja hiperbola zakłada kierunek asymptot.

wszystkie krzywe stożkowe, muszą spełniać równanie (drugiego stopnia z dwiema niewiadomymi):
a_{11}x<sup>2+a_{12}xy+a_{22}y</sup>2+a_{13}x+a_{23}y+a_{33}=0
współczynniki aij decydują, jakiego typu jest to krzywa (hiperbola/parabola/elipsa/okrąg).
Hiperbole masz, gdy: a_{11}a_{22}-\frac{1}{4}a_{12}^2&lt;0
Gdybyś miał 5 punktów spawa wyznaczenia a była by prosta, gdy masz ich dużo więcej i na dodatek niedokładnych to sprawa się dość komplikuje.
Przeszukiwanie wszystkich możliwych 4rek jest zbyt czasochłonne. Może algorytm genetyczny, byłby rozwiązaniem?

Podaj więcej informacji jak wyglądają dane:
Jaka jest precyzja punktów, ile ich jest, czy może być więcej niż jedna pasująca hiperbola, jaki odsetek punktów powinien pasować do jednej hiperboli.
Przykładowy rysunek byłby najbardziej sugestywny.

0
MarekR22 napisał(a):

@up: totalnie bezsensu, bo twoja hiperbola zakłada kierunek asymptot.
a_{11}x<sup>2+a_{12}xy+a_{22}y</sup>2+a_{13}x+a_{23}y+a_{33}=0

Danymi na wejściu są współrzędne punktów, z których większość leży na krzywej. Na wejściu jest ich ok 200-250. Losuję sobie 5 z nich, tworze dla nich model, a następnie sprawdzam, z jak dobrze dany model odpowiada reszcie punktów. I tak w kółko 100.000 razy. Zazwyczaj udaje mi się znaleźć model, który mniej więcej pasuje dla 75% punktów, czyli takiej ilości, jaka była poprawna na wejściu. Czyli to o co mi chodziło działa całkiem fajnie ;) Dzięki za pomoc :D

0

A w jaki sposób mierzysz dopasowanie danego punktu do danej hiperboli?

0

Sprawdzam, czy wartość bezwzględna modelu,
a_{11}x<sup>2+a_{12}xy+a_{22}y</sup>2+a_{13}x+a_{23}y+a_{33}=0
po wstawieniu współrzędnych punktu jest mniejsza od stałej modelerror, jaką sam sobie przyjąłem. Jeśli jest, uznaje punkt za pasujący do modelu, jeśli nie, to nie :)

0

Pytam, bo myślałem, że wymyśliłeś coś lepszego. Ten sposób jest trochę do d**y bo nie równo traktuje punkty w zależności od ich położenia (w porównaniu do zwykłej euklidejskiej odległości od hiperboli). Punkty bliżej początku układu współrzędnych będą się dopasowywać lepiej, te dalej - gorzej. Na dodatek ta zależność rośnie kwadratowo!

0
debris napisał(a):
MarekR22 napisał(a):

@up: totalnie bezsensu, bo twoja hiperbola zakłada kierunek asymptot.
a_{11}x<sup>2+a_{12}xy+a_{22}y</sup>2+a_{13}x+a_{23}y+a_{33}=0

Danymi na wejściu są współrzędne punktów, z których większość leży na krzywej. Na wejściu jest ich ok 200-250. Losuję sobie 5 z nich, tworze dla nich model, a następnie sprawdzam, z jak dobrze dany model odpowiada reszcie punktów. I tak w kółko 100.000 razy. Zazwyczaj udaje mi się znaleźć model, który mniej więcej pasuje dla 75% punktów, czyli takiej ilości, jaka była poprawna na wejściu. Czyli to o co mi chodziło działa całkiem fajnie ;) Dzięki za pomoc :D

Jeżeli wiesz, że przeważająca większość punktów spełnia mniej więcej równanie jakiejś paraboli, możesz losować więcej punktów, a ograniczyć liczbę iteracji. Sądzę, że już po około stu (a nie 100.000) powinieneś znaleźć coś dobrego. Na koniec ponownie wyznacz model za pomocą wszystkich punktów, które uznałeś za inliners.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.