グローバル重心を目的の点に配置するために、いくつかの要素の位置[X、Y、Z]を見つけたいと思います。
そのために、2つのクラスを定義しました。
- 要素の質量と位置を格納する要素
- 要素のリストを取得し、要素のセットに従ってその重心を計算できる平面。
また、平面の要素のセットからの実際のグローバル重心と目的の重心との差を計算する誤差関数を定義しました。
scypi.minimize
この関数を最小化するために、ネルダーミードシンプレックスアルゴリズムでこの関数を使用したいと思いました。
各要素の座標をに入れてから、最小化するパラメーターとして誤差関数をx0
渡します。x0
わからないこのエラーが表示されました。:
ValueError: setting an array element with a sequence.
さらに、私がやりたいことによると、あなたは私の問題を解決/修正するためのより良いアイデアを持っているかもしれませんか?
ここにコードがあります:
import numpy as np
from 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=[]
for el in elements:
Lm.append(el.masse)
return sum(Lm)
def calc_CDG(self):
Xcdg=0
Ycdg=0
Zcdg=0
for 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([])
for el in elements:
x0= np.append(x0,[el.position])
res=minimize(calculErreurPosCDG,x0,method='nelder-mead', options={'xtol':1e-8,'disp':True})