【问题标题】:Workaround max equation length in APmonitorAPmonitor 中的解决方法最大方程式长度
【发布时间】:2022-01-03 00:36:30
【问题描述】:

我正在使用 GEKKO 来查找一些未知函数的二维傅立叶系数 u 根据二维向量 g 扩展。为此设置了字典,我需要计算表单的许多术语:

u{ u_fourier_i_j: [m.Var(),m.Var()] ....}
g{ g_i_j : [gx_i_j, gy_i_j].....}
m.Minimize(m.cos(sup.function()))

其中 sup.function 定义为:

dummy = 0
for i in fourier_x:
   for j in fourier_y:
       dummy += u_fourier_i_j * np.cos(np.dot(g_i_j,[x,y]))
return dummy

现在我想使用许多傅立叶系数,但 Gekko 给了我错误:

APM 模型错误:字符串 > 15000 个字符 考虑将这条线分成多个方程

这也可能是由于只使用换行符 CR 而不是 CR LF(适用于 Windows)或 LF(适用于 MacOS/Linux) 要解决此问题,请使用适当的换行符保存 APM 文件

有没有办法增加 APM 模型中的最大字符串大小,或者通过不同的程序结构来规避这个错误? 计算资源应该不是问题。

【问题讨论】:

  • 您是否尝试过按照错误消息的提示“将线分解为多个方程”?
  • 嗯,sup.function 的整个表达式是余弦的参数,所以这不能合理地分解成多个表达式。我猜可以使用加法定理,但这是不可扩展的,因为它分解为 30 个傅立叶系数,我想使用数百个。

标签: python gekko apm


【解决方案1】:

使用m.sum()(gekko summation)来避免最大长度错误。它接受一个列表输入并创建一个总和,以提高模型求解的速度。

dummy = []
for i in fourier_x:
   for j in fourier_y:
       dummy.append(u_fourier_i_j * np.cos(np.dot(g_i_j,[x,y])))
return m.sum(dummy)

如果仍然存在错误,请尝试使用类似的策略,将np.dot() 函数np.dot(g_i_j,[x,y]) 替换为d

n = len(g_i_j)
z = [x,y]
d = m.sum([g_i_j[i]*z[i] for i in range(n)])

请发布完整的脚本,以便验证修复。

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2011-02-16
    • 1970-01-01
    相关资源
    最近更新 更多