Zaprogramuj wynik nieokrągłości

15

Twoim zadaniem jest zaprogramowanie funkcji matematycznej s, która pobiera niepusty zbiór skończony Apunktów na płaszczyźnie 2D i generuje wynik nieokrągłości, s(A)który spełnia następujące właściwości:

  1. Pozytywna definitywność : jeśli istnieje okrąg lub linia prosta, która zawiera wszystkie punkty A, to s(A) = 0. Inaczejs(A) > 0
  2. Surowotność: Jest przejmująca względem nieujemnych liczb rzeczywistych, co oznacza, że ​​dla każdej nieujemnej liczby rzeczywistej ristnieje skończony podzbiór Apłaszczyzny, taki, że s(A) = r.

  3. Niezmienność tłumaczenia: s jest niezmienna s(A) = s(A + v)dla każdego wektora vi dla wszystkich A.

  4. Niezmienność s skali: niezmiennik skali, jeśli s(A) = s(A * t)dla wszystkich t≠0i dla wszystkich A.

  5. Ciągłość. suważa się za ciągły, jeśli funkcja f(p) := s(A ∪ {p})(odwzorowanie punktu pna liczbę rzeczywistą) jest ciągła przy użyciu standardowej wartości bezwzględnej liczb rzeczywistych i standardowej normy euklidesowej w punktach płaszczyzny.

Intuicyjnie mówiąc, ten wynik nieokrągłości można uznać za coś podobnego do współczynnika korelacji w regresji liniowej.

Detale

Twoja funkcja teoretycznie musi działać w rzeczywistości, ale dla celów tego wyzwania możesz użyć liczb zmiennoprzecinkowych jako zamiennika. Podaj wyjaśnienie swojego zgłoszenia i argument, dlaczego te pięć nieruchomości ma zastosowanie. Jako dane wejściowe możesz wziąć dwie listy współrzędnych lub listę krotek lub podobnych formatów. Możesz założyć, że żaden punkt na wejściu nie jest powtarzany, tzn. Wszystkie punkty są unikalne.

wada
źródło
1
Czy możesz dodać kilka przypadków testowych?
Kudłaty
Co to znaczy, że okrąg zawiera wszystkie punkty A ?
H.PWiz
@ H.PWiz Rozważ okrąg jako podzbiór płaszczyzny 2d, punkt jest zawarty w okręgu, jeśli jest to element tego podzbioru.
flawr
@Shaggy Nie, że nie jest to możliwe, ponieważ snie jest unikalne. Jedyną rzeczą, dla której możesz podać przykłady, s(A) = 0jest trywialne przy użyciu pierwszej właściwości.
flawr
Czy nasz program może teoretycznie zerować prawdopodobieństwo? (rzeczywiste prawdopodobieństwo jest niezerowe, ponieważ liczba zmiennoprzecinkowa jest dyskretna) / Czy zezwalasz na ignorowanie niedokładności zmiennoprzecinkowej? Odpowiednie meta .
user202729,

Odpowiedzi:

2

Python 2 z numpy, 116 bajtów

from numpy import*
def f(x,y):a=linalg.lstsq(hstack((x,y,ones_like(x))),(x*x+y*y)/2);return a[1]/sum((x-a[0][0])**4)

Pobiera xiy jako wektory kolumnowe 2d i zwraca tablicę zawierającą odpowiedź. Zauważ, że da to pustą tablicę dla idealnie prostej linii lub z 3 lub mniej punktami. Myślę, że lstsq nie pozostawia resztek, jeśli istnieje idealne dopasowanie.

Wyjaśnienie

Zasadniczo znajduje to koło najlepszego dopasowania i otrzymuje kwadratowe resztki.

Chcemy zminimalizować (x - x_center)^2 + (y - y_center)^2 - R^2. Wygląda to paskudne i nieliniowa, ale możemy przepisać że jak x_center(-2x) + y_center(-2y) + stuff = x^2 + y^2, gdzie stuffnadal jest brzydki i nieliniowe w warunkach x_center, y_centeri R, ale nie musimy się martwić o to. Więc możemy po prostu rozwiązać [-2x -2y 1][x_center, y_center, stuff]^T = [x^2 + y^2].

Moglibyśmy wtedy wycofać R, gdybyśmy naprawdę tego chcieli, ale to niewiele nam tu pomaga. Na szczęście funkcja lstsq może dać nam resztki, które spełniają większość warunków. Odejmowanie środka i skalowanie przez (R^2)^2 = R^4 ~ x^4daje nam niezmienność translacyjną i skalowaną.

  1. Jest to pozytywnie określone, ponieważ kwadratowe reszty są nieujemne, a my dzielimy przez kwadrat. Skręca w kierunku 0 dla okręgów i linii, ponieważ dopasowujemy okrąg.
  2. Jestem całkiem pewien, że to nie jest przejmujące, ale nie mogę się z tym pogodzić. Jeśli istnieje górna granica, możemy odwzorować [0, powiązane) na nieujemne liczby rzeczywiste (na przykład z 1 / (granica - odpowiedź) - 1 / granica) na kilka dodatkowych bajtów.
  3. Odejmujemy środek, więc jest translacyjnie niezmienny.
  4. Dzielimy przez x ** 4, co usuwa zależność skali.
  5. Składa się z funkcji ciągłych, więc jest ciągły.

źródło
Czy potrafisz wyjaśnić, co właściwie przedstawia twoja praca?
flawr
@flawr Edytowano to w.
Próbowałem to przetestować na {(1, 0), (2, 0), (3, 0), (4, t)} dla t → 0, ale f(array([[1.0],[2.0],[3.0],[4.0]]),array([[0.0],[0.0],[0.0],[t]]))wydaje się, że daje mi to array([ 0.00925926])niezerowe t. (Wiem, że powiedziałeś, że to łamie się dla t = 0, ale wynik powinien przynajmniej zbliżyć się do 0 dla t → 0.) Czy nazywam to źle?
Anders Kaseorg
2

Python, 124 bajty

lambda A:sum(r.imag**2/2**abs(r)for a in A for b in A for c in A for d in A if a!=d!=b!=c for r in[(a-c)*(b-d)/(a-d)/(b-c)])

Staje A w postaci sekwencji liczb złożonych ( x + 1j*y) i sumuje Im ( R ) 2 /2 | r | wszystkich złożonych wzajemnych stosunkach r czterech punktach A .

Nieruchomości

  1. Pozytywna definitywność. Wszystkie warunki są nieujemne i wszystkie są zerowe dokładnie wtedy, gdy wszystkie stosunki krzyżowe są rzeczywiste, co dzieje się, gdy punkty są współliniowe lub zbieżne.

  2. Surowość Ponieważ suma może być dowolnie duża przez dodanie wielu punktów, surowość będzie wynikać z ciągłości.

  3. Niezmienność tłumaczenia. Współczynnik krzyżowy jest niezmienny dla tłumaczenia.

  4. Skala niezmienniczości. Współczynnik krzyżowy jest niezmienny w skali. (W rzeczywistości jest niezmienny we wszystkich transformacjach Möbiusa.)

  5. Ciągłość. Przekrój stosunek ciągła mapę do rozszerzonej płaszczyzny zespolonej, a R ↦ Im ( R ) 2 /2 | r | (z ∞ ↦ 0) jest ciągłą mapą od rozszerzonej złożonej płaszczyzny do rzeczywistych.

(Uwaga: Teoretycznie ładniejsza mapa o tych samych właściwościach to r ↦ (Im ( r ) / ( C + | r | 2 )) 2 , której linie konturowe wrt wszystkie cztery punkty stosunku poprzecznego są okrągłe. Jeśli naprawdę potrzebujesz środek nieokrągłości, prawdopodobnie tego chcesz.)

Anders Kaseorg
źródło