sagemath / sage

Main repository of SageMath
https://www.sagemath.org
Other
1.35k stars 461 forks source link

Implement derivative of gegenbauer(n,a,x) wrt to a #21639

Open a29f3e21-153a-43e1-9dc1-3808f8f5634e opened 8 years ago

a29f3e21-153a-43e1-9dc1-3808f8f5634e commented 8 years ago

Implement

In [3]: gegenbauer(n,m,x)
Out[3]: gegenbauer(n, m, x)

In [4]: _.diff(m)
Out[4]: 
n - 1                                                                          
 ____                                                                          
 ╲                                                                             
  ╲   ⎛⎛      -k + n    ⎞                                                      
   ╲  ⎜⎝2⋅(-1)       + 2⎠⋅(k + m)⋅gegenbauer(k, m, x)     ⎛         2⋅k + 2      
   ╱  ⎜────────────────────────────────────────────── + ⎜──────────────────────
  ╱   ⎝            (-k + n)⋅(k + 2⋅m + n)                ⎝(k + 2⋅m)⋅(2⋅k + 2⋅m +
 ╱                                                                             
 ‾‾‾‾                                                                          
k = 0                                                                          

                                      ⎞
           2     ⎞                    ⎟
─── + ───────────⎟⋅gegenbauer(n, m, x) ⎟
 1)   k + 2⋅m + n ⎠                    ⎠

Previous description was (now implemented):

I noticed that the derivative of the gegenbauer polynomial wrt x was not implemented, so I wrote a patch for it.

I used the formula C'(n,a,x) = 2aC(n-1,a+1,x)

With the patch applied I get, for example:

sage: var('a');
sage: derivative(gegenbauer(2,a,x),x)
4*(a + 1)*a*x

Depends on #21645

CC: @rwst

Component: calculus

Keywords: gegenbauer, ultraspherical, derivative

Author: Carlos R. Mafra

Issue created by migration from https://trac.sagemath.org/ticket/21639

a29f3e21-153a-43e1-9dc1-3808f8f5634e commented 8 years ago

Patch implementing the derivative of gegenbauer(n,a,x) wrt x

a29f3e21-153a-43e1-9dc1-3808f8f5634e commented 8 years ago

Description changed:

--- 
+++ 
@@ -4,7 +4,11 @@

 With the patch applied I get, for example:

+
+```
 sage: var('a');
 sage: derivative(gegenbauer(2,a,x),x)
 4*(a + 1)*a*x

+```
+
a29f3e21-153a-43e1-9dc1-3808f8f5634e commented 8 years ago
comment:1

Attachment: 0001-Implement-derivative-of-gegenbauer-n-a-x-w.r.t-x.patch.gz

a29f3e21-153a-43e1-9dc1-3808f8f5634e commented 8 years ago

Author: Carlos R. Mafra

rwst commented 7 years ago
comment:4

Thanks. I would like to extend this ticket with derivatives on the second index:

In [3]: gegenbauer(n,m,x)
Out[3]: gegenbauer(n, m, x)

In [4]: _.diff(m)
Out[4]: 
n - 1                                                                          
 ____                                                                          
 ╲                                                                             
  ╲   ⎛⎛      -k + n    ⎞                                                      
   ╲  ⎜⎝2⋅(-1)       + 2⎠⋅(k + m)⋅gegenbauer(k, m, x)     ⎛         2⋅k + 2      
   ╱  ⎜────────────────────────────────────────────── + ⎜──────────────────────
  ╱   ⎝            (-k + n)⋅(k + 2⋅m + n)                ⎝(k + 2⋅m)⋅(2⋅k + 2⋅m +
 ╱                                                                             
 ‾‾‾‾                                                                          
k = 0                                                                          

                                      ⎞
           2     ⎞                    ⎟
─── + ───────────⎟⋅gegenbauer(n, m, x) ⎟
 1)   k + 2⋅m + n ⎠                    ⎠

I'll both implement in Pynac directly. See also #21644.

rwst commented 7 years ago
comment:5

The second case would depend on #21645.

rwst commented 7 years ago
comment:6

The first case is https://github.com/pynac/pynac/commit/6587fdc83ef1b002b583339bca70bcf94e50535c

Doctests will be in the Pynac upgrade ticket, can be already seen at https://github.com/pynac/sage/commit/85726b14a96eb91c8fd70c1e76e729230e606a15

a29f3e21-153a-43e1-9dc1-3808f8f5634e commented 7 years ago
comment:7

Thanks for adding the derivative wrt m, I wasn't aware of this identity (where did you get it?).

Btw, what is the guiding principle to decide if things should go into pynac or pure sage?

I was under the impression that 'performance' was the primary factor to move things to pynac. Is this the case here?

rwst commented 7 years ago
comment:8

Replying to @sagetrac-mafra:

Thanks for adding the derivative wrt m, I wasn't aware of this identity (where did you get it?).

This is from SymPy.

Btw, what is the guiding principle to decide if things should go into pynac or pure sage?

I was under the impression that 'performance' was the primary factor to move things to pynac. Is this the case here?

You are right, in many cases this is the reason. One other reason can be that when all the function code is already in Pynac then for clarity add the new functionality there.

a29f3e21-153a-43e1-9dc1-3808f8f5634e commented 7 years ago
comment:9

Replying to @rwst:

Replying to @sagetrac-mafra:

Btw, what is the guiding principle to decide if things should go into pynac or pure sage?

I was under the impression that 'performance' was the primary factor to move things to pynac. Is this the case here?

You are right, in many cases this is the reason. One other reason can be that when all the function code is already in Pynac then for clarity add the new functionality there.

IMHO, Pynac should be reserved for performance reasons only.

Adding the derivative functions to Pynac only complicates the situation here as we lose a unified handling of the derivatives within the Python file, like in this case with 'hermite' needing a fix in Pynac and gen_laguerre in Sage. I don't think this adds to 'clarity'.

So I disagree with moving the derivative of gegenbauer to Pynac, as it is not performance motivated and could be easily done in Sage.

rwst commented 7 years ago
comment:10

You would not believe how much slower any Python (and Cython) code is versus C/C++. That's for example why SymPy has extraordinary performance problems for even simple computations, and why they urgently push the SymEngine project. I therefore feel justified to replace *any !Python/Cython code with C++, and contrarily to SymPy we are in the fortunate position that Pynac is already integrated in Sage. While the time when to do this transcription may certainly be a matter of debate, the necessity itself is not.

a29f3e21-153a-43e1-9dc1-3808f8f5634e commented 7 years ago
comment:11

Replying to @rwst:

You would not believe how much slower any Python (and Cython) code is versus C/C++. That's for example why SymPy has extraordinary performance problems for even simple computations, and why they urgently push the SymEngine project. I therefore feel justified to replace *any !Python/Cython code with C++, and contrarily to SymPy we are in the fortunate position that Pynac is already integrated in Sage. While the time when to do this transcription may certainly be a matter of debate, the necessity itself is not.

Fair enough, thanks!

rwst commented 7 years ago

Dependencies: #21645

rwst commented 7 years ago

Description changed:

--- 
+++ 
@@ -1,3 +1,33 @@
+Implement
+
+```
+In [3]: gegenbauer(n,m,x)
+Out[3]: gegenbauer(n, m, x)
+
+In [4]: _.diff(m)
+Out[4]: 
+n - 1                                                                          
+ ____                                                                          
+ ╲                                                                             
+  ╲   ⎛⎛      -k + n    ⎞                                                      
+   ╲  ⎜⎝2⋅(-1)       + 2⎠⋅(k + m)⋅gegenbauer(k, m, x)     ⎛         2⋅k + 2      
+   ╱  ⎜────────────────────────────────────────────── + ⎜──────────────────────
+  ╱   ⎝            (-k + n)⋅(k + 2⋅m + n)                ⎝(k + 2⋅m)⋅(2⋅k + 2⋅m +
+ ╱                                                                             
+ ‾‾‾‾                                                                          
+k = 0                                                                          
+
+                                       
+                                       
+                                       
+                                      ⎞
+           2     ⎞                    ⎟
+─── + ───────────⎟⋅gegenbauer(n, m, x) ⎟
+ 1)   k + 2⋅m + n ⎠                    ⎠
+                                       
+```
+Previous description was (now implemented):
+
 I noticed that the derivative of the gegenbauer polynomial wrt x was not implemented, so I wrote a patch for it.

 I used the formula C'(n,a,x) = 2*a*C(n-1,a+1,x)