On Sun, Oct 16, 2016 at 4:59 AM, Riccardo Rossi <[email protected]> wrote:
> Dear Aaron,
>
> first of all thank you for answering.
>
> before i start subclassing, let me ask if i can do something easier: can i
> use "subs"?
>
> right now i am failing, but there might be some obvious error in what i
> do...
>
> in any case i also tried (and failed) with your suggestion, surely due to my
> lack of understanding of the sympy internals.
> here goes my code
>
> regards
> Riccardo
>
> from sympy import *
>
> u = symbols('u')
> der = symbols('der')
> e = Function('e')(u)
> s = Function('s')(e)
>
> print(s)
>
> Derivative(e,u)
>
> print(diff(e,u))
> print(diff(s,e))
> print(diff(s,u)) #here i would like "der" to be replaced within the chain
> rule

The chain rule is used. The output is

Derivative(e(u), u)*Subs(Derivative(s(_xi_1), _xi_1), (_xi_1,), (e(u),))

You can also call doit on this to get

Derivative(e(u), u)*Derivative(s(e(u)), e(u))

Your issue below is that there are two different ways of representing
ds/de, using subs and the direct way. The direct way is only returned
when using doit.  Honestly it would be simpler if diff always returned
a Derivative instance when it could. I opened
https://github.com/sympy/sympy/issues/11737 for this.

Aaron Meurer

>
> #list of replacements i would like to happen
> aaa = { Derivative(e,u):symbols('DeDu'), Derivative(s,e):symbols('DsDe') }
>
> print(diff(s,u).subs(aaa)) #here Derivative(s,e) is not substituted, i would
> like to get "se*eu" as a result
>
> #the reason for the failure to substitute is here ... how can i do this
> correctly?
> for iter in diff(s,u).atoms(Derivative):
>     print("iter = ",iter)
>     print(iter == Derivative(s,e))
>     if iter in aaa:
>         print ("found")
>     else:
>         print("not found")
>
>
>
>
>
> #####################################################
> ### TRYING THE SUGGESTION
> #####################################################
> class FunctionWithDerivative(Function):
>     def __init__(self, x, D):
>         super(FunctionWithDerivative, self).__init__()
>         self.x = x #this would be the var the function depends on f(x)
>         self.D = D #this would be the output i wish for
> Derivative(FunctionWithDerivative(x,D),x)
>
>     def fdiff(self, argindex=1):
>         """
>         Return the first derivative of this function.
>         """
>         print("**************",self.args) -------- NOT BEING CALLED!!!!!
>
>         if len(self.args) == 1:
>             if(self.args[0] == self.x):
>                 return self.D
>             else:
>                 return 0
>         else:
>             raise ArgumentIndexError(self, argindex)
>
>
> u = symbols('u')
> e = Function('e')(u)
> s = FunctionWithDerivative(symbols('e'), symbols('DsDe') )
>
> print(s)
>
> Derivative(e,u)
>
> print(diff(e,u))
> print(diff(s,e))
> print(diff(s,u)) #here i would like "der" to be replaced within the chain
> rule
>
>
>
>
>
> On Friday, October 14, 2016 at 5:27:21 PM UTC+2, Aaron Meurer wrote:
>>
>> If you want to define advanced things you need to subclass from
>> Function rather than using symbols(cls=Function). For derivatives, you
>> should define fdiff, which should return the derivative of the
>> function without consideration of the chain rule. For example, search
>> for "fdiff" in this file to see some examples for exp, log, and
>> LambertW
>> https://github.com/sympy/sympy/blob/master/sympy/functions/elementary/exponential.py.
>>
>> Aaron Meurer
>>
>> On Fri, Oct 14, 2016 at 4:53 AM, Riccardo Rossi <[email protected]> wrote:
>> > Dear List,
>> >
>> > i am writing since i would like to define the output of the derivative
>> > of a
>> > function, and i don't have a clue of how to achieve it
>> >
>> > to explain what i wish to do, let's consider the following script
>> >
>> > from sympy import *
>> >
>> > u = symbols('u')
>> > der = symbols('der')
>> > e = symbols('e', cls=Function)(u)
>> > s = symbols('s', cls=Function)(e)
>> > Derivative(e,u) = der #essentially i would like to teach to sympy to use
>> > a
>> > symbol for the Derivative
>> > ---> but here i get "SyntaxError: can't assign to function call"
>> >
>> > print(diff(e,u))
>> > print(diff(s,e))
>> > print(diff(s,u)) #here i would like "der" to be replaced within the
>> > chain
>> > rule
>> >
>> > any suggestion would be very welcome...
>> >
>> > regards
>> > Riccardo
>> >
>> >
>> > --
>> > 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 [email protected].
>> > To post to this group, send email to [email protected].
>> > Visit this group at https://groups.google.com/group/sympy.
>> > To view this discussion on the web visit
>> >
>> > https://groups.google.com/d/msgid/sympy/a4511ef2-2a10-4dbe-b6a0-01fe2fc47a05%40googlegroups.com.
>> > For more options, visit https://groups.google.com/d/optout.
>
> --
> 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 [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/sympy.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/sympy/939b99f4-b75e-4f76-992e-28a92015e926%40googlegroups.com.
>
> For more options, visit https://groups.google.com/d/optout.

-- 
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sympy.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/CAKgW%3D6JohftYh0PCvWoc7ijqSCmzes4i8hwtN-8zDzs%3Db%2BxErA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to