Source code
import numpy as np
from scipy.optimize import minimize
def costfunction(coord):
x=coord[0]
y=coord[1]
return (1+(x+y+1)**2*(19-14*x+3*x**2-14*y+6*x*y+3*y**2))*(30+(2*x-3*y)**2*(18-32*x+12*x**2+48*y-36*x*y+27*y**2))
def main():
print('True value')
print(np.array([0,-1]))
print()
print('Initial random value')
for i in range(10):
initpos=np.array([np.random.random()*10-5,np.random.random()*10-5])
result=minimize(costfunction,initpos,method='nelder-mead')
print(result.x)
print()
print('Initial bad value')
for i in range(10):
initpos=np.array([
[0,0],
[1.2,0.8],
[1.8,0.2],
[-0.6,-0.4],
[100,0],
[3,0.5],
[-1,0],
[-2,0],
[2,2],
[1.5,0]
][i])
result=minimize(costfunction,initpos,method='nelder-mead')
print(result.x)
print()
print('Initial good value')
for i in range(10):
initpos=np.array([
[0,-1],
[0,-3],
[2,-3],
[10,-1],
[0,10],
[-10,-1],
[-100,-100],
[-1,-1],
[-1,1],
[3,-1]
][i])
result=minimize(costfunction,initpos,method='nelder-mead')
print(result.x)
print()
print('Initial random simplex')
for i in range(10):
initsimp=np.array([
[np.random.random()*10-5,np.random.random()*10-5],
[np.random.random()*10-5,np.random.random()*10-5],
[np.random.random()*10-5,np.random.random()*10-5]
])
result=minimize(costfunction,initsimp[0],method='nelder-mead',options={'initial_simplex':initsimp})
print(result.x)
print()
print('Initial bad simplex')
for i in range(10):
initsimp=np.array([
[[0,0],[0,0],[0,0]],
[[0,1],[-2,-3],[2,-3]],
[[0,-10],[10,10],[-10,10]],
[[1,0],[2,-1],[2,1]],
[[-0.5,-0.5],[-0.5,0],[-1,-0.5]],
[[-1,0],[-1,0.1],[-1.1,0]],
[[2,0],[2.1,0],[2,0.1]],
[[1.1,0.7],[1.3,0.7],[1.1,0.9]],
[[2,1],[2.1,1],[2,1.1]],
[[-1.5,-1],[3,0],[-1,1]]
][i])
result=minimize(costfunction,initsimp[0],method='nelder-mead',options={'initial_simplex':initsimp})
print(result.x)
print()
print('Initial good simplex')
for i in range(10):
initsimp=np.array([
[[0,-3],[2,1],[-2,1]],
[[0,2],[-2,-2],[2,-2]],
[[0,-2],[1,-1],[-1,0]],
[[-2,-3],[2,-3],[-2,1]],
[[2,-3],[2,1],[-2,1]],
[[-1,-3],[1,-3],[0,-2]],
[[-1,-1],[0,0],[-2,1]],
[[1,-5],[5,3],[-4,2]],
[[0,0],[1,0],[0,1]],
[[10,10],[20,10],[10,20]]
][i])
result=minimize(costfunction,initsimp[0],method='nelder-mead',options={'initial_simplex':initsimp})
print(result.x)
print()
if __name__=='__main__':
main()
Output
True value
[ 0 -1]
Initial random value
[ 4.4208803e-05 -1.0000242e+00]
[1.80001992 0.20000957]
[ 4.64397488e-06 -9.99983842e-01]
[1.80000509 0.20001775]
[-0.59996408 -0.40002324]
[1.79998473 0.19999151]
[-0.59997526 -0.40003424]
[-1.26969689e-05 -9.99993748e-01]
[ 3.80791326e-05 -1.00003347e+00]
[-0.6000143 -0.40001001]
Initial bad value
[-0.59995602 -0.40003256]
[1.2 0.8]
[1.8 0.2]
[-0.6 -0.4]
[-0.60002819 -0.39999439]
[1.79996718 0.19997927]
[-0.59998189 -0.4000147 ]
[-0.59999666 -0.40003518]
[1.79997382 0.19998251]
[1.80000507 0.19999908]
Initial good value
[ 0. -1.]
[-1.83077975e-05 -1.00003635e+00]
[ 3.55940767e-05 -1.00002308e+00]
[-1.70139999e-05 -9.99995686e-01]
[-9.35344209e-06 -9.99975632e-01]
[-3.79142987e-05 -1.00000945e+00]
[-2.59837213e-05 -9.99992902e-01]
[ 1.12349140e-05 -9.99979386e-01]
[-3.01017978e-05 -1.00003180e+00]
[-3.75404157e-05 -9.99993163e-01]
Initial random simplex
[-4.38479499e-05 -9.99983400e-01]
[1.79997141 0.19998146]
[ 4.19069289e-05 -1.00001455e+00]
[-2.88077159e-05 -9.99977820e-01]
[-2.34219108e-05 -1.00002053e+00]
[ 4.30660682e-05 -9.99980226e-01]
[-3.98675161e-05 -9.99964281e-01]
[-2.62344002e-05 -1.00001424e+00]
[1.80000625 0.20000024]
[ 4.31714472e-05 -9.99981483e-01]
Initial bad simplex
[0. 0.]
[1.79996596 0.19997736]
[1.80004063 0.20002534]
[1.80002576 0.20001782]
[-0.59997082 -0.40000806]
[-0.60003631 -0.39998534]
[1.80003106 0.20002062]
[1.19999556 0.80002538]
[1.2 0.8]
[1.80001738 0.20001495]
Initial good simplex
[ 0. -1.]
[-3.53506141e-05 -9.99994140e-01]
[ 4.12721041e-05 -9.99978257e-01]
[ 1.22305021e-05 -1.00002528e+00]
[ 1.22305021e-05 -1.00002528e+00]
[ 0. -1.]
[ 6.36490487e-06 -1.00001975e+00]
[ 2.37637790e-05 -1.00001478e+00]
[ 1.74665790e-05 -1.00002794e+00]
[-3.47071748e-05 -1.00003106e+00]