On Sun, Jun 8, 2008 at 3:56 PM, Rickard Armiento <[EMAIL PROTECTED]> wrote:
>
> Hi,
>
>> Examples:
>>
>> In [1]: f(x, y).diff(x)
>> Out [1]: D(f(_x, y), {_x: x})
>>
>> In [2]: f(x, x).diff(x)
>> Out [2]: D(f(_x, x), {_x: x})+D(f(x, _x), {_x: x})
>>
>> In [3]: f(3*x, 5*x).diff(x)
>> Out [3]: 3*D(f(_x, 5*x), {_x: x})+5*D(f(3*x, _x), {_x: x})
>
> I think this should be:
>
> In [3]: f(3*x, 5*x).diff(x)
> Out [3]: 3*D(f(_x, 5*x), {_x: 3*x})+5*D(f(3*x, _x), {_x: 5*x})
Indeed, thanks for the spot.
>
>> In [4]: f(x, x).diff(x).subs(x, 5)
>> Out [4]: D(f(_x, 5), {_x: 5})+D(f(5, _x), {_x: 5})
>>
>> In [5]: f(x, y).diff(x).diff(y)
>> Out [5]: D(f(_x, _y), {_x: x, _y:y})
>>
>> In [6]: f(g(x)).diff(x)
>> Out[6]: D(f(_x), {_x:g(x)}) * D(g(_x), {_x: x})
>>
>> In [7]: f(g(x)).diff(x).subs(x, 5)
>> Out[7]: D(f(_x), {_x:g(5)}) * D(g(_x), {_x: 5})
>
> I started looking a little bit at the sympy core for how to do this,
> but ran into some problems with the idea of using a dictionary like
> this. To handle multiple derivatives in analogy with your [5], one
> would need a new dummy variable for each new derivative of the same
> variable, like so:
>
> In [8]: f(x, y).diff(x).diff(x)
> In [8]: D(f(__x, _y), {__x: _x, _x:x})
This should be:
In [8]: f(x, y).diff(x).diff(x)
In [8]: D(f(__x, y), {__x: _x, _x:x})
right?
>
> Maybe the implementation becomes simpler if one only allow for one
> (optional) substitution-dictionary at the end of the Derivative? (I
> guess this could also be generalized to other functionality that may
> have similar issues, e.g. limits.)
>
> Repeating your examples with this notation would give:
>
> In [9]: f(x, y).diff(x)
> Out [9]: D(f(_x, y), _x, {_x: x})
>
> In [10]: f(x, x).diff(x)
> Out [10]: D(f(_x, x), _x, {_x: x})+D(f(x, _x), _x, {_x: x})
>
> In [11]: f(3*x, 5*x).diff(x)
> Out [11]: 3*D(f(_x, 5*x), _x, {_x: 3*x})+5*D(f(3*x, _y), _y, {_y:
> 5*x})
>
> In [12]: f(x, x).diff(x).subs(x, 5)
> Out [12]: D(f(_x, 5), _x, {_x: 5})+D(f(5, _y), _y, {_: 5})
>
> In [13]: f(x, y).diff(x).diff(y)
> Out [13]: D(f(_x, _y), _x, _y, {_x: x, _y:y})
>
> In [14]: f(g(x)).diff(x)
> Out[14]: D(f(_x), _x, {_x:g(x)}) * D(g(_x), _x, {_x: x})
>
> In [15]: f(g(x)).diff(x).subs(x, 5)
> Out[15]: D(f(_x), _x, {_x:g(5)}) * D(g(_x), _x, {_x: 5})
>
> And then,
>
> In [16]: f(x, y).diff(x).diff(x)
> Out[16]: D(f(_x, y), _x, _x, {_x:x})
>
> However, as you say, in a case like this it should be realized that
> the expression does not contain 'x' and thus the substitution can be
> simplified away. So, lets also list an example where this cannot be
> done:
>
> In [17]: f(x, x).diff(x).diff(x)
> Out[17]: D(f(_x, x), _x, _x, {_x:x}) + D(f(_x, _y), _x, _y,
> {_x:x,_y:x}) + D(f(_x, _y), _y, _x, {_x:x,_y:x}) + D(f(x, _y), _y, _y,
> {_y:x})
>
> If the automatic removal of the substitutions is aggressive, I guess
> it should even simplify to:
>
> In [18]: f(x, x).diff(x).diff(x)
> Out[18]: D(f(_x, x), _x, _x, {_x:x}) + D(f(x, _y), x, _y, {_y:x}) +
> D(f(x, _y), _y, x, {_y:x}) + D(f(x, _y), _y, _y, {_y:x})
>
> Does this seem better, or do you prefer the dictionary-derivative
> syntax?
Looks good. Note, that the "Out" lines are just how it is printed.
What you suggest (if I understand correctly) is to change how the
Derivative class would be constructed, e.g.:
In [1] Derivative(f(_x, y), _x, {_x, x})
Out[1] /not important/
instead of
In [1] Derivative(f(_x, y), {_x, x})
Out[1] /not important/
right? Yes, it makes sence, epecially to use
In [16]: f(x, y).diff(x).diff(x)
Out[16]: D(f(_x, y), _x, _x, {_x:x})
instead of:
In [8]: f(x, y).diff(x).diff(x)
In [8]: D(f(__x, y), {__x: _x, _x:x})
The .diff() simply calls Derivative, with the appropriate syntax, so
all that has to be done is to fix the Derivative class to handle all
the above cases correctly. After this is done, then one just fixes the
.diff(). So the above change is just how Derivative and .diff() are
implemented internally. To the user, what is important is how these
things are constructed (usually using the .diff()) and how things are
printed (we can play with printing later).
Ondrej
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sympy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/sympy?hl=en
-~----------~----~----~----~------~----~------~--~---