Derivatives of numerical functions : how does mathematica work?

*To*: mathgroup at smc.vnet.net*Subject*: [mg61445] Derivatives of numerical functions : how does mathematica work?*From*: amitgandhi at gmail.com*Date*: Wed, 19 Oct 2005 02:16:44 -0400 (EDT)*Sender*: owner-wri-mathgroup at wolfram.com

I have stumbled upon a seemingly basic problem - but my inability to understand why I cannot get mathematica to work in the way I think it should makes me question how well I understand the foundtaions of mathematica. Essentially I have a functions f[x] which takes x, and forms a system of equations in the variables y1,...,yn where x appears as a parameter to the system, and it uses FindRoot to solve for y1,...,yn and then outputs the sum y1+...,yn. I know the solutions for y1,...,yn are "smooth" in the parameter x, and thus I was interested in finding the numerical derivative of y1+...+yn with respect to the parameter x. However I cannot get mathematica to implement this - I can illustrate the difficulty in a very basic setting (excuse the fact that I can do this "toy" problem analytically, because my real problem requires numerics). Suppose we have the equation equ=x+y For a particular value of x, I can solve the equation x+y=0 for y, which for x=2.0 I do in mathematica as follows: y /. FindRoot[x + y /. {x -> 2.0}, {y, 0}] which yields the obvious -2. Now I want to consider the above mathematica expression, which solves for the value of y for a given x, as an expression that is variable in x, and I wish to cconsider how the value of this expression varies with x, i.e., the numerical derivative with respect to x. My inutuition for mathematica suggests that I should write this as <<NumericalMath`NLimit` ND[y /. FindRoot[(x + y) /. {x -> c}, {y, 0}], c, 2.0] However the output from entering this expression is a number of error messages that read, the most important and telling one being that : "The function value {0. + c} is not a list of numbers with \ dimensions {1} at {y} = {0.`}." Why is this happening - doesn't ND try to replace c with a trial value in the expression in the first argument of ND before it tries evaluating the expression? However after the error messages finish, the ND command manages to produce the right answer, namely -1. ND is just an example of this phenomena - the same thing would have happened had I tried to use NLimit, FindMinumum, FindRoot, or a host of other mathematica functions with the expression I defined above. Can anyone explain how to get mathematica to work "error free" for a problem like this, and whether the numerical answer that mathematica produces should be trusted after producing a long list of errors. Thanks Amit