TyOptimization包中fmincon函数的bug及解决方案
产品缺陷
发布于 2024-11-09 11:57:37
查看 30过去596天
TyOptimization包中fmincon函数的bug及解决方案
问题描述
在使用TyOptimization包的fmincon函数时,当同时存在线性等式约束(Aeq, beq)和非线性约束(nonlincon)时,会出现以下错误:
ERROR: ArgumentError: number of rows of each array must match (got (1, 3))
Stacktrace:
[1] _typed_hcat(#unused#::Type{Float64}, A::Tuple{Matrix{Float64}, Matrix{Float64}})
@ Base .\abstractarray.jl:1654
[2] typed_hcat
@ .\abstractarray.jl:1641 [inlined]
[3] hcat
@ .\array.jl:1956 [inlined]
问题复现
以下代码会触发上述错误:
using TyOptimization
fun = (x) -> exp(x[1] + 2 * x[2]^2 + 4 * x[1] * x[2] + 2 * x[2] + 1)
x0 = [-1, 1]
A = []
b = []
Aeq = [1 1]
beq = [0]
lb = []
ub = []
nonlincon = x -> begin
C = [
1.5 + x[1] * x[2] - x[1] - x[2],
-x[1] * x[2] - 10
]
Ceq = []
return C, Ceq
end
xopt, fval = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlincon)
解决方案
经过测试,有以下几种解决方案:
- 移除线性等式约束 (将
Aeq和beq设为空数组) - 使用SQP算法 (通过
options = optimoptions(:fmincon, Algorithm="sqp")指定算法) - 移除非线性约束 (不使用
nonlincon)
方案1: 移除线性等式约束
Aeq = []
beq = []
方案2: 使用SQP算法
options = optimoptions(:fmincon, Algorithm="sqp")
xopt, fval = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlincon, options)
方案3: 移除非线性约束
xopt, fval = fmincon(fun, x0, A, b, Aeq, beq, lb, ub)
结论
这个bug似乎是由于TyOptimization包在处理同时存在的线性等式约束和非线性约束时出现了接口错误。建议在使用fmincon函数时,如果遇到类似错误,可以尝试上述解决方案。也期待官方尽快修复,为我国科技、工业发展打下坚实基础。
相关附件附上,敬请官方维护。
所属专栏:Syslab基础平台
产品信息:Syslab科学计算环境
系统信息:Win10或11