Todos vocês conhecem o método Newton para aproximar as raízes de uma função, não sabem? Meu objetivo nesta tarefa é apresentar um aspecto interessante desse algoritmo.
O algoritmo de Newton converge apenas para certos, mas acima de tudo, valores complexos de entrada. Se você imagina a convergência do método para todos os valores de entrada sobre o plano complexo, geralmente obtém um belo fractal como este:
Especificações
O objetivo desta tarefa é gerar esses fractais. Isso significa que você obtém um polinômio como entrada e precisa imprimir o fractal correspondente como uma imagem em um formato de sua escolha como saída.
Entrada
A entrada é uma lista separada por espaços em branco de números complexos. Eles são escritos para baixo no estilo <Real part><iImaginary part>
, como este número: 5.32i3.05
. Você pode supor que o número de entrada não tenha mais que 4 casas decimais e seja menor que 1000. O primeiro deles não deve ser zero. Por exemplo, isso pode ser uma entrada para o seu programa:
1 -2i7,5 23.0004i-3,8 i12 0 5,1233i0,1
Os números são interpretados como os coeficientes de um polinômio, começando com a maior potência. Durante o resto desta especificação, o polinómio de entrada é designado P . A entrada acima é igual a este polinômio:
f (x) = x 5 + (-2 + 7,5 i ) x 4 + (23.0004 - 3,8 i ) x 3 + 12 i x 2 + 5,1233 + 0,1 i
A entrada pode vir para você a partir do stdin, de um argumento passado para o programa ou de um prompt exibido no seu programa. Você pode supor que a entrada não contém caracteres de espaço em branco à esquerda ou à direita.
Renderização
Você deve renderizar o fractal da seguinte maneira:
- Escolha quantas cores as raízes de P mais uma cor extra para divergência
- Para cada número no plano visível, determine se o método converge e se sim para qual raiz. Pinte o ponto de acordo com o resultado.
- Não imprima réguas ou outras coisas sofisticadas
- Imprima um ponto preto nos pontos, que são as raízes dos polinômios para orientação. Você pode imprimir até quatro pixels ao redor de cada raiz.
- Encontre uma maneira de escolher o plano visível de maneira que todas as raízes sejam distinguíveis e se espalhem amplamente, se possível. Embora não seja necessário um posicionamento perfeito do quadro de saída, reservo-me o direito de recusar uma resposta que escolha o quadro de uma maneira inaceitável, por exemplo. sempre nas mesmas coordenadas, todas as raízes estão em um ponto, etc.
- A imagem de saída deve ter um tamanho de 1024 * 1024 pixels.
- O tempo de renderização é de 10 minutos no máximo
- Usar valores de ponto flutuante de precisão única é suficiente
Saída
A saída deve ser uma imagem gráfica rasterizada em um formato de arquivo de sua escolha, legível por software padrão para um sistema operacional da marca X. Se você deseja usar um formato raro, considere adicionar um link a um site onde é possível baixar um visualizador para ele.
Envie o arquivo para stdout. Se o seu idioma não suportar colocar algo em stdout ou se você achar esta opção menos conveniente, encontre outra maneira. De qualquer forma, deve ser possível salvar a imagem gerada.
Restrições
- Nenhuma biblioteca de processamento de imagem
- Nenhuma biblioteca de geração de fractal
- O código mais curto vence
Extensões
Se você gosta dessa tarefa, pode tentar colorir os pontos de acordo com a velocidade da convergência ou com outros critérios. Eu gostaria de ver alguns resultados interessantes.
Respostas:
Python,
827777 caracteresLocaliza limites de exibição (e raízes) localizando pontos de convergência para várias amostras aleatórias. Em seguida, ele desenha o gráfico calculando os pontos de convergência para cada ponto inicial e usando uma função hash para obter cores aleatórias para cada ponto de convergência. Olhe bem de perto e você poderá ver as raízes marcadas.
Aqui está o resultado do exemplo polinomial.
fonte
Java,
1093 1058 10991077 caracteresEntrada é argumentos de linha de comando - por exemplo, executar
java F 1 0 0 -1
. A saída é stdout no formato PPM (pixmap ASCII).A escala é escolhida usando o limite Fujiwara no valor absoluto das raízes complexas de um polinômio; Em seguida, multiplico o limite por 1,5. Eu ajusto o brilho pela taxa de convergência, para que as raízes estejam nas manchas mais brilhantes. Portanto, é lógico usar branco em vez de preto para marcar as localizações aproximadas das raízes (o que me custa 41 caracteres por algo que nem pode ser feito "corretamente". então algumas raízes saem sem rótulo; se eu rotular todos os pontos que convergem para 0,6 pixels de si mesmos, então algumas raízes sairão rotuladas com mais de um pixel; portanto, para cada raiz eu rotulo o primeiro ponto encontrado a convergir para dentro de 1 pixel de si mesmo )
Imagem para o exemplo polinomial (convertido em png com o GIMP):
fonte
x^6-9x^3+8
, cuidadosamente projetada, escolhendo as raízes e, em seguida, usando o Wolfram Alpha para simplificar o polinômio. Ok, eu trapaceie trocando as tonalidades depois no GIMP.Python, 633 bytes
Após aceleração e embelezamento (756 bytes)
O gráfico abaixo é para Newton Fractal da função log (z).
fonte
;
. Além disso, remova todos os espaços possíveis.matplotlib
aqui), então não há garantia de que ainda funcione.