text: Opened 10 years ago
  Closed 14 months ago
  #6344 closed enhancement (wontfix)
  Typesetting partial derivatives in new symbolics
  Description (last modified by )
  New symbolics uses "D" format for derivatives instead of old "diff" format.
  See the threads below for discussion on various related issues
  [1]
  [2]
  Some patches attached to #5711 also has code for this.
  Attachments (2)
  Change History (31)
  Changed 10 years ago by
  comment:1 Changed 10 years ago by
  - Description modified (diff)
  - Milestone set to sage-4.1
  - Summary changed from Typesetting partial derivatives in new Symbolics to [with patch, needs work] Typesetting partial derivatives in new Symbolics
  attachment:trac_6344-mma_style_attempt.patch implements an approximation to MMA style. It is just for testing, needs much more work for inclusion.
  It doesn't look good in text only mode:
  sage: f = function('f') sage: f(x).derivative(x,3) f^{(3)}(x)
  comment:2 Changed 10 years ago by
  - Cc jason mvngu added
  - Owner changed from (none) to burcin
  - Status changed from new to assigned
  - Summary changed from [with patch, needs work] Typesetting partial derivatives in new Symbolics to [with patch, needs review] Typesetting partial derivatives in new symbolics
  I uploaded a new patch at attachment:trac_6344-symbolic_derivative_print.patch.
  The new patch keeps the text mode printing similar to the old one, but changes the printed parameters to indicate how many times each argument is differentiated. E.g., old output:
  sage: var('x,y') sage: f = function('f') sage: f(x).derivative(x) D[0](f)(x) sage: f(x,x).derivative(x,2) D[0, 0](f)(x, x) + 2*D[0, 1](f)(x, x) + D[1, 1](f)(x, x)
  New output:
  sage: f(x).derivative(x) D[1](f)(x) sage: f(x,x).derivative(x,2) D[2, 0](f)(x, x) + 2*D[1, 1](f)(x, x) + D[0, 2](f)(x, x)
  New latex output:
  sage: latex(f(x).derivative(x)) f'\left(x\right) sage: latex(f(x,x).derivative(x,2)) f^{(2,0)}\left(x, x\right) + 2 \, f^{(1,1)}\left(x, x\right) + f^{(0,2)}\left(x, x\right)
  It would be better to add more documentation to explain the output, provide conversions to "textbook style" and fix other problems that pop up when printing derivatives:
  sage: binomial(x,y).derivative(x) <boom> sage: latex(floor(x).derivative(x)) D[0]\left \lfloor x \right \rfloor sage: latex(ceil(x).derivative(x)) D[0]\left \lceil x \right \rceil
  However, I think we should settle on an output style ASAP, without letting too many releases go by.
  Jason, Minh, can one (or both) of you review this?
  Changed 10 years ago by
  change printing of symbolic derivatives
  comment:3 Changed 10 years ago by
  - Status changed from needs_review to needs_work
  This needs a slight rebasing to be applied and tested to Sage 4.2, in calculus/tests.py and symbolic/pynac.pyx.
  comment:4 Changed 10 years ago by
  - Summary changed from [with patch, needs review] Typesetting partial derivatives in new symbolics to Typesetting partial derivatives in new symbolics
  comment:5 Changed 10 years ago by
  - Cc robertwb added
  comment:6 Changed 9 years ago by
  - Report Upstream set to N/A
  comment:7 Changed 6 years ago by
  - Milestone changed from sage-5.11 to sage-5.12
  comment:8 Changed 6 years ago by
  - Cc eviatarbach added
  comment:9 Changed 5 years ago by
  - Milestone changed from sage-6.1 to sage-6.2
  comment:10 Changed 5 years ago by
  comment:11 Changed 5 years ago by
  - Milestone changed from sage-6.2 to sage-6.3
  comment:12 Changed 5 years ago by
  - Milestone changed from sage-6.3 to sage-6.4
  comment:13 follow-up: ↓ 15 Changed 5 years ago by
  I tried to apply the most recent patch, but did not succeed. It is just too old and when looking at the diff I couldn't make any sense of it. I tried to implement differential notation myself, but got stuck, perhaps someone can help?
  All I wanted to do is to change the _latex_ representation of the FDerivativeOperator and added the following lines to src/sage/symbolic/operators.py:
  def _latex_(self): """ Return the LaTeX representation of X. EXAMPLES:: sage: from sage.symbolic.operators import FDerivativeOperator sage: var('x z') sage: f = function('f', x, z) sage: op = FDerivativeOperator(f, [0,1]); latex(op) \frac{\partial \frac{\partial f }{\partial x } }{\partial z } """ fname = self._f.operator() vars = self._f.operands() difvars = self._parameter_set str1 = str(fname) for difvar in difvars: str1 = '\\frac{\partial '+str1+'}{\partial '+str(vars[difvar])+'}' return str1
  Unfortunately, this does not have any effect on the latex representation of f.diff:
  sage: f = function('f', x, z) sage: g = diff(f, x,z) sage: latex(g) D[0, 1]\left(f\right)\left(x, z\right)
  Does anyone have an idea what else I need to modify? Thanks in advance!
  comment:14 Changed 5 years ago by
  - Cc schymans added
  comment:15 in reply to: ↑ 13 Changed 5 years ago by
  All I wanted to do is to change the _latex_ representation of the FDerivativeOperator and added the following lines to src/sage/symbolic/operators.py:
  Looks like the wrong place to hook into this. For symbolic expressions.
  self._latex_ invokes
  SR._latex_element_ which calls straight into Pynac via
  GEx_to_str_latex(&x._gobj). Your experiment shows that this doesn't dispatch to
  _latex_ methods on operators. Perhaps there's another hook?
  Incidentally, your code wouldn't work, because that's not how FDerivateOperators occur in code:
  sage: var("x,y") (x, y) sage: function('f',x,y) f(x, y) sage: g=diff(f(x,y),x,y) sage: g D[0, 1](f)(x, y) sage: g.operator() D[0, 1](f) sage: type(g.operator()) <class 'sage.symbolic.operators.FDerivativeOperator'> sage: g.operator()._f f
  As you can see, there are no variable names to refer to. That's why this ticket has stalled: if you want to do this, you need to recognize on the level of
  g that the operator is an
  FDerivativeOperator and hence that, if the operands of
  g are distinct, simple symbolic variables, that the derivative could be written in Leibnitz notation.
  Clearly, people haven't found the effort required worth the payoff.
  comment:16 follow-up: ↓ 17 Changed 5 years ago by
  Thanks for the quick answer! From the user's perspective, the best way would be to have an option similar to derivative_func in the function definition, allowing to define the notation for derivatives. The efforts required seems indeed amazingly high.
  Wouldn't it be possible to write some parsing code to convert something like D[0,1](f)(x,y) to any kind of notation? It should even be possible to convert it back to diff(f(x,y),x,y), as requested here:
  comment:17 in reply to: ↑ 16 Changed 5 years ago by
  Wouldn't it be possible to write some parsing code to convert something like D[0,1](f)(x,y) to any kind of notation? It should even be possible to convert it back to diff(f(x,y),x,y), as requested here:
  It's really much easier to do on the expression tree than on a string. We do it for conversions already. See e.g.. The approach is straightforward. The hard work is that you need to reach into Pynac to make the change. So it takes someone conversant with Pynac who cares enough to do it. Doing it on strings afterwards is going to be horrible.
  Incidentally, watch out that an expression like
  D[0,1](f)(x,x+1)
  is almost impossible to write in Leibnitz notation unless you introduce auxiliary variables (which is what happens in the maxima_lib code). So you should probably just stick with operator notation for those cases (maple does).
  comment:18 Changed 5 years ago by
  I see. Would it be easier to allow the user to define custom latex representations for just some standard differentials one anticipates when defining a function? For all others, the system could fall back to the D[0,1] (f)(x,z) notation. A simple replacement rule when latexing an expression could do?
  comment:19 Changed 5 years ago?
  If anyone should know, I should, but I don't. It would be wonderful to have some better documentation of that where it belongs - want to take a stab? If so, open a ticket and cc: me.
  comment:20 Changed 5 years ago by
  Thanks, this is now There, I mentioned some other, related tickets, which made me realise that I do not fully understand the meaning of the D-notation, so it wouldn't make much sense for me to write a documentation for it. Sorry!
  comment:21 Changed 5 years ago by
  Wow, after reading the threads in question I see that at this point Sage has existed about as long with this new format as it did with the previous one. I'm reluctant to make this wontfix, at least the option as indicated there
  psi(x) = function('psi',x) g = diff(psi(x),x) latex(g) \frac{d \psi\left(x\right)}{d x} # Switch to D format sage.symbolic.pynac.typeset_d_as_diff=False latex(g) D[0]\psi\left(x\right)
  should exist, except of course the other way around for the default nowadays, I guess. Maybe that piece of attachment:enhanced-symbolic-typesetting-rebased_to_4.0.1.patch:ticket:5711 should be implemented here instead?
  comment:22 Changed 5 years ago by
  +1 from me! I was very sad to find out that this had not been implemented.
  comment:23 follow-up: ↓ 24 Changed 5 years ago by
  - Cc pbruin nbruin added
  comment:24 in reply to: ↑ 23 Changed 5 years ago by
  Nils and/or Peter, would you have objections to the following, based on code from #5711 (if possible)?... sage.symbolic.pynac.typeset_d_as_diff=True latex(g) \frac{d \psi\left(x\right)}{d x}
  Only do that when the argument list consists only of distinct symbolic variables. Then you can even print "diff" for the normal rep. See links above for code that makes this distinction already. This is what Maple does too, by the way.
  comment:25 follow-up: ↓ 26 Changed 5 years ago by
  Oh, so that's where the
  t0 and friends come from. Funny thing... what if those variables are already taken? <ducks />
  comment:26 in reply to: ↑ 25 Changed 5 years ago by
  comment:27 Changed 16 months ago by
  - Milestone changed from sage-6.4 to sage-duplicate/invalid/wontfix
  - Status changed from needs_work to needs_review
  comment:28 Changed 15 months ago by
  - Status changed from needs_review to positive_review
  comment:29 Changed 14 months ago by
  - Resolution set to wontfix
  - Status changed from positive_review to closed
  closing positively reviewed duplicates
  an attempt at implementing the MMA style, for testing only