Week 2 of the Coding Period (Phase 1)
is coming to an end. This week was mostly devoted towards polishing the existing PRs
, and bringing them to a mergeable condition. And this week resulted in the merge of 2 PRs
. Yayy !!! Here are the deliverables which have been completed in this week. We talked about the remaining work needed to be done in Week 1, and the initial work of Week 2.
- Now, PR #16869, had many loopholes which had to be corrected, before it possibly could have been merged. One issue was that it currently was not able to handle multiple symbols, like
fps of x**(m+n)*sin(x**2)
. So I had to list out all the free symbols in the formal power series, other thanx
, and those, obviously were the symbols used in the expression, which needed to be seperated.
So, I implemented this piece of code –
syms = f.free_symbols.difference({x})
(f, symb) = expand(f).as_independent(*syms)
if symb is S.Zero:
symb = S.One
symb = powsimp(symb)
, which helped us to remove all the symbolic terms, and pass only the non-symbolix term into the fps
algorithm.
- One more feature implemented in the above PR, were the simplification of terms using
powsimp
. The exponents of the terms are now grouped and printed. Same exists forak
,xk
, andind
of thefps
. Therefore, previously, we had :-f = x**n*sin(x**2) assert fps(f, x).truncate(8) == x**2*x**n - x**6*x**n/6 + O(x**(n + 8), x)
But now, we have :-
f = x**n*sin(x**2) assert fps(f, x).truncate(8) == x**(n + 2) - x**(n + 6)/6 + O(x**(n + 8), x)
After some polishing of the code, like re-using free symbols property of
SeriesBase
, we brought the PR to a mergeable state. Sartaj had a lot of suggestions, and those were duly resolved. ThePR
was ready for review, and it was recently merged (yesterday) !! - Previously, in
Week 1
, I was looking into Issue 12310, and had come up with a solution. Aaron had already stated in the PR, that we need to create aCoeff
class to properly indicate thecoefficient sequence of polynomials
. I followed his comments, and published PR #16943. Formerly, polynomial functions, when referenced throughfps
, did not return aFormal Power Series
object, instead the function itself got returned.
>>> from sympy import Symbol, fps
>>> x = Symbol('x')
>>> p = fps(x ** 2)
>>> p
x**2
>>> type(p)
<class 'sympy.core.power.Pow'>
>>> p[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'Pow' object does not support indexing
I implemented the Coeff
class according to the lines of Aaron’s comment here. Further integration of class methods and functions might be required into the class. Coefficient sequence of the formal power series of polynomial functions contains a Coeff
object now.
Now, A Formal Power Series
object gets returned.
>>> from sympy import Symbol, fps
>>> x = Symbol('x')
>>> p = fps(x ** 2)
>>> p
FormalPowerSeries(x**2 + x + 1, x, 0, 1, (SeqFormula(Coeff(x**2 + x + 1, x, _k), (_k, 1, oo)), SeqFormula(x**_k, (_k, 0, oo)), 1))
>>> p.truncate()
1 + x + x**2 + O(x**6)
>>> p[0]
1
This PR
successfully got approved and merged by Sartaj on 4th June !!
- I also started thinking about the implementation of
convolution
,composition
andinversion
of formal power series. AFormalPowerSeries
function implementation ofdef convolve(self, other, x=None, order=4)
is almost completed, and I will publish aPR
by the next week. It will not return any object, but just the truncated terms upto the specifiedorder
of the convolutedfps
. For thecomposition
part, I raised a discussion Issue #16975, where I and Sartaj discussed about the way we can implement the composition and inversion. Forcomposition
, there exists a closed form expression for the resultant power series, where the resultant coefficient sequenceak
involves Bell polynomials, as follows –
Sartaj then provided his perspective in the above issue, and we will discuss about the implementation more about FiniteFormalPowerSeries
in the upcoming week.
So that was it from Week 2. See you all in the next week !! Adios till then !!