GEKKO函数拟合中Intermediate变量定义错误排查求助
GEKKO Intermediate变量定义错误排查
问题现象
使用GEKKO进行多子函数拟合时,通过Intermediate变量简化代码却触发以下错误:
@error: Intermediate Definition
Error: Intermediate variable with no equality (=) expression
30.124819430.1605366830.1963387730.2322259530.2681985430.30425683
STOPPING...
错误输出的数值数组是因为代码中使用了非GEKKO兼容的函数,导致生成纯数值表达式,GEKKO无法将其解析为合法的Intermediate变量定义。
错误原因与修复方案
1. 替换NumPy/标准库函数为GEKKO内置函数
GEKKO需要解析符号表达式而非直接计算数值。代码中np.sqrt()、math.pi这类函数会直接生成数值数组,导致GEKKO无法识别为合法的等式定义:
- 错误写法:
k_alfa = m.Intermediate(A1*np.sqrt(x)) - 正确写法:
k_alfa = m.Intermediate(A1*m.sqrt(x)) - 错误写法:
2*math.pi*gj/k_alfa - 正确写法:
2*m.pi*gj/k_alfa
2. 补全未定义的变量
代码中ac和n两个变量未定义,导致Intermediate/Equation表达式不完整:
- 需提前定义
ac为GEKKO的Const或Param(根据实际需求):ac = m.Const(ac_value) - 需定义
n为Const或Param:n = m.Const(n_value)
3. 简化冗余的Intermediate定义
phi = m.Intermediate(ro)属于无意义的直接赋值,可直接用ro替代phi,减少解析负担。
修正后的核心代码片段
#Intermediates(修正后) k_alfa = m.Intermediate(A1*m.sqrt(x)) # 替换np.sqrt为m.sqrt ac = m.Const(ac_value) # 补全未定义的ac ro = m.Intermediate(k_alfa*ac) G_0 = m.Intermediate(G1_0+G2_0+Gg_0) G_1 = m.Intermediate(G1_1+G2_1+Gg_1) G_2 = m.Intermediate(G1_2+G2_2+Gg_2) d0 = m.Intermediate((El_0-x)**2+(G_0/2)**2) d1 = m.Intermediate((El_1-x)**2+(G_1/2)**2) d2 = m.Intermediate((El_2-x)**2+(G_2/2)**2) # 直接用ro替代phi,删除冗余定义 f0=m.Intermediate((1-(1-(G_0*G1_0/(2*d0)))*m.cos(2*ro)-((El_0-x)*G1_0/d0)*m.sin(2*ro))) f1=m.Intermediate((1-(1-(G_1*G1_1/(2*d1)))*m.cos(2*ro)-((El_1-x)*G1_1/d1)*m.sin(2*ro))) f2=m.Intermediate((1-(1-(G_2*G1_2/(2*d2)))*m.cos(2*ro)-((El_2-x)*G1_2/d2)*m.sin(2*ro))) n = m.Const(n_value) # 补全未定义的n sigma_sum = m.Intermediate(2*m.pi*gj/k_alfa * (f0+f1+f2)) # 替换math.pi为m.pi # designing an equation for the model y = m.Var() m.Equation(y == m.exp(-n*sigma_sum))
内容的提问来源于stack exchange,提问作者twistfire
相关产品推荐
相关产品推荐

