[R] Derivative

David Winsemius dwinsemius at comcast.net
Thu Aug 12 07:56:18 CEST 2010


On Aug 12, 2010, at 12:49 AM, Dennis Murphy wrote:

> Hi:
>
> Try the following:
>
> f <- function(x) 5*cos(2*x)-2*x*sin(2*x)
> curve(f, -5, 5)
> abline(0, 0, lty = 'dotted')
>
> This shows rather clearly that your function has multiple roots,  
> which isn't
> surprising given that it's a linear combination of sines and  
> cosines. To
> find a specific root numerically, use function uniroot on f, as  
> follows:
>
>> uniroot(f, c(0, 2))

Except he was asking for the root of the derivative. If the classroom  
assignment allows use of R's limited symbolic differentiation you  
could try:

 > df.dx <- D(expression(5*cos(2*x)-2*x*sin(2*x)), "x")
 > df.dx
-(5 * (sin(2 * x) * 2) + (2 * sin(2 * x) + 2 * x * (cos(2 * x) *
     2)))
(Which as one of the examples in the deriv help page notes is not the  
most simple form.)

I was assuming that the OP wanted a solution to:

d( abs(f(x)) )/dt  = 0 in the domain [1,2]

So:
f.df.dx <- function (x) {
      eval(parse(text=D(expression(5*cos(2*x)-2*x*sin(2*x)), "x") ) )
                         }
#  no abs() but we should be satisfied with either a minimum or a  
maximum
uniroot(f.df.dx, c(1,2) )

$root
[1] 1.958218267

$f.root
[1] 1.138013788e-05

$iter
[1] 4

$estim.prec
[1] 6.103515625e-05

It doesn't agree with my earlier method and I think this one has a  
greater probablity of being correct. I don't think I needed to take  
second differences.

-- 
David.

> $root
> [1] 0.6569286
>
> $f.root
> [1] -0.0001196119
>
> $iter
> [1] 6
>
> $estim.prec
> [1] 6.103516e-05
>
> This catches the root that lies between x = 0 and x = 2. If you want  
> to find
> a set of roots, you can try a loop. Fortunately, since the function  
> is even,
> you really only need to find the roots on one side of zero, since  
> the ones
> on the other side are the same with opposite sign.
>
> lo <- seq(0, 4.5, by = 1.5)
> hi <-  seq(1.5, 6, by = 1.5)
> roots <- numeric(length(lo))
>
> for(i in seq_along(lo)) roots[i] <- uniroot(f, c(lo[i], hi[i]))$root
> roots
>
> See ?uniroot for other options and tolerance settings.
>
> HTH,
> Dennis
>
> On Wed, Aug 11, 2010 at 6:21 PM, TGS <cran.questions at gmail.com> wrote:
>
>> How would I numerically find the x value where the derivative of the
>> function below is zero?
>>
>> x <- seq(1,2, by = .01)
>> y <- 5*cos(2*x)-2*x*sin(2*x)
>> plot(x,abs(y), type = "l", ylab = "|y|")
>
-- 

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list