Gráficos de funções e suas derivadas

April 6, 2011
By

This post was kindly contributed by Ridículas - go there to comment and to read the full post.

Nessa dica vou apresentar o CMR (código mínimo reproduzível) para fazer gráfico de funções, obter derivadas simbólicas de funções, adicionar o gráfico das derivadas das funções com escala no eixo das abcissas da direita com as expressões na legenda do gráfico (ver figura abaixo).

Gráfico da função e sua primeira derivada.

 

A curve() é a função do R que faz gráficos no plano cartesiano de função paramétrica de uma variável. Diversas opções estão disponíveis para essa função, como os tipos de linhas, cores e demais parâmetros gráficos.

A D() é a função do R que retorna a expressão das derivadas (simbólicas) de uma função. O resultado desta e um objeto de classe language. Essa função funciona de maneira recursiva como você pode observar ao obter a derivada de segunda ordem. Infelizmente, o resultado da derivação não é simplificado matematicamente.

A sobreposição de gráficos é feita nas linhas [16,25,29] e a adição de uma escala para o eixo das abcissas foi colocada no lado direito do gráfico com o comando das linhas [18,28].

A função do.call() foi usada para tornar o procedimento mais automático no sentido de que com um objeto especificando a função obteremos todos os mesmos resultados. Saber automatizar os processos é importante quando tem que e avaliar diversas funções. Imagina ficar dando copia e cola o tempo todo? Vamos deixar isso para pessoas que usam programas (em geral pagos) que não oferecem os recursos que temos com o R. Tempo é dinheiro!

Com a função uniroot() obtemos as raízes da nossa função e representamos no gráfico com uma reta vertical.

Finalmente, confeccionamos uma figura para a publicação com rótulos em todos os eixos e legenda dentro do gráfico com a expressão de cada função.

#-----------------------------------------------------------------------------
# gráfico da função, um polinômio de ordem 3 com limites em x de -10 a 10

curve(1+1/2*x+1/3*x^2+1/4*x^3, -10, 10)

#-----------------------------------------------------------------------------
# derivada de primeira e segunda order dessa expressão com relação à x

D(expression(1+1/2*x+1/3*x^2+1/4*x^3), "x")
D(D(expression(1+1/2*x+1/3*x^2+1/4*x^3), "x") ,"x")

#-----------------------------------------------------------------------------
# sobre posição do gráfico da derivada primeira adicionando um novo eixo y

curve(1+1/2*x+1/3*x^2+1/4*x^3, -10, 10)
par(new=TRUE)
curve(1/2+1/3*(2*x)+1/4*(3*x^2), -10, 10, xlab="", ylab="", col=2, axes=FALSE)
axis(4, col=2)

#-----------------------------------------------------------------------------
# procedimento mais automático, atribuindo a expressão a um objeto

expr <- expression(1+1/2*x+1/3*x^2+1/4*x^3)
do.call(curve, list(parse(text=as.character(expr)), -10, 10, ylab=expr))
par(new=TRUE)
do.call(curve, list(D(expr, "x"), -10, 10,
                    xlab="", ylab="", col=2, axes=FALSE))
axis(4, col=2)
par(new=TRUE)
do.call(curve, list(D(D(expr, "x"), "x"), -10, 10,
                    xlab="", ylab="", col=3, axes=FALSE))

#-----------------------------------------------------------------------------
# adicionando a linha da raízes do polinômio

ro <- uniroot(function(x) 1+1/2*x+1/3*x^2+1/4*x^3, c(-10, 10))
str(ro)

curve(1+1/2*x+1/3*x^2+1/4*x^3, -10, 10)
abline(v=ro$root, col=1, h=0, lty=3)

#-----------------------------------------------------------------------------
# confeccionando uma figura para publicação, para salvar descomente

#png("f002.png", w=500, h=300);
par(mar=c(5.1,4.1,2.1,4.1))
expr <- expression(1+1/2*x+1/3*x^2+1/4*x^3)
do.call(curve, list(parse(text=as.character(expr)), -10, 10,
                    ylab=expression(f(x))))
par(new=TRUE)
do.call(curve, list(D(expr, "x"), -10, 10,
                    xlab="", ylab="", lty=2, axes=FALSE))
axis(4)
mtext(side=4, line=3, text=expression(df(x)/dx))
legend("topleft", bty="n", lty=1:2,
       legend=c(paste(expression(f(x)), "=", expr),
         paste(expression(df(x)/dx), "=", capture.output(D(expr, "x")))))
#dev.off()

#-----------------------------------------------------------------------------

Veja a documentação dessas funções para um melhor aproveitamento. Deixe suas sugestões/dúvidas nos comentários. Até a próxima Ridícula!


Tags: , , , , , , , ,

Comments are closed.