Opened 9 years ago

# symbolic derivatives should be able to have non-variable arguments

Reported by: Owned by: casamayou burcin minor sage-6.4 calculus simplify, maxima, symbolic derivative kcrisman, zimmerma N/A

### Description

Here is an example from the french sagebook to compute the laplacian in polar, that no longer works with version 4.6 of Sage

```sage: x, y, r, t = var('x, y, r, t'); f = function('f', x, y)
sage: F = f(x = r*cos(t), y = r*sin(t))
sage: d = (diff(F,r,2) + diff(F,t,2)/r**2 + diff(F,r)/r)
sage: d.simplify_full()
---------------------------------------------------------------
NotImplementedError           Traceback (most recent call last)

NotImplementedError: arguments must be distinct variables
```

With older versions, you got it :

```sage: d.simplify_full()
D[0, 0](f)(r, t) + D[1, 1](f)(r, t)
```

### comment:1 Changed 9 years ago by kcrisman

• Keywords simplify maxima symbolic derivative added; simplify_full removed
• Summary changed from regression to symbolic derivatives should be able to have non-variable arguments

I don't know that this is necessarily a regression so much as having made some choices about what is 'allowed' to be a symbolic derivative. We don't allow (for reasons that are unclear to me, because I still don't understand why we changed how we represent symbolic derivatives) arguments that are not just variables, unlike here where they are expressions.

It's the conversion to Maxima that is failing, by the way.

```sage: d.simplify()
---------------------------------------------------------------
NotImplementedError           Traceback (most recent call last)

NotImplementedError: arguments must be distinct variables
```

This even happens with trying to simplify (send to Maxima)

```sage: diff(F,r).simplify()
<boom>
```

This is at least tangentially related to #6840 and #6756, though probably not directly.

### comment:2 follow-up: ↓ 3 Changed 9 years ago by burcin

AFAIK, #7377 improves the conversion of derivatives to maxima. It might fix this as well.

### comment:3 in reply to: ↑ 2 ; follow-up: ↓ 4 Changed 9 years ago by kcrisman

AFAIK, #7377 improves the conversion of derivatives to maxima. It might fix this as well.

Nice idea! Unfortunately, it seems to have the same problem.

### comment:4 in reply to: ↑ 3 Changed 9 years ago by nbruin

AFAIK, #7377 improves the conversion of derivatives to maxima. It might fix this as well.

Nice idea! Unfortunately, it seems to have the same problem.

but see http://trac.sagemath.org/sage_trac/ticket/7377#comment:54 for some ideas on how to improve this. The concerns about "at" in maxima are ungrounded: It's the documentation that is wrong and this will be fixed in the new version. It would be quite straightforward to extend the support to general derivatives, including conversion to/from maxima (we'll have to see how much trouble the "at" expressions give further down the line, of course). Furthermore, the conversion is easier to do with #7377 but it's not required. You could already do this in the old setup.

### comment:5 Changed 9 years ago by kcrisman

Thanks for that comment reference. I think you are right that this could work out. You are also right that "Sage support for functional derivatives is only rudimentary." This largely changed when the `D` notation was introduced.

### comment:7 Changed 8 years ago by dsm

This seems to work for me in 5.0:

```sage: x, y, r, t = var('x, y, r, t')
sage: f = function('f', x, y)
sage: F = f(x = r*cos(t), y = r*sin(t))
sage: d = (diff(F,r,2) + diff(F,t,2)/r**2 + diff(F,r)/r)
sage: d.simplify()
(sin(t)*D[1, 1](f)(r*cos(t), r*sin(t)) + cos(t)*D[0, 1](f)(r*cos(t), r*sin(t)))*sin(t) + (sin(t)*D[0, 1](f)(r*cos(t), r*sin(t)) + cos(t)*D[0, 0](f)(r*cos(t), r*sin(t)))*cos(t) + (sin(t)*D(f)(r*cos(t), r*sin(t)) + cos(t)*D(f)(r*cos(t), r*sin(t)))/r - ((r*sin(t)*D[0, 1](f)(r*cos(t), r*sin(t)) - r*cos(t)*D[1, 1](f)(r*cos(t), r*sin(t)))*r*cos(t) - (r*sin(t)*D[0, 0](f)(r*cos(t), r*sin(t)) - r*cos(t)*D[0, 1](f)(r*cos(t), r*sin(t)))*r*sin(t) + r*sin(t)*D(f)(r*cos(t), r*sin(t)) + r*cos(t)*D(f)(r*cos(t), r*sin(t)))/r^2
sage: d.simplify_full()
D[0, 0](f)(r*cos(t), r*sin(t)) + D[1, 1](f)(r*cos(t), r*sin(t))
sage: diff(F,r).simplify()
sin(t)*D(f)(r*cos(t), r*sin(t)) + cos(t)*D(f)(r*cos(t), r*sin(t))
sage: diff(F,r).simplify_full()
sin(t)*D(f)(r*cos(t), r*sin(t)) + cos(t)*D(f)(r*cos(t), r*sin(t))
```

Although I'm too lazy to bisect to find out when it started working again, it'd probably be a good idea to add a doctest to make sure that it stays that way. Not quite sure where to put it, though.

### comment:8 follow-up: ↓ 9 Changed 8 years ago by dsm

Hmm. On second thought, I may have spoken too quickly:

D[0, 0](f)(r*cos(t), r*sin(t)) + D[1, 1](f)(r*cos(t), r*sin(t))

and

D[0, 0](f)(r, t) + D[1, 1](f)(r, t)

are a little different. Not incompatible, because the functions are abstract, but still not the same. Do we want to recover the original representation?

### comment:9 in reply to: ↑ 8 Changed 8 years ago by nbruin

D[0, 0](f)(r, t) + D[1, 1](f)(r, t)

Wow, Sage before 4.6 was just plain wrong. We'll excuse casamayou, since superficially it looks like what one would sloppily write in a calculus book (the coordinate transformation implicitly assumed).

The formula for d is the expression for the laplacian in polar coordinates, so it should be equal to

```(diff(f,x,x)+diff(f,y,y)).subs(x=r*cos(t),y=r*sin(t))
```

which is what 5.0 verifies.

I'm pretty sure #12796 fixed this, since this kind of computation was the point of that ticket. I think this ticket can be closed. Add a doctest if you think the current tests are insufficient.

### comment:10 Changed 6 years ago by jdemeyer

• Milestone changed from sage-5.11 to sage-5.12

### comment:11 Changed 6 years ago by vbraun_spam

• Milestone changed from sage-6.1 to sage-6.2

### comment:12 Changed 6 years ago by vbraun_spam

• Milestone changed from sage-6.2 to sage-6.3

### comment:13 Changed 5 years ago by vbraun_spam

• Milestone changed from sage-6.3 to sage-6.4
Note: See TracTickets for help on using tickets.