Estou procurando algoritmos para desenhar gráficos 2D padrão para funções que podem ou não ter singularidades. O objetivo é escrever um "Mini-CAS", para que eu não tenha conhecimento a priori dos tipos de funções que os usuários desejam representar graficamente.
Esse problema é muito antigo, então imagino que deve haver alguns algoritmos padrão na literatura. Pela primeira vez, não tive muito sucesso em encontrar referências via Google.
Eu encontrei um algoritmo interessante, este do "YACAS - Livro de algoritmos" chamado "Gráfico de funções adaptativas".
Então, resumindo:
- Existem algoritmos padrão?
- Existe um conjunto de testes para funções conhecidas de difícil plotagem?
- Quais são os artigos interessantes para ler?
algorithms
visualization
soegaard
fonte
fonte
Respostas:
Eu implementei a rotina de amostragem adaptativa do Mathematica aqui no GitHub (é um único arquivo C, vá até a árvore de origem do arquivo de cabeçalho). Encontrei uma descrição da rotina em um grande livro sobre o Mathematica há muito tempo e uso variações dessa implementação há algum tempo. Basicamente, ele faz uma amostra linear aproximada sobre o domínio de interesse e depois refina regiões de alta curvatura. É possível que algumas características muito nítidas sejam perdidas, mas, na prática, acho isso extremamente raro. Este arquivo também contém a versão paralela.
fonte
Exclusions -> None
ou ocultando a estrutura de sua funçãoPlot
, definindo-a comof[x_?NumericQ] := ...
. Não é disso que eu estava me referindo quando perguntei sobre as mudanças. Eu acredito que houve algumas mudanças no algoritmo, como v5 e v6 amostradas em pontos diferentes. No momento, não posso testar na v5 para comparar novamente.Saber como outros CAS fazem isso pode ajudá-lo.
Que eu saiba, o Mathematica usa uma variação no seguinte algoritmo básico para plotar uma função de uma variável ou uma curva paramétrica (vou assumir para esta descrição).( x ( t ) , y ( t ) ) f ( x )f( X ) ( x ( t ) , y( t ) ) f( X )
Comece com uma grade de pontos regularmente espaçada no domínio de plotagem. Mat No Mathematica, há um parâmetro para controlar quantos levar, chamados
PlotPoints
.)Observe cada par de segmentos de linha sucessivos (definidos por três pontos sucessivos, ) e insira um novo ponto de amostragem no meio dos dois segmentos ( e ) se o ângulo for maior que um limite.x 1 + x 2( x1 1, f(x1 1) ) ,(x2,f(x2) ) ,(x3,f(x3) )) x1 1+ x22 x2+ x32
Se ainda não atingimos o limite de iteração (definido
MaxRecursion
no Mathematica), repita a partir da etapa 2.Parte disso é discutida no livro Mathematica in Action, de Stan Wagon, que você pode ver aqui no Google Livros .
Eu implementei esse algoritmo antes para ter um melhor controle sobre quantas vezes minha função cara de calcular foi avaliada. Aqui está o código do Mathematica para a etapa 2:
fonte
A página do MathWorld na Web em Function Graphs contém referências a vários artigos que parecem relevantes na plotagem de funções adaptativas. Citando a página:
Por outro lado, no Google me deparei com um artigo
www.cs.uic.edu/~wilkinson/Publications/plotfunc.pdf
que explica como escolher corretamente o domínio e outras coisas. Espero que sejam úteis para você.
fonte
Encontrei este tópico e achei que deveria compartilhar a página de problemas do desenvolvedor para adicioná-lo à biblioteca Julia Plots.jl. Tentamos várias técnicas para ver o que daria bons resultados, partindo das notas sobre a implementação do Mathematica. Adicionando alguma poda, uma pequena perturbação para não iniciar exatamente nos pontos finais do intervalo, um limite de recursão e um estimador de erro de malha dupla foram todos necessários para "acertar". O thread também indica o código-fonte aberto para a implementação. Por isso, foram necessários alguns ajustes, mas a adição desses recursos o tornou bastante robusto (de acordo com os testes, conforme mostrado no tópico).
fonte