如何解决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()
关键修正说明
- 提前加载EES文件:将EES文件加载逻辑放在目标函数外部,避免优化过程中每次迭代都重新加载文件,大幅提升运行效率
- 目标函数规则修正:Pyomo的
Objective组件的rule参数需要传入一个接受model为参数的函数,而非直接调用函数的结果 - 符号变量转数值:使用
pyo.value(model.x)提取当前迭代中变量的数值,确保传入EES的是数值类型而非Pyomo符号变量 - 显式关闭连接:调用
ees.close()避免EES资源泄漏(根据EESConnect库的实际接口调整)
额外注意事项
- 确保EES文件
Opt.EES中定义了匹配的输入输出逻辑,能正确接收单个数值输入并返回目标函数计算结果 - 若使用IPOPT求解器,需保证EES返回的目标函数是连续可微的,否则可能导致求解器收敛失败
内容的提问来源于stack exchange,提问作者user21556354
相关产品推荐
相关产品推荐

