symsum does not return sum of series when a constant is replaced by symbol

20 views (last 30 days)
Eshita Rastogi
Eshita Rastogi on 30 Apr 2021
Answered: Walter Roberson on 4 May 2021
The following symbols are defined in my code:
syms l d z k positive;
assumeAlso(k,'integer');
assumeAlso(z,'integer');
assumeAlso(d,'integer'); assumeAlso(d<z);
When I try to find the sum of a series, symsum simply returns the input series itself. However, when I replace the variable z with a constant (say, 7), symsum returns the series sum as a hypergeometric function.
Series whose sum I want to find:
S = symsum(d.*(z-d).*l.^(k.*z+d)./(factorial(k.*z+d).*(k.*z+d)), k, 0, Inf)
Output:
S = -d*symsum(l^(d + k*z)/(factorial(d + k*z)*(d + k*z)), k, 0, Inf)*(d - z)
Replace z with 7:
S = symsum(d.*(7-d).*l.^(k.*7+d)./(factorial(k.*7+d).*(k.*7+d)), k, 0, Inf)
Output:
S = -(l^d*(d - 7)*hypergeom([1, d/7], [d/7 + 1, d/7 + 1, d/7 + 1/7, d/7 + 2/7, d/7 + 3/7, d/7 + 4/7, d/7 + 5/7, d/7 + 6/7], l^7/823543))/factorial(d)
From the output with z = 7, it is actually pretty clear what the series sum should be with z as a symbol. So, why doesn't symsum find it?

Answers (2)

Shiva Kalyan Diwakaruni
Shiva Kalyan Diwakaruni on 3 May 2021
Edited: Shiva Kalyan Diwakaruni on 4 May 2021
Hi,
MATLAB evaluates infinite sums by comparing them to a set of infinite sums for which it knows the answer. If MATLAB does not recognize the sum of a series, but sum is known to converge, a new pattern can be added with the sum::addpattern command (see https://www.mathworks.com/help/symbolic/mupad_ref/sum-addpattern.html). 'sum::addpattern' is a MuPad command, so the following syntax must be used to execute it in the MATLAB command line:
>> feval(symengine, 'sum::addpattern(f(n),n=-infinity..in
  1 Comment
Walter Roberson
Walter Roberson on 4 May 2021
None of the MuPAD internal functions are documented in any current release. You have to go back to about R2019a to find the documentation for them.

Sign in to comment.


Walter Roberson
Walter Roberson on 4 May 2021
S = -(l^d*(d - 7)*hypergeom([1, d/7], [d/7 + 1, d/7 + 1, d/7 + 1/7, d/7 + 2/7, d/7 + 3/7, d/7 + 4/7, d/7 + 5/7, d/7 + 6/7], l^7/823543))/factorial(d)
Yes, we can see the pattern,
S = -(l^d*(d - z)*hypergeom([1, d/z], [d/z + 1, d/z + 1, d/z + (1:z-1)/z], l^z/z^z))/factorial(d)
However... the Symbolic engine does not have any way to represent that. When we have a definite z value, we can write 1:z-1 but the symbolic colon operator can only operate when z is a known value because it wants to return an array of definite size
>> 1:z
Error using : (line 38)
Unable to compute number of steps from 1 to z by 1.
Symbolic colon is able to handle some other cases where the number of steps can be determined mathematically, such as
>> 0:z/8:z
ans =
[0, z/8, z/4, (3*z)/8, z/2, (5*z)/8, (3*z)/4, (7*z)/8, z]
The Symbolic Toolbox could probably be enhanced to return (for example)
symcolon(1,1,z-1)
for some new symcolon() operation... but it has not been. And it leads to questions that would take some thought to answer, such as what length() of a general symcolon() should be, or what should happen if you try to do something like run arrayfun() on this hypothetical symcolon() data structure.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by