Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将整数变量添加到openmdao驱动程序?_Python_Openmdao - Fatal编程技术网

Python 如何将整数变量添加到openmdao驱动程序?

Python 如何将整数变量添加到openmdao驱动程序?,python,openmdao,Python,Openmdao,我被这个错误弄糊涂了。为什么要提出这个问题?我能告诉openmdao我没有梯度,可以使用有限差分吗?为什么这是提高儿童体重,而不是埃塔 我可以通过将所有变量初始化为浮点来解决这个问题(例如,root.add('childWeight',IndepVarComp('x',100))->root.add('childWeight',IndepVarComp('x',100.0))),但我想了解为什么会出现这个错误 from openmdao.api import Component, Group,

我被这个错误弄糊涂了。为什么要提出这个问题?我能告诉openmdao我没有梯度,可以使用有限差分吗?为什么这是提高儿童体重,而不是埃塔

我可以通过将所有变量初始化为浮点来解决这个问题(例如,
root.add('childWeight',IndepVarComp('x',100))
->
root.add('childWeight',IndepVarComp('x',100.0))
),但我想了解为什么会出现这个错误

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

class gym(Component):
    def __init__(self):
        super(gym, self).__init__()
        self.add_param('eta', 0.01)
        self.add_param('childWeight', 240)

        self.add_output('acc', 1)

    def solve_nonlinear(self, params, unknowns, resids):
        <...... parameters are used to produce objective "acc" ...>
        unknowns["acc"] = ....

top = Problem()
root = top.root = Group()
root.add('gym', gym())
top.driver = ScipyOptimizer()
top.driver.options['optimizer'] = 'BFGS'

root.add('eta',IndepVarComp('x', 0.01))
root.add('childWeight', IndepVarComp('x',100))

root.connect('eta.x', 'gym.eta')
root.connect('childWeight.x', 'gym.childWeight')

top.driver.add_desvar('eta.x', 0, 1.0)
top.driver.add_desvar('childWeight.x', 0, 1000)

top.driver.add_objective('gym.acc')
top.setup()
top.run()
来自openmdao.api导入组件、组、问题、ScipyOptimizer、IndepVarComp
班级健身房(部分):
定义初始化(自):
超级(健身,自我)。\uuuuu初始
自我添加参数('eta',0.01)
自我添加参数('childWeight',240)
自加输出('acc',1)
def solve_非线性(自、参数、未知数、残差):
未知数[“acc”]=。。。。
top=问题()
root=top.root=Group()
root.add('gym',gym())
top.driver=ScipyOptimizer()
top.driver.options['optimizer']='BFGS'
root.add('eta',IndepVarComp('x',0.01))
root.add('childWeight',IndepVarComp('x',100))
root.connect('eta.x','gym.eta')
root.connect('childWeight.x','gym.childWeight')
顶部驱动程序添加数据变量('eta.x',0,1.0)
top.driver.add_desvar('childWeight.x',0,1000)
顶部。驾驶员。添加目标('gym.acc'))
top.setup()
top.run()
引起错误

  File "script.py", line 98, in <module>
    top.setup()
  File "/usr/local/lib/python2.7/site-packages/openmdao/core/problem.py", line 694, in setup
    self.driver._setup()
  File "/usr/local/lib/python2.7/site-packages/openmdao/drivers/scipy_optimizer.py", line 91, in _setup
    super(ScipyOptimizer, self)._setup()
  File "/usr/local/lib/python2.7/site-packages/openmdao/core/driver.py", line 115, in _setup
    (item_name, name, oname))
RuntimeError: Parameter 'childWeight.x' is a 'pass_by_obj' variable and can't be used with a gradient based driver of type 'BFGS'.
文件“script.py”,第98行,在
top.setup()
文件“/usr/local/lib/python2.7/site packages/openmdao/core/problem.py”,第694行,在安装程序中
self.driver.\u setup()
文件“/usr/local/lib/python2.7/site packages/openmdao/drivers/scipy_optimizer.py”,第91行,在_设置中
超级(ScipyOptimizer,self)。\u setup()
文件“/usr/local/lib/python2.7/site packages/openmdao/core/driver.py”,第115行,在安装程序中
(项目名称、名称、名称)
运行时错误:参数'childWeight.x'是'pass_by_obj'变量,不能与'BFGS'类型的基于渐变的驱动程序一起使用。

问题出在这一行

root.add('childWeight', IndepVarComp('x',240))
您已经创建了一个整数变量。请尝试以下方法:

root.add('childWeight', IndepVarComp('x',240.))
如果要使用有限差分,还需要:

top.root.fd_options['force_fd'] = True

我认为出现此错误是因为
childWeight
的默认值是作为整数240而不是浮点240.0提供的。如果您确保您的设计变量始终具有作为浮点的默认值,则不应将它们归类为pass_by_obj变量。

因此,没有办法将整数变量添加到基于渐变的驱动程序中吗?根据定义,没有。基于渐变的优化器需要渐变(导数),而渐变不是为整数变量定义的。