How to avoid automatic xi symbols appearing with diff of chained functions

21 views
Skip to first unread message

Mathieu Lamarre

unread,
Aug 24, 2019, 8:13:56 PM8/24/19
to sympy
Simple example of multivariate chain rule:
print(Function('g')(Function('f')(x1,x2)).diff(x1))

Gives the expected:

diff1.PNG


Derivative(f(x1, x2), x1)*Derivative(g(f(x1, x2)), f(x1, x2))

Adding another function h:

print(Function('g')(Function('f')(x1,x2),Function('h')(x1,x2)).diff(x1))

Gives the expected answer but with extra _xi_1 and _xi_2 symbols: 

diff.PNG

Derivative(f(x1, x2), x1)*Subs(Derivative(g(_xi_1, h(x1, x2)), _xi_1), _xi_1, f(x1, x2)) + Derivative(h(x1, x2), x1)*Subs(Derivative(g(f(x1, x2), _xi_2), _xi_2), _xi_2, h(x1, x2))

This is annoying for subsequent substitutions, for instance to switch from the function notation to simple symbols. 
Also, for more complex equations, the numbering of the automatic xi symbols is hard to predict. 

Is there a way to change this behavior? i.e. do not get the Subs and _xi_%d above

Thanks

Oscar Benjamin

unread,
Aug 24, 2019, 8:20:13 PM8/24/19
to sympy
I would say that you should use doit but I just tried that and it crashed:

In [9]: e=Function('g')(Function('f')(x1,x2),Function('h')(x1,x2)).diff(x1)                                                       


In [10]: e                                                                                                                        

Out[10]: 

⎛ ∂              ⎞│        ⎛ ∂                       ⎞│                   ⎛ ∂                       ⎞│                 ⎛ ∂      

⎜───(f(ξ₁, x[2]))⎟│       ⋅⎜───(g(ξ₁, h(x[1], x[2])))⎟│                 + ⎜───(g(f(x[1], x[2]), ξ₂))⎟│                ⋅⎜───(h(ξ₁

⎝∂ξ₁             ⎠│ξ₁=x[1] ⎝∂ξ₁                      ⎠│ξ₁=f(x[1], x[2])   ⎝∂ξ₂                      ⎠│ξ₂=h(x[1], x[2]) ⎝∂ξ₁     


        ⎞│       

, x[2]))⎟│       

        ⎠│ξ₁=x[1]


In [11]: e.doit()                                                                                                                 

Fatal Python error: Cannot recover from stack overflow.


Thread 0x000070000994b000 (most recent call first):

  File "/Users/enojb/.local/lib/python3.5/threading.py", line 293 in wait

  File "/Users/enojb/.local/lib/python3.5/threading.py", line 549 in wait

  File "/Users/enojb/current/sympy/35venv/lib/python3.5/site-packages/IPython/core/history.py", line 829 in run

  File "/Users/enojb/current/sympy/35venv/lib/python3.5/site-packages/IPython/core/history.py", line 58 in needs_sqlite

  File "</Users/enojb/current/sympy/35venv/lib/python3.5/site-packages/decorator.py:decorator-gen-24>", line 2 in run

  File "/Users/enojb/.local/lib/python3.5/threading.py", line 914 in _bootstrap_inner

  File "/Users/enojb/.local/lib/python3.5/threading.py", line 882 in _bootstrap


Current thread 0x00007fffae5cf380 (most recent call first):

  File "/Users/enojb/current/sympy/sympy/sympy/core/symbol.py", line 284 in assumptions0

  File "/Users/enojb/current/sympy/sympy/sympy/core/symbol.py", line 274 in _hashable_content

  File "/Users/enojb/current/sympy/sympy/sympy/core/symbol.py", line 381 in _hashable_content

  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 133 in __eq__

  File "/Users/enojb/current/sympy/sympy/sympy/core/basic.py", line 343 in __eq__

  File "/Users/enojb/current/sympy/sympy/sympy/core/containers.py", line 97 in __eq__

  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 134 in __eq__

  File "/Users/enojb/current/sympy/sympy/sympy/core/cache.py", line 94 in wrapper

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 2291 in <listcomp>

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 2291 in _hashable_content

  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 109 in __hash__

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 2286 in __hash__

  File "/Users/enojb/current/sympy/sympy/sympy/core/cache.py", line 94 in wrapper

  File "/Users/enojb/current/sympy/sympy/sympy/core/expr.py", line 196 in __mul__

  File "/Users/enojb/current/sympy/sympy/sympy/core/decorators.py", line 129 in binary_op_wrapper

  File "/Users/enojb/current/sympy/sympy/sympy/core/decorators.py", line 91 in __sympifyit_wrapper

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 618 in _eval_derivative

  File "/Users/enojb/current/sympy/sympy/sympy/core/basic.py", line 1724 in _visit_eval_derivative_scalar

  File "/Users/enojb/current/sympy/sympy/sympy/core/basic.py", line 1719 in _accept_eval_derivative

  File "/Users/enojb/current/sympy/sympy/sympy/core/basic.py", line 1743 in _eval_derivative_n_times

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 1427 in __new__

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 1598 in doit

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 2242 in doit

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 1600 in doit

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 2242 in doit

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 1600 in doit

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 2242 in doit

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 1600 in doit

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 2242 in doit

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 1600 in doit

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 2242 in doit

...

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 2242 in doit

  File "/Users/enojb/current/sympy/sympy/sympy/core/function.py", line 1600 in doit

  ...

Abort trap: 6


--
You received this message because you are subscribed to the Google Groups "sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email to sympy+un...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/b8b84555-2132-430c-be51-b0c47d99e3bb%40googlegroups.com.

Mathieu Lamarre

unread,
Aug 25, 2019, 9:15:24 AM8/25/19
to sympy
doit() was the answer thanks! (Doesn't crash for me v1.4)
To unsubscribe from this group and stop receiving emails from it, send an email to sy...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages