GEKKO数组变量与中间变量建模报错排查及APM文件位置咨询
GEKKO参数拟合报错排查与APM文件位置问题
问题描述
尝试使用GEKKO进行拟合与函数参数估计,因待拟合参数数量可变,采用了数组形式的变量和中间变量,建模时出现错误,报错信息如下:
apm some_ip_here_gk_model14 <br><pre> ---------------------------------------------------------------- APMonitor, Version 1.0.1 APMonitor Optimization Suite ---------------------------------------------------------------- --------- APM Model Size ------------ Each time step contains Objects : 0 Constants : 2 Variables : 15 Intermediates: 22 Connections : 0 Equations : 24 Residuals : 2 @error: Model Expression *** Error in syntax of function string: Invalid element: none Position: 1 none ?
同时在Jupyter Notebook所在文件夹未找到APM文件,需排查报错原因并确定APM文件位置。
相关代码:
import numpy as np from gekko import GEKKO import math M = 10; m = 1; gj =1; n = 1 num_pulses_in_window = 4 сonstant = 1; ac = 1 el_init_guess = [1,2,3,4] borders_left = [1,2,3,4] borders_right = [1,2,3,4] A1_c = (M/(M+m))*сonstant gj_c = gj # using GEKKO for preliminary estomation xData = np.array([1,2,3,4]) yData = np.array([2.5,1.2,3.2,1.1]) model = GEKKO() # parameters x = model.Param(value = xData) z = model.Param(value = yData) # constants A1 = model.Const(A1_c) gj = model.Const(gj_c) # variables E = model.Array(model.Var, num_pulses_in_window) G1 = model.Array(model.Var, num_pulses_in_window) G2 = model.Array(model.Var, num_pulses_in_window) Gg = model.Array(model.Var, num_pulses_in_window) #Intermediates k_alfa = model.Intermediate(A1*model.sqrt(x)) ro = model.Intermediate(k_alfa*ac) phi = model.Intermediate(ro) G = model.Array(model.Intermediate, num_pulses_in_window, equation=None) d = model.Array(model.Intermediate, num_pulses_in_window, equation=None) f = model.Array(model.Intermediate, num_pulses_in_window, equation=None) for i in range(0, num_pulses_in_window): E[i].value = el_init_guess[i] E[i].lower = borders_left[i] E[i].upper = borders_right[i] #G1 G1[i].lower = 0.0000001 G1[i].upper = 1 #G2 G2[i].lower = 0 G2[i].upper = 0 #Gg Gg[i].lower = 0.0000001 Gg[i].upper = 1 G[i] = model.Intermediate(G1[i]+G2[i]+Gg[i]) d[i] = model.Intermediate((E[i]-x)**2+(G[i]/2)**2) f[i] = model.Intermediate((1-(1-(G[i]*G1[i]/(2*d[i])))*model.cos(2*phi)-((E[i]-x)*G[i]/d[i])*model.sin(2*phi))) sigma_sum = model.Intermediate(2*math.pi*gj/k_alfa * (model.sum(f))) y = model.Var() model.Equation(y == model.exp(-n*sigma_sum)) model.Minimize(((y-z))**2) model.options.IMODE = 2 model.options.SOLVER = 3 model.options.MAX_ITER = 1000 model.solve(disp=1)
问题排查与解决方案
一、报错原因排查
无效的中间变量数组初始化
创建中间变量数组时使用了equation=None的方式:G = model.Array(model.Intermediate, num_pulses_in_window, equation=None) d = model.Array(model.Intermediate, num_pulses_in_window, equation=None) f = model.Array(model.Intermediate, num_pulses_in_window, equation=None)GEKKO不支持这种预创建空Intermediate数组再赋值的操作,会生成无有效表达式的空中间变量,导致模型解析时出现
none元素报错。正确做法是在循环中逐个创建中间变量并添加到列表:G = [] d = [] f = [] for i in range(num_pulses_in_window): # ... 变量边界设置代码 G_i = model.Intermediate(G1[i]+G2[i]+Gg[i]) G.append(G_i) d_i = model.Intermediate((E[i]-x)**2+(G_i/2)**2) d.append(d_i) f_i = model.Intermediate((1-(1-(G_i*G1[i]/(2*d_i)))*model.cos(2*phi)-((E[i]-x)*G_i/d_i)*model.sin(2*phi))) f.append(f_i)维度不匹配风险
x是长度为4的Param数组,E[i]是单个Var变量,E[i]-x会生成长度为4的数组;phi同样是长度为4的数组,后续f[i]的计算中,单个Var与数组运算会产生维度不匹配问题,这也是可能引发解析错误的原因,需核对模型逻辑是否需针对每个数据点单独计算,或调整维度使运算匹配。函数混用问题
计算sigma_sum时使用了Python标准库的math.pi,虽为常数,但建议统一使用GEKKO内置常数model.pi,避免潜在的类型兼容问题:sigma_sum = model.Intermediate(2*model.pi*gj/k_alfa * (model.sum(f)))
二、APM文件位置查找
Jupyter环境中,GEKKO默认将APM文件存储在临时目录,可通过model.path属性获取具体路径:
print(model.path)
执行后会输出模型文件所在的临时文件夹路径,里面包含生成的APM相关文件。
内容的提问来源于stack exchange,提问作者twistfire
相关产品推荐
相关产品推荐

