Le samedi 1 août 2020 10:06:47 UTC+2, Emmanuel Charpentier a écrit : > > Consider : > > sage: f=function("f") > sage: m=var("m", domain="integer") > sage: assume(m>0) > > Sage follows the Maxima convention for multiple derivation d^n/dx^n f(x) > is diff(f(x),x,n) : > > sage: diff(sin(x),x,3) > -cos(x) # Okay.... > sage: diff(sin(x),x,m) > 0 *## Huh ???* > sage: diff(f(x),x,3) > diff(f(x), x, x, x) # Okay, sort of > sage: diff(f(x),x,m) > 0 *## Huh ???* > > Note that Sage will silently return a mathematically false result when the > degree of derivation is symbolic. > > The problem doesn't seem to reside i Maxima, which returns results > consistent to its convention : > > sage: %maxima diff(sin(x),x,3) > -cos(x) > sage: %maxima diff(sin(x),x,m) > 'diff(sin(x),x,m) > sage: %maxima diff(f(x),x,3) > 'diff(f(x),x,3) > sage: %maxima diff(f(x),x,m) > 'diff(f(x),x,m) > > The problem is similar to the one seen in sympy *when incorrectly called > :* > > sage: import sympy > sage: sympy.diff(*[sympy.sympify(u) for u in [sin(x),x,3]]) > -cos(x) > sage: sympy.diff(*[sympy.sympify(u) for u in [sin(x),x,m]]) > 0 # Huh again... > sage: sympy.diff(*[sympy.sympify(u) for u in [sin(x),[x,m]]]) > Derivative(sin(x), (x, m)) # Unfulfilling but correct... > sage: sympy.diff(*[sympy.sympify(u) for u in [f(x),[x,m]]]) > Derivative(f(x), (x, m)) # Unfulfilling but correct... > > Note that sympy's alternative convention for multiple derivation gives > consistent results : > > sage: sympy.diff(*[sympy.sympify(u) for u in [sin(x),[x,m]]]).subs([(m, > 3)]) > Derivative(sin(x), (x, 3)) > sage: sympy.diff(*[sympy.sympify(u) for u in [sin(x),[x,m]]]).subs([(m, > 3)]).doit > ....: () > -cos(x) > sage: sympy.diff(*[sympy.sympify(u) for u in [f(x),[x,m]]]).subs([(m, 3)]) > Derivative(f(x), (x, 3)) > sage: sympy.diff(*[sympy.sympify(u) for u in [f(x),[x,m]]]).subs([(m, > 3)]).doit() > ....: > Derivative(f(x), (x, 3)) > > Sage doesn't accept Sympy's convention for multiple derivation : > > sage: diff(f(x), (x,3)) > --------------------------------------------------------------------------- > [ Snip ... ] > > TypeError: no canonical coercion from <class 'tuple'> to Symbolic Ring > > Therefore, Sage seems to interpret diff(<expression>, <variable>, > <numerical value>) as d/d<variable> <expression> and diff(<expression>, > <variable1>, <variable2>) as d/d<variable1> d/d<variable2> <expression>, > with no way to express d^<variable2>/d<variable1)^<variable2> <expression>. > > This is, IMNSHO, a serious mess. Which, as demonstrated above, *can silently > return > mathematically false results*. > > The problem is that I cannot see a way to fix this that doesn't break > backwards compatibility somehow. > > Help about the way to efficiently file a (probably critical) ticket > against this horror most welcome... > > PS : One can note that Mathematica expresses its result in the symbolic > case in a peculiar way : > > sage: mathematica.D(f(x),[x,m]) > Derivative[m][F][x] > > One can also note that it may handle some special cases in a smarter way > than Sage/Maxima/Sympy : > > sage: mathematica.D(sin(x),[x,m]) > Sin[(m*Pi)/2 + x] > > but this is another story... > >
-- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sage-devel/8c830ee3-f850-47d2-af7d-a07c12a603f1o%40googlegroups.com.