解决APmonitor方程长度限制及GEKKO二维傅里叶计算报错方案咨询
GEKKO傅里叶展开单条表达式超长报错解决方案
是否可以提升APM Model最大字符串长度限制
不可以。15000字符是APM求解器内核对单条表达式的硬编码限制,没有配置项可以直接修改该阈值,只能通过调整程序结构规避报错。
调整程序结构的规避方案
- 拆分累加项为多个中间变量
不要将所有傅里叶项的累加操作放在同一个表达式内,每累加10-20项就用m.Intermediate()定义一个中间分段和,最后将所有分段和相加得到最终的sup.function返回值。这种方式会将原本超长的单行表达式拆分为多条独立的短表达式,完全避开单条字符串长度限制。如果调整步长为15后仍有报错,可继续调小步长,直到单条表达式长度低于阈值即可。
示例代码:seg_sums = [] current_seg = 0 step = 15 # 可根据单条表达式长度调整步长 cnt = 0 for i in fourier_x: for j in fourier_y: # 替换np.cos为GEKKO内置的m.cos,替换np.dot为直接展开,缩短表达式 current_seg += u_fourier_i_j * m.cos(g_i_j[0]*x + g_i_j[1]*y) cnt += 1 if cnt % step == 0: seg_sums.append(m.Intermediate(current_seg)) current_seg = 0 # 处理剩余不足步长的项 if current_seg != 0: seg_sums.append(m.Intermediate(current_seg)) # 最终的sup函数返回值 dummy = m.Intermediate(sum(seg_sums)) - 替换Numpy运算为GEKKO内置运算
原代码中使用的np.cos、np.dot会生成额外的符号嵌套,既不符合GEKKO的符号运算规则,也会不必要地增加表达式长度。替换为GEKKO内置的运算符和函数后,可有效缩短单条表达式的字符数。 - 避免嵌套多层运算
如果后续还有其他叠加项,也都采用中间变量拆分的方式处理,不要将多层运算嵌套在同一个等式内。
内容的提问来源于stack exchange,提问作者Abbel
相关产品推荐
相关产品推荐

