8 votos

Extraño fractal-en busca de la ilusión con $x,y,z \in [0,1]$ tal que $x+y+z=1$, lo que está mal?

Gracias a los comentarios, debe ser un avión, pero ¿por qué se parece un poco como un fractal? ¿Mi código de pasar por alto algo o algún error herramienta de representación? Yo Python y GNUplot.

enter image description here

Al parecer, una película de dibujos animados ilusión.

Y genera los puntos con Python y genera gráfico con GnuPlot como:

$ python copyPasteTheCodeToFile.py > .data
    $ gnuplot -e "set terminal png; set grid; splot '.data'"

El código de Python

import itertools

def main():
   density = 100.0
   mySet= [x/density for x in range(int(density))]
   points=""

   for (x,y,z) in [(x,y,z) for x,y,z in itertools.product(mySet, repeat=3) if x+y+z==1]:
      points = points + "%s\t%s\t%s\n"%(str(x),str(y),str(z))

   print points

main()

puede detectar una err? No puedo por lo tanto pensé) matemática err, B) algoritmic err o C) fuera de-fiesta/programa-err, no se puede decir realmente que uno.

[Actualización]

Es un punto flotante de error! El error es el condicional x+y+z==1. Desde que los ordenadores no evaluar flota como 1.0 + 1.0 a la 2.0 pero con algo un poco diferente, el condicional de falla con algunos puntos de derecho. La solución es:

$abs(x+y+z-1) < \epsilon$

donde el epsilon $\epsilon$ es muy pequeño número como 1e-10. Sigue abierta ¿por qué hay sólo los agujeros en la red. ¿Por qué no otros puntos? Y ¿por qué es vertical simétrica? Es así que con cada equipo? ¿El patrón variar entre los equipos? De todos modos todavía estoy investigando el por qué de este patrón específico con este condicional. Ahora sabemos por qué no son los patrones, pero no sabemos por qué estos patrones. Estoy ejecutando los comandos con mayor i86 comp.

4voto

Mike Puntos 1113

Sospecho que el error aquí viene a ser el uso de la aritmética de punto flotante (que tiene un lugar fascinante estructura matemática propia). Su código es iterar sobre todos los puntos de $(x, y, z)$, y en un preciso comparar de la suma a 1.0; pero, por ejemplo, bien puede ser el caso de que la tríada $(30.0/100.0, 30.0/100.0, 40.0/100.0)$ no será en su conjunto, simplemente porque el punto flotante de representaciones de .3 y .4 no son exactos y por lo que la suma de $.3 + .3 + .4$ sale, digamos, $1.00000001$. Mientras que no se puede hablar específicamente de la estructura fractal que estamos viendo, sospecho que es vagamente relacionado con la representación de la Sierpinski Gasket en términos del conjunto de todas las $(x, y)$$x$$y == 0$; véase la http://ecademy.agnesscott.edu/~lriddle/ifs/siertri/binary.htm para más detalles sobre esto. La forma más sencilla de solucionar esto sería iterar sobre todos los puntos de $(x, y)$ y definen $z$ en términos de$x$$y$$z=1.0-(x+y)$; esto también tiene la ventaja de acelerar la generación de un ciento por uno (eliminando el lazo sobre $z$). De forma más general (por ejemplo, en circunstancias en que no hay una relación explícita de la ecuación de $z$ en términos de$x$$y$), de punto flotante compara casi nunca deben ser exactos, y una prueba de $(1.0-\epsilon)\lt x+y+z \lt (1.0+\epsilon)$ (para algunos pequeños $\epsilon$) es una mejor apuesta.

EDITAR para responder a las nuevas partes de la pregunta, que llegó mientras yo estaba respondiendo a: en general, de punto flotante representaciones son propensos a ser el mismo a través de plataformas; el IEEE tiene una especificación estándar para los números de punto flotante y la aritmética uso de ellos, que la mayoría de las plataformas de apoyo. Hay casos de esquina donde plataformas específicas pueden diferir, pero es poco probable que se ejerce por simples adiciones como este.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X