0

グローバル重心を目的の点に配置するために、いくつかの要素の位置[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})
4

2 に答える 2

0

座標コンポーネント (x、y、z) ごとに個別に 3 回の最小化を実行できるはずです。calculErreurPosCDGベクトルではなく単一の値を処理するように変更すると、機能するはずです。次に、スカラーのみを処理します。

追加の注意: Python のクラスの名前は大文字で始め、関数は小文字で始めることをお勧めします。

于 2013-03-13T14:04:45.590 に答える
0

ターゲット関数はリストを返しますがminimize、スカラーを期待しています。最初に問題を設定し、ベクトル値関数を最小化することで正確に何を意味するかを指定する必要があります。

于 2013-03-13T13:37:13.197 に答える