[R] Derivative of a Function Expression
     (Ted Harding) 
    Ted.Harding at manchester.ac.uk
       
    Tue Sep  4 01:10:46 CEST 2007
    
    
  
On 03-Sep-07 21:45:40, Alberto Monteiro wrote:
> Rory Winston wrote:
>> 
>> I am currently (for pedagogical purposes) writing a simple numerical
>> analysis library in R. I have come unstuck when writing a simple
>> Newton-Raphson implementation, that looks like this:
>> 
>> f <- function(x) { 2*cos(x)^2 + 3*sin(x) +  0.5  }
>> 
>> root <- newton(f, tol=0.0001, N=20, a=1)
>> 
>> My issue is calculating the symbolic derivative of f() inside the 
>> newton() function. 
>>
> If it's pedagogical, maybe returning to basics could help.
> 
> What is f'(x)?
> 
> It's the limit of (f(x + h) - f(x)) / h when h tends to zero.
> 
> So, do it numerically: take a sufficiently small h and
> compute the limit. h must be small enough
> that h^2 f''(x) is much smaller than h f'(x), but big
> enough that f(x+h) is not f(x)
> 
> numerical.derivative <- function(f, x, h = 0.0001)
> {
>   # test something
>   (f(x + h) - f(x)) / h
> }
> 
> Ex:
> 
> numerical.derivative(cos, pi) = 5e-05 # should be -sin(pi) = 0
> numerical.derivative(sin, pi) = -1    # ok
> numerical.derivative(exp, 0) = 1.00005 # close enough
> numerical.derivative(sqrt, 0) = 100 # should be Inf
> 
> Alberto Monteiro
If you want to "go back to basics", it's worth noting that
for a function which has a derivative at x (which excludes
your sqrt(x) at x=0, despite the result you got above,
since only the 1-sided limit as h-->0+ exists):
   (f(x+h/2) - f(h-h/2))/h
is generally a far better approximation to f'(x) than is
   (f(x+h) - f(x))/h
since the term in   h^2 * f''(x)   in the expansion is
automatically eliminated! So the accuracy is O(h^2), not
O(h) as with yur definition.
num.deriv<-function(f,x,h=0.001){(f(x + h/2) - f(x-h/2))/h}
num.deriv(cos, pi)
## [1] 0
num.deriv(sin, pi)
[1] -1
but of course num.deriv(sqrt,0) won't work, since it requires
evaluation of sqrt(-h/2).
Hovever, other comparisons with your definition are possible:
numerical.derivative(sin,pi/3)-0.5
##[1] -4.33021e-05
num.deriv(sin,pi/3)-0.5
##[1] -2.083339e-08
Best wishes,
Ted.
--------------------------------------------------------------------
E-Mail: (Ted Harding) <Ted.Harding at manchester.ac.uk>
Fax-to-email: +44 (0)870 094 0861
Date: 04-Sep-07                                       Time: 00:10:42
------------------------------ XFMail ------------------------------
    
    
More information about the R-help
mailing list