0

Why doesn't the following function take the inner h value that is defined in the function body and gives weird results (arbitrary h value)?

def diff(f): # def not define
       h = 0.001
       return (lambda x: (f(x+h) - f(x)) / h) 
def sin_by_million (x):
    return math.sin( 10 ** 6 *x)
>>> diff(sin_by_million) (0)
826.8795405320026

Instead of 1000000?

2
  • 3
    Because your h is much too large to have a correct approximation of the derivative in 0. Commented Jan 23, 2021 at 17:47
  • also your code is badly formatted (define doesn't exist, extra paren before lamba) Commented Jan 23, 2021 at 17:49

1 Answer 1

1

As per @ThierryLathuille comment, your step h is too big. In real life, you should adapt it based on the function and value at which you want the derivative.

Check out jax instead:

import jax
import jax.numpy as np

def sin_by_million(x):
    return np.sin(1e6 * x)

Then:

>>> g = jax.grad(sin_by_million)
... g(0.0)
DeviceArray(1000000., dtype=float32)

The beauty of jax is that it actually compiles your call tree using chain rule, and produces some code (the calls after the first one are much, much faster). It also works on multivariate functions and complex code (with some rules though). And it works wonderfully well & fast on GPUs.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.