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.
Below steps will further help you understand this.
First Optimization to find X.
- Vary x starting from 0.1 in the small steps of 0.01
- In an inner loop vary y starting from 0.1 in the small steps of 0.01
- Inside inner loop calculate the value of your objective function xˆ2 + yˆ2.
- At the end of each inner loop, find the minimum value of equation.
- This is your minimum possible objective function value for all possible values of x.
- 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))
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.
- In a loop vary y starting from 0.1 in the small steps of 0.01
- Inside loop calculate the value of your objective function xˆ2 + yˆ2.
- At the end of each loop, store the value of your objective function.
- This is your minimum possible objective function value for all possible values of y.
- 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.