Optimization - Python and Scypi.minimize -
i find position [x,y,z] of several elements in order have global center of gravity @ desired point.
to so, defined 2 classes:
- elements store element's mass , position
- plane takes list of element , can compute center of gravity according set of element.
i defined error function compute difference between actual global center of gravity plane's set of elements , desired center of gravity.
to minimize function, wanted use scypi.minimize function nelder-mead simplex algorithm.
i put each element's coordinate x0 , pass x0 , error function parameter minimize.
i received error don't understand.:
valueerror: setting array element sequence. moreover according want do, may have better idea solve/fix problem?
here code :
import numpy np scipy.optimize import minimize class plane(object): def __init__(self, elts): self.elements=elts self.totalmasse=self.calc_masse(self.elements) self.cdg = self.calc_cdg() def __getitem__(self): return self.elements,self.totalmasse def calc_masse(self,elements): lm=[] el in elements: lm.append(el.masse) return sum(lm) def calc_cdg(self): xcdg=0 ycdg=0 zcdg=0 el in self.elements: xcdg+=el.masse*el.position[0]/self.totalmasse ycdg+=el.masse*el.position[1]/self.totalmasse zcdg+=el.masse*el.position[2]/self.totalmasse return [xcdg,ycdg,zcdg] class element(object): def __init__(self, mass, pos): self.masse=mass self.position=pos def __getitem__(self): return self.masse, self.position def calculerreurposcdg(cdg): global positioncdgconsigne return [positioncdgconsigne[0]-cdg[0], positioncdgconsigne[1]-cdg[1],positioncdgconsigne[2]-cdg[2]] battery = element(0.5,[0.5,1,1]) motor = element(0.2,[1,1,0]) servol = element(0.01,[-0.7,1,0]) servor = element(0.01,[0.7,1,0]) reciever = element(0.01,[0.1,1,1]) elements=[battery, motor, servol, servor, reciever] positioncdgconsigne=[1,1,1] plane1=plane(elements) x0=np.array([]) el in elements: x0= np.append(x0,[el.position]) res=minimize(calculerreurposcdg,x0,method='nelder-mead', options={'xtol':1e-8,'disp':true})
your target function returns list, while minimize expects scalar. need set problem first , specify mean minimizing vector-valued function.
Comments
Post a Comment