首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化- Python和Scypi.minimize

优化- Python和Scypi.minimize
EN

Stack Overflow用户
提问于 2013-03-13 13:20:46
回答 2查看 309关注 0票数 0

我想找出几个元素的位置X,Y,Z,以便在一个理想的点上有一个全球重心。

为此,我定义了两个类:

  • 存储元素的质量和位置的元素
  • 平面,它接受元素的列表,可以根据元素的集合计算其重心。

我还定义了一个误差函数,它计算平面元素集合中的实际全球重心与期望的重心之间的差异。

为了最小化这个函数,我想将scypi.minimize函数与Nelder算法结合使用。

我将每个元素的坐标放入x0中,然后将x0和错误函数作为参数传递到最小。

我收到这个错误,我不明白。

代码语言:javascript
复制
ValueError: setting an array element with a sequence. 

此外,根据我想做的事情,你可能有一个更好的主意来解决/解决我的问题?

以下是代码:

代码语言:javascript
复制
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})
EN

回答 2

Stack Overflow用户

发布于 2013-03-13 13:37:13

目标函数返回一个列表,而minimize需要一个标量。您需要首先设置问题,并通过最小化向量值函数来指定确切的含义。

票数 0
EN

Stack Overflow用户

发布于 2013-03-13 14:04:45

您应该能够分别运行最小三次的协调组件(x、y和z)。然后,修改calculErreurPosCDG以处理单个值,而不是向量,应该可以使其工作。然后它将只处理标量。

添加注意:好的做法是用大写字母开始Python类的名称,用小写字母开始函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15386527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档