### How to create a solver in python

##### 8 months ago

Python scipy provides a good number of optimizers/solvers. You can use these optimizers to solve various non-linear and linear equations. However, sometimes things might get tricky and you will not be able to calculate and provide jacobian to these solvers. Well, this at-least happened with us.

So, we developed our own optimizer to suit our problem and got the perfect result. In this "how to" I will provide a simple way to design and develop your own solver to minimize the polynomial equations of type xˆ2 + yˆ2

Idea is pretty simple, we need to vary x and y in small steps and then store the result of equation for each value of x and y. We will need to run our optimizer twice to find the perfect values of x and y. So, if total number of variables are n then we will need to run optimizer n times. Once for each variable.

#### First Optimization to find X.

1. Vary x starting from 0.1 in the small steps of 0.01
2. In an inner loop vary y starting from 0.1 in the small steps of 0.01
3. Inside inner loop calculate the value of your objective function xˆ2 + yˆ2.
4. At the end of each inner loop, find the minimum value of equation.
5. This is your minimum possible objective function value for all possible values of x.
6. Now using numpy polyfit, you can calculate the value of x for which you will get the minimum objective. Following code will help you understand this better.

`def calcPoly(this, X, diff, deg=2): `

`min_idx = diff.index(min(diff))-5 `

`if min_idx<0: min_idx = 0 `

`max_idx = min_idx + 10 `

`x, y = X[min_idx:max_idx], diff[min_idx:max_idx] `

`co = np.polyfit(x, y, deg) `

`x = abs(co/(2*co)) `

`return x`

#### Second Optimization to find Y.

Similar to first optimization we need to run our two loops again. But, this time, we will not vary X. We know the value of X from our previous optimization.

1. In a loop vary y starting from 0.1 in the small steps of 0.01
2. Inside loop calculate the value of your objective function xˆ2 + yˆ2.
3. At the end of each loop, store the value of your objective function.
4. This is your minimum possible objective function value for all possible values of y.
5. Now using numpy polyfit, you can calculate the value of y for which you will get the minimum objective. Above code can be used for the same purpose. Instead of X just pass array of all Y values and diff array will hold all objective function results.

You can now run your objective function again to check if calculated x and y values are really giving you an optimized result. If your equations are of type xˆ3 + yˆ3, you can still use the same code. Just pass deg=3 to calcPoly method.

I hope this will help.

0 Likes