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+ x22x2+ 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:
nd[{points_, values_}] :=
Transpose@{(Drop[points, 1] + Drop[points, -1])/2,
Differences[values]/Differences[points]}
subdivide1d[result_, resolution_, maxAngle_: 10] :=
Module[
{deriv, angle, dangle, pos, nf},
deriv = nd[result\[Transpose]];
angle = ArcTan[#2] & @@@ deriv;
dangle = Differences[angle];
pos = Flatten@Position[dangle, d_ /; Abs[d] > maxAngle/180 Pi];
pos = Union[pos, pos + 1];
nf = Nearest[result[[All, 1]]];
Select[deriv[[pos, 1]], Abs[# - First@nf[#]] > resolution &]
]