Programar uma pontuação de falta de circularidade

15

Sua tarefa é programar uma função matemática s, que recebe um conjunto finito não vazio Ade pontos no plano 2D e gera uma pontuação de incircularidade s(A)que satisfaz as seguintes propriedades:

  1. Definição positiva : se houver um círculo ou uma linha reta que contenha todos os pontos de A, então s(A) = 0. De outra formas(A) > 0
  2. Surjectividade: É um adjetivo para os números reais não negativos, ou seja, para cada número real não negativo, rexiste um subconjunto finito Ado plano, de modo que s(A) = r.

  3. Invariância da tradução: s é invariável à tradução se s(A) = s(A + v)para cada vetor ve para todos A.

  4. Invariância da escala: s é invariável à escala, se for s(A) = s(A * t)para todos t≠0e para todos A.

  5. Continuidade. sé considerado contínuo se a função f(p) := s(A ∪ {p})(mapear o ponto a ppara um número real) for contínua usando o valor absoluto padrão nos números reais e a norma euclidiana padrão nos pontos do plano.

Intuitivamente, esse escore de falta de circularidade pode ser pensado como algo semelhante ao coeficiente de correlação na regressão linear.

Detalhes

Sua função na teoria precisa funcionar em reais, mas, para o objetivo desse desafio, você pode usar números de ponto flutuante como substituto. Forneça uma explicação do seu envio e um argumento sobre o motivo dessas cinco propriedades. Você pode usar duas listas de coordenadas ou uma lista de tuplas ou formatos semelhantes como entrada. Você pode assumir que nenhum ponto na entrada é repetido, ou seja, todos os pontos são únicos.

flawr
fonte
1
Você poderia adicionar alguns casos de teste?
Shaggy
O que significa que um círculo contém todos os pontos de A ?
H.PWiz
@ H.PWiz Considere um círculo como um subconjunto do plano 2d, o ponto a estará contido no círculo se for um elemento desse subconjunto.
flawr
@ Shaggy Não, isso não é possível, pois snão é único. A única coisa para a qual você pode fazer exemplos é do s(A) = 0que é trivial fazer usando a primeira propriedade.
flawr
Nosso programa pode errar com uma probabilidade teoricamente zero? (a probabilidade real é diferente de zero porque o número do ponto flutuante é discreto) / Você permite que a imprecisão do ponto flutuante seja ignorada? Meta relevante .
user202729

Respostas:

2

Python 2 com numpy, 116 bytes

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)

Pega x e y como vetores de coluna 2D e retorna uma matriz que contém a resposta. Observe que isso dará uma matriz vazia para uma linha perfeitamente reta ou com 3 ou menos pontos. Acho que o lstsq não fornece resíduos se houver um ajuste perfeito.

Explicação

Essencialmente, isso encontra o círculo de melhor ajuste e obtém os resíduos ao quadrado.

Queremos minimizar (x - x_center)^2 + (y - y_center)^2 - R^2. Parece desagradável e não-linear, mas podemos reescrever isso como x_center(-2x) + y_center(-2y) + stuff = x^2 + y^2, onde o stuffainda é desagradável e não-linear em termos de x_center, y_centere R, mas nós não precisa se preocupar com isso. Para que possamos resolver [-2x -2y 1][x_center, y_center, stuff]^T = [x^2 + y^2].

Poderíamos, então, recuar no R, se realmente quiséssemos, mas isso não nos ajuda muito aqui. Felizmente, a função lstsq pode nos fornecer os resíduos, o que satisfaz a maioria das condições. Subtrair o centro e dimensionar (R^2)^2 = R^4 ~ x^4nos fornece invariância translacional e de escala.

  1. Isso é definitivo positivo porque os resíduos ao quadrado não são negativos e estamos dividindo por um quadrado. Ele tende a 0 para círculos e linhas porque estamos ajustando um círculo.
  2. Tenho certeza de que não é adjetivo, mas não consigo entender bem. Se houver um limite superior, podemos mapear [0, vinculado) para os reais não negativos (por exemplo, com 1 / (resposta - resposta) - 1 / limite) por mais alguns bytes.
  3. Subtraímos o centro, por isso é translacionalmente invariável.
  4. Dividimos por x ** 4, o que remove a dependência da escala.
  5. É composto de funções contínuas, por isso é contínuo.

fonte
Você pode elaborar o que sua submissão está realmente computando?
flawr
@flawr Editou isso em. #
Eu tentei testar isso em {(1, 0), (2, 0), (3, 0), (4, t)} para t → 0, mas f(array([[1.0],[2.0],[3.0],[4.0]]),array([[0.0],[0.0],[0.0],[t]]))parece me dar array([ 0.00925926])para todos que não sejam zero t. (Eu sei que você disse que isso quebra para t = 0, mas o resultado deve pelo menos se aproximar de 0 para t → 0.) Estou chamando isso de errado?
Anders Kaseorg
2

Python, 124 bytes

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)])

Toma Uma como uma sequência de números complexos ( x + 1j*y), e resume Im ( R ) 2 /2 | r | para todos os cross-rácios complexos r de quatro pontos em um .

Propriedades

  1. Definitividade positiva. Todos os termos são não-negativos e todos são zero exatamente quando todas as relações cruzadas são reais, o que acontece quando os pontos são colineares ou concíclicos.

  2. Surjectividade. Como a soma pode ser arbitrariamente grande, adicionando muitos pontos, a subjetividade seguirá da continuidade.

  3. Invariância da tradução. A razão cruzada é invariável à tradução.

  4. Invariância da escala. A relação cruzada é invariável em escala. (De fato, é invariável em todas as transformações de Möbius.)

  5. Continuidade. A cruz-rácio é um mapa contínuo para o plano complexo estendido, e r ↦ Im ( R ) 2 /2 | r | (com ∞ ↦ 0) é um mapa contínuo do plano complexo estendido para os reais.

(Nota: Um mapa teoricamente mais bonito com as mesmas propriedades é r ↦ (Im ( r ) / ( C + | r | 2 )) 2 , cujas linhas de contorno nos quatro pontos da razão cruzada são circulares. uma medida de incircularidade, você provavelmente quer essa.)

Anders Kaseorg
fonte