You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Julia调用QPDAS的QuadraticProgram报无匹配方法错误

QPDAS 调用 QuadraticProgram 触发 MethodError 修复方案

核心错误原因

报错信息已经明确给出关键提示:QuadraticProgram 构造函数不支持 z、P 这两个关键字参数,你的代码存在两个核心问题:

  1. 参数顺序和传参方式完全错误
    你错误将约束参数放在了参数列表最前方,且把目标函数必需的两个核心参数当成了关键字传入。QPDAS 中接受 semidefinite/ϵ 等关键字的6参数构造函数,位置参数严格按照「目标函数参数在前,约束/边界参数在后」排列,其中二次项矩阵P、线性项向量q是前两个必填位置参数,不支持作为关键字传入。
  2. 等式约束右端向量维度不匹配
    你将等式约束矩阵A处理为1行length(points)列的矩阵,但对应生成的右端向量b长度为length(points),和约束矩阵维度不匹配,就算参数顺序正确后续也会触发维度错误。

正确参数顺序

6位置参数版本的QuadraticProgram参数顺序为:

  • 第1位(矩阵类型):目标函数二次项矩阵P,对应你代码中constructMatrix(points)生成的M
  • 第2位(向量类型):目标函数线性项向量q,对应你代码中命名为z的全1向量
  • 第3位(矩阵类型):等式约束矩阵Aeq,对应你代码中定义的A
  • 第4位(向量类型):等式约束右端向量beq,需匹配Aeq的行数,你的场景下应为长度1的0向量
  • 第5位(向量/矩阵类型):不等式约束或变量下界,你的场景下是x≥0约束,直接传长度为变量数的0向量作为下界即可,无需手动构造-I对角矩阵
  • 第6位(任意类型):变量上界或其他约束参数,你的场景下无统一上界可传fill(Inf, n)

修正后的可运行代码

function getSolution(points)    # array of tuples with a tuple and an Int64
    n = length(points)
    # 目标函数参数
    P = constructMatrix(points)
    q = ones(n)
    # 等式约束:sum(points[i][2] * x[i]) = 0
    Aeq = reshape([points[i][2] for i=1:n], 1, n)
    beq = [0.0]
    # 变量非负约束 x ≥ 0,无统一上界
    lb = zeros(n)
    ub = fill(Inf, n)

    qp = QuadraticProgram(P, q, Aeq, beq, lb, ub;
            semidefinite = true, ϵ = sqrt(eps(Float64)), smartstart = true, scaling = true)

    sol, val = solve!(qp)
    return sol
end

补充说明

报错中出现的::UniformScaling{Bool}类型参数,是因为你传参时误将LinearAlgebra包的单位矩阵I作为位置参数传入了,修正参数顺序、移除z/P的关键字传参写法后该问题会自动消失。
如果你需要传入非边界形式的一般线性不等式Cx ≤ d,需要调用QPDAS对应多参数构造函数,不要直接传入6参数版本。

内容的提问来源于stack exchange,提问作者mushrooms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 15:51:19