## Week 5 - GSoC 2020

This blog post describes my progress in Week 5 of Google Summer of Code 2020!

I ended up Week 4 by adding unit tests and a rough draft for `Series`

and `Parallel`

classes. Now in this week, to complete the implementation, we decided to add another class
`TransferFunctionExpr`

(like there is `MatrixExpr`

class in the `matrices`

module of sympy) which would be the super class for `Series`

, `Parallel`

, and `TransferFunction`

. So, in the initial days, I added a rough implementation of that
class! But soon after that, Ishan and I *analysed* that there’s no need to add a new class :p, because transfer function operations could be represented by just overriding
*add*, *mul*, and *sub* operators in `Series`

and `Parallel`

classes. It was that simple!!

I have almost completed the implementation of both these classes by now. Basic transfer function operations like `tf2 + tf3 + tf2*tf1 + tf5`

now give `Parallel(tf2, tf3, Series(tf2, tf1), tf5)`

.

Something is still missing… Guess what? It is *div* operator! Well, we had a discussion on this topic in the PR and on the Gitter channel. The thing is that “pure division”
won’t usually come up with transfer functions. The only way division comes into picture is through the use of feedback interconnections (i.e. solving an algebraic equation).
So, we decided to introduce a new `Feedback`

object so that we don’t have to actually divide `TransferFunction`

with `Parallel`

or `Series`

with `Parallel`

objects.

I’ll show you how! Consider this block diagram with a negative feedback.
Solving algebraic equations for *Y(s)* in terms of *R(s)* gives:

```
Y(s) = H(s) * R(s)
```

where `H(s)`

is `(P(s)*C(s)) / (1 + P(s)*C(s)*F(s))`

API for `Feedback`

class looks like this:

```
>>> H = Feedback(tf1, tf2*tf3) # tf1, tf2, and tf3 are transfer functions.
>>> H.num # gives back the numerator
tf1
>>> H.den # gives the denominator. In this case, it's a *Series* object
Series(tf2, tf3)
>>> H.var # gives back the variable which is used by all the transfer functions.
var
>>> H.doit() # gives the resultant transfer function
TransferFunction(...)
```

I have also added the unit tests for `Feedback`

class, will complete the implementation soon after the unit tests are finalized.

It was one of the most chaotic weeks till now, if not the most chaotic! That’s all I had for this week, folks!!