Doing Automatic Differentiation

Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
1 replies · 2K views
m4r35n357
Messages
657
Reaction score
148
This is a brief interactive session using my ODE Playground, which is my repository of Automatic Differentiation code. It illustrates two solutions of ##\sqrt {2}## with the user-specified function provided via a lambda, using Newton's method and then bisection. Note that the user needs to provide no step sizes or other requirements or artifacts of numerical differencing, just the function itself!

Python:
$ ipython3
Python 3.7.1 (default, Oct 22 2018, 11:21:55)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from ad import *                                                      
ad module loaded

In [2]: from playground import *                                              
playground module loaded

In [3]: Newton(lambda x: (x**2), x0=1.0, target=2.0)                          
Out[3]: ResultType(count=7, sense='', mode='ROOT', x=1.414213562373095, f=2.0000000000000004, dx=-1.5700924586837747e-16)

In [4]: bisect(lambda x: (x**2), xa=1.4, xb=1.5, target=2.0)                  
Out[4]: ResultType(count=38, sense='', mode='ROOT', x=1.4142135623733338, f=2.0000000000006755, dx=7.276401703393276e-13)
Enjoy!
 
Last edited:
  • Like
Likes   Reactions: jedishrfu and Dale
on Phys.org
OK here's some dual numbers:

Code:
$ ipython3
Python 3.7.1 (default, Oct 22 2018, 11:21:55)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from ad import *                                                      
ad module loaded

In [2]: a = Dual.get(3.0)                                                      

In [3]: b = Dual.get(5.0)                                                      

In [4]: c = Dual.get(7.0, variable=True)                                      

In [5]: print(a)                                                              
3.0 0.0

In [6]: print(b)                                                              
5.0 0.0

In [7]: print(c)                                                              
7.0 1.0

In [8]: print(c**2 - a * c)                                                    
28.0 11.0