Ваша задача - запрограммировать математическую функцию s
, которая принимает непустой конечный набор A
точек в 2D-плоскости и выводит показатель округлости, s(A)
который удовлетворяет следующим свойствам:
- Положительная определенность : если есть круг или прямая, которая содержит все точки
A
, тоs(A) = 0
. В противном случаеs(A) > 0
Сюръективность: она сюръективна с неотрицательными действительными числами, что означает, что для каждого неотрицательного действительного числа
r
существует конечное подмножествоA
плоскости, такое чтоs(A) = r
.Инвариантность перевода:
s
инвариантнаs(A) = s(A + v)
к переводу, если для каждого вектораv
и для всехA
.Масштабная инвариантность:
s
масштабно инвариантна, еслиs(A) = s(A * t)
для всехt≠0
и для всехA
.Непрерывность.
s
называется непрерывной, если функцияf(p) := s(A ∪ {p})
(отображающая точкуp
в действительное число) является непрерывной, используя стандартное абсолютное значение для действительных чисел и стандартную евклидову норму в точках плоскости.
Интуитивно говоря, этот показатель некруглости можно представить как нечто похожее на коэффициент корреляции в линейной регрессии.
Детали
Ваша функция в теории должна работать в реальных значениях, но для этой задачи вы можете использовать числа с плавающей запятой в качестве замены. Пожалуйста, предоставьте объяснение вашего представления и аргумент, почему эти пять свойств имеют место. Вы можете взять два списка координат или список кортежей или аналогичных форматов в качестве входных данных. Вы можете предположить, что ни одна точка на входе не повторяется, т.е. все точки уникальны.
s
как не является уникальным. Единственное, к чему вы могли бы привести примеры, -s(A) = 0
это тривиально, используя первое свойство.Ответы:
Python 2 с NumPy, 116 байт
Принимает x и y в качестве двухмерных векторов столбцов и возвращает массив, содержащий ответ. Обратите внимание, что это даст пустой массив для идеально прямой линии или с 3 или менее точками. Я думаю, что lstsq не дает остатков, если есть идеальное соответствие.
объяснение
По сути, это находит круг наилучшего соответствия и получает квадрат остатков.
Мы хотим минимизировать
(x - x_center)^2 + (y - y_center)^2 - R^2
. Это выглядит противным и нелинейными, но мы можем переписать , что , какx_center(-2x) + y_center(-2y) + stuff = x^2 + y^2
, гдеstuff
до сих пор противно и нелинейно с точки зренияx_center
,y_center
иR
, но мы не должны заботиться о нем. Так что мы можем просто решить[-2x -2y 1][x_center, y_center, stuff]^T = [x^2 + y^2]
.Мы могли бы тогда отказаться от R, если бы мы действительно хотели, но это не сильно нам помогает здесь. К счастью, функция lstsq может дать нам невязки, которые удовлетворяют большинству условий. Вычитание центра и масштабирование
(R^2)^2 = R^4 ~ x^4
дает нам поступательную и масштабную инвариантность.источник
f(array([[1.0],[2.0],[3.0],[4.0]]),array([[0.0],[0.0],[0.0],[t]]))
похоже, дает мнеarray([ 0.00925926])
все ненулевые значенияt
. (Я знаю, что вы сказали, что это разрывы при t = 0, но результат должен как минимум приблизиться к 0 при t → 0.) Я неправильно это называю?Python, 124 байта
Принимает А как последовательность комплексных чисел (
x + 1j*y
), и суммирует Im ( г ) 2 /2 | г | для всех сложных перекрестных соотношений г из четырех точек А , .свойства
Положительная определенность. Все слагаемые неотрицательны, и все они равны нулю именно тогда, когда все перекрестные отношения являются действительными, что происходит, когда точки коллинеарны или являются циклическими.
Сюръективность. Так как сумма может быть сделана сколь угодно большой, добавив много точек, сюрприз будет следовать из непрерывности.
Инвариантность перевода. Соотношение является трансляционно-инвариантным.
Шкала инвариантности. Соотношение является масштабно-инвариантным. (На самом деле, он инвариантен относительно всех преобразований Мёбиуса.)
Непрерывность. Двойное отношение является непрерывное отображение на расширенной комплексной плоскости, а г ↦ Im ( г ) 2 /2 | г | (с ∞ ↦ 0) - непрерывное отображение от расширенной комплексной плоскости до вещественных чисел.
(Примечание: теоретически более симпатичная карта с теми же свойствами имеет вид r ↦ (Im ( r ) / ( C + | r | 2 )) 2 , контурные линии которого по всем четырем точкам перекрестного отношения являются круглыми. Если вам действительно нужно мера округлости, вы, вероятно, хотите это.)
источник