我希望能够在pyomo中将积分定义为目标函数的一部分.
我无法弄清楚积分需要哪种表达.
这是我最好的猜测:
model = ConcreteModel()
model.t = ContinuousSet(bounds = (0,1))
model.y = Var(model.t)
model.dydt = DerivativeVar(model.y, wrt=(model.t))
def myintegral(model,i):
return model.dydt[i]
model.n = Integral(model.t, wrt=model.t, rule=myintegral) # this line is the trouble
def myobjective(model):
return model.n
model.obj = Objective(rule=myobjective)
错误是:TypeError:不是Pyomo表达式的可调用类型不能用于初始化Expression对象.使用“规则”来初始化函数类型.
但是,我不明白为什么积分内部的表达式是个问题,因为这些变量似乎可以由索引模型完全索引.
# but, this is totally fine:
print model.dydt[0]
print model.dydt[1]
我误会了吗?
到目前为止,我已经参考了一些资源:
https://groups.google.com/forum/#!topic/pyomo-forum/6RhEXEMDTPc
https://software.sandia.gov/downloads/pub/pyomo/PyomoOnlineDocs.html#_parameters
https://projects.coin-or.org/Coopr/browser/pyomo/trunk/examples/dae/Heat_Conduction.py?rev=9315
我愿意接受有关pyomo其他资源的建议/链接.
解决方法:
Gabe是正确的,这确实是Integral类中的错误,并且已在github存储库中修复.示例模型中的另一个错误是Objective组件的规范.您应该使用“ rule”关键字而不是“ expr”
def myobjective(model):
return model.n
model.obj = Objective(rule=myobjective)
另外,我想重申pyomo.dae的在线文档中提到的内容.整体组件是一个原型,尚未完全开发.我不建议将其用于需要高精度解决方案的复杂积分或模型.积分类使用梯形规则进行数值积分.我建议将您问题中的所有积分转换为微分方程,然后使用提供的自动离散化转换解决它们.
标签:python,pyomo 来源: https://codeday.me/bug/20191014/1912358.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。