You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Pyomo优化EES外部函数时的变量数值传入问题?

解决Pyomo调用EES外部函数时的符号变量输入问题

你的代码无法运行的核心原因有两个:

  • 目标函数的rule参数使用错误,直接调用了my_function(x)而非传入函数引用
  • 未将Pyomo的符号决策变量转换为EES可接受的数值类型

以下是修正后的完整代码:

from EESConnect import EESConnector
import pyomo.environ as pyo
from pyomo.opt import SolverFactory

# 提前初始化EES连接器并加载文件,避免每次迭代重复加载
ees = EESConnector()
ees.ees_file_path = 'C:/Users/XX/Desktop/Optimization/Opt.EES'

model = pyo.ConcreteModel()

# 定义决策变量及边界
model.x = pyo.Var(bounds=(-5,5))

# 定义目标函数:接收model参数,将符号变量转数值后调用EES计算
def my_function(model):
    # 获取Pyomo变量的当前数值
    x_val = pyo.value(model.x)
    # 传入数值给EES执行计算
    func = ees.calculate([x_val])
    return func

# 正确设置目标函数:传入函数引用作为rule参数
model.obj = pyo.Objective(rule=my_function, sense=pyo.minimize)

# 初始化求解器并执行优化
opt = SolverFactory('ipopt', executable='E:/Py/ipopt/bin/ipopt.exe')
opt.solve(model)

# 输出优化结果
print('x=', pyo.value(model.x))
print('目标函数值=', pyo.value(model.obj))

# 关闭EES连接释放资源
ees.close()

关键修正说明

  1. 提前加载EES文件:将EES文件加载逻辑放在目标函数外部,避免优化过程中每次迭代都重新加载文件,大幅提升运行效率
  2. 目标函数规则修正:Pyomo的Objective组件的rule参数需要传入一个接受model为参数的函数,而非直接调用函数的结果
  3. 符号变量转数值:使用pyo.value(model.x)提取当前迭代中变量的数值,确保传入EES的是数值类型而非Pyomo符号变量
  4. 显式关闭连接:调用ees.close()避免EES资源泄漏(根据EESConnect库的实际接口调整)

额外注意事项

  • 确保EES文件Opt.EES中定义了匹配的输入输出逻辑,能正确接收单个数值输入并返回目标函数计算结果
  • 若使用IPOPT求解器,需保证EES返回的目标函数是连续可微的,否则可能导致求解器收敛失败

内容的提问来源于stack exchange,提问作者user21556354

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:38:25