Estoy buscando algoritmos para dibujar gráficos 2D estándar para funciones que pueden tener o no singularidades. El propósito es escribir un "Mini-CAS", por lo que no tengo conocimiento a priori de los tipos de funciones que los usuarios quieren graficar.
Este problema es muy antiguo, así que imagino que debe haber algunos algoritmos estándar en la literatura. Por una vez, no tuve mucho éxito para encontrar referencias a través de Google.
Encontré un algoritmo interesante, a saber, este de "YACAS - Libro de algoritmos" llamado "Trazado de función adaptativa".
En resumen:
- ¿Hay algoritmos estándar?
- ¿Existe un conjunto de pruebas para las funciones conocidas difíciles de trazar?
- ¿Cuáles son los papeles interesantes para leer?
algorithms
visualization
soegaard
fuente
fuente
Respuestas:
He implementado la rutina de muestreo adaptativo de Mathematica aquí en GitHub (es un solo archivo C, vaya al árbol de origen para el archivo de encabezado). Encontré una descripción de la rutina en un gran libro sobre Mathematica hace mucho tiempo, y he estado usando variaciones en esta implementación desde hace algún tiempo. Básicamente realiza una muestra lineal aproximada sobre el dominio de interés, luego vuelve a refinar regiones de alta curvatura. Es posible que se pierdan algunas características muy definidas, pero en la práctica me parece extremadamente raro. Este archivo también contiene la versión paralela.
fuente
Exclusions -> None
ocultando la estructura de su función oPlot
definiéndola comof[x_?NumericQ] := ...
. Esto no es a lo que me refería cuando pregunté sobre los cambios. Creo que hubo algunos cambios en el algoritmo, ya que v5 y v6 se muestrearon en diferentes puntos. En este momento, no puedo probar en la v5 para comparar de nuevo.Saber cómo otros CAS hacen esto podría ayudarlo.
Comience con una cuadrícula de puntos regularmente espaciados en el dominio de trazado. (En Mathematica, hay un parámetro para controlar cuántos tomar, llamado
PlotPoints
).Si aún no hemos alcanzado el límite de iteración (establecido
MaxRecursion
en Mathematica), repita desde el paso 2.Algo de esto se discute en el libro Mathematica in Action de Stan Wagon, que puedes ver aquí en Google Books .
Implementé este algoritmo antes para tener un mejor control sobre cuántas veces se evaluó mi función costosa de calcular. Aquí está el código de Mathematica para el paso 2:
fuente
La página web de MathWorld en Gráficos de funciones contiene referencias a varios artículos que parecen ser relevantes en el trazado de funciones adaptativas. Citando la página:
Por otro lado, en Google me topé con un papel
www.cs.uic.edu/~wilkinson/Publications/plotfunc.pdf
eso explica cómo elegir correctamente el dominio y otras cosas. Espero que te sean útiles.
fuente
Encontré este tema y pensé que debería compartir la página de problemas del desarrollador para agregar esto a la biblioteca de Julia Plots.jl. Probamos un montón de técnicas para ver qué daría buenos resultados, comenzando por las notas sobre la implementación de Mathematica. Agregar un poco de poda, una pequeña perturbación para no comenzar exactamente en los puntos finales del intervalo, un límite de recursión y un estimador de error de doble malla fueron necesarios para "hacerlo bien". El hilo también lo señala al código fuente abierto para la implementación. Así que tomó un poco de ajuste, pero agregar esas características lo hizo bastante robusto (según las pruebas, como se muestra en el hilo).
fuente