【问题标题】:OpenMDAO 1.5 : Running DOEdriver with array as desvarOpenMDAO 1.5:使用数组作为 desvar 运行 DOEdriver
【发布时间】:2016-02-09 14:49:12
【问题描述】:

我已使用此处描述的示例 (http://openmdao.readthedocs.org/en/1.5.0/usr-guide/tutorials/doe-drivers.html?highlight=driver) 来说明我的问题。我想对一个组件使用相同的方法,“参数”是数组,不再是 float 。见下面的例子

from openmdao.api import IndepVarComp, Group, Problem, ScipyOptimizer, ExecComp, DumpRecorder, Component


from openmdao.drivers.latinhypercube_driver import LatinHypercubeDriver, OptimizedLatinHypercubeDriver

import numpy as np

class Paraboloid(Component):
    """ Evaluates the equation f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 """

    def __init__(self):
        super(Paraboloid, self).__init__()

        self.add_param('x', val=0.0)
        self.add_param('y', val=0.0)

        self.add_output('f_xy', val=0.0)

    def solve_nonlinear(self, params, unknowns, resids):
        """f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3
        """

        x = params['x']
        y = params['y']

        unknowns['f_xy'] = (x-3.0)**2 + x*y + (y+4.0)**2 - 3.0

    def linearize(self, params, unknowns, resids):
        #""" Jacobian for our paraboloid."""

        x = params['x']
        y = params['y']
        J = {}

        J['f_xy', 'x'] = 2.0*x - 6.0 + y
        J['f_xy', 'y'] = 2.0*y + 8.0 + x
        return J
class ParaboloidArray(Component):
    """ Evaluates the equation f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 """

    def __init__(self):
        super(ParaboloidArray, self).__init__()

        self.add_param('X', val=np.array([0., 0.]))


        self.add_output('f_xy', val=0.0)

    def solve_nonlinear(self, params, unknowns, resids):
        """f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3
        """

        x = params['X'][0]
        y = params['y'][1]

        unknowns['f_xy'] = (x-3.0)**2 + x*y + (y+4.0)**2 - 3.0




top = Problem()
root = top.root = Group()

root.add('p1', IndepVarComp('x', 50.0), promotes=['*'])
root.add('p2', IndepVarComp('y', 50.0), promotes=['*'])
root.add('comp', Paraboloid(), promotes=['*'])

top.driver = OptimizedLatinHypercubeDriver(num_samples=4, seed=0, population=20, generations=4, norm_method=2)
top.driver.add_desvar('x', lower=-50.0, upper=50.0)
top.driver.add_desvar('y', lower=-50.0, upper=50.0)

top.driver.add_objective('f_xy')

top.setup()
top.run()

top.cleanup()
###########################
print("case float ok")
top = Problem()
root = top.root = Group()

root.add('p1', IndepVarComp('X', np.array([50., 50.])), promotes=['*'])

root.add('comp', ParaboloidArray(), promotes=['*'])

top.driver = OptimizedLatinHypercubeDriver(num_samples=4, seed=0, population=20, generations=4, norm_method=2)
top.driver.add_desvar('X', lower=np.array([-50., -50.]), upper=np.array([50., 50.]))

top.driver.add_objective('f_xy')


top.setup()
top.run()

top.cleanup()

我收到以下错误:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 102, in <module>
  File "D:\tlefeb\Anaconda2\Lib\site-packages\openmdao\core\problem.py", line 1038, in run
    self.driver.run(self)
  File "D:\tlefeb\Anaconda2\Lib\site-packages\openmdao\drivers\predeterminedruns_driver.py", line 108, in run
    for run in runlist:
  File "D:\tlefeb\Anaconda2\Lib\site-packages\openmdao\drivers\latinhypercube_driver.py", line 57, in _build_runlist
    design_var_buckets = self._get_buckets(bounds['lower'], bounds['upper'])
  File "D:\tlefeb\Anaconda2\Lib\site-packages\openmdao\drivers\latinhypercube_driver.py", line 101, in _get_buckets
    bucket_walls = np.linspace(low, high, self.num_samples + 1)
  File "D:\tlefeb\Anaconda2\Lib\site-packages\numpy\core\function_base.py", line 102, in linspace
    if step == 0:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我的编码方式有什么误解吗?

【问题讨论】:

  • 您运行的是什么版本的 OpenMDAO?我在这里也遇到了一个错误,但它与你的不同。我得到一个值错误...
  • 感谢您的检查:我使用的是 1.5.0 版本(我有 Anaconda 提供 python)

标签: arrays driver openmdao


【解决方案1】:

使用latest OpenMDAO master 时,我得到的错误与您不同,但我得到一个错误。该模式没有任何问题,但在 DOE 中使用数组变量存在一些错误。我在 OpenMDAO 积压工作中添加了一个错误修复 story,我们希望能够在接下来的几周内处理这个问题。如果您在我们开始修复之前开发了一个修复程序,我们很乐意接受拉取请求。

【讨论】:

  • 目前,我可以对 DOE 使用“浮动”方法,但我会检查是否可以在我的一位同事的帮助下开发修复程序!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多