Matlab 使用fmincon时出错,hack修复了它,但I';我对此感到不安

Matlab 使用fmincon时出错,hack修复了它,但I';我对此感到不安,matlab,mathematical-optimization,nonlinear-optimization,Matlab,Mathematical Optimization,Nonlinear Optimization,我在使用fmincon时出现了一个奇怪的错误。关于目标函数和非线性约束函数的细节很多,所以如果可能的话,我将尝试问这个问题,而不描述它们 最小化需要单个输入。对于一些但不是所有的输入,我得到以下错误: Subscript indices must either be real positive integers or logicals. Error in qpsub>eqnsolv (line 888) ACTSET = A(ACTIND,:); Error in qpsub

我在使用fmincon时出现了一个奇怪的错误。关于目标函数和非线性约束函数的细节很多,所以如果可能的话,我将尝试问这个问题,而不描述它们

最小化需要单个输入。对于一些但不是所有的输入,我得到以下错误:

Subscript indices must either be real positive integers or logicals.

Error in qpsub>eqnsolv (line 888)
    ACTSET = A(ACTIND,:);

Error in qpsub (line 157)
[Q,R,A,B,X,Z,how,ACTSET,ACTIND,ACTCNT,aix,eqix,neqcstr,ncstr, ...

Error in nlconst (line 619)
    [SD,lambda,exitflagqp,outputqp,howqp,ACTIND] ...

Error in fmincon (line 794)
[X,FVAL,LAMBDA,EXITFLAG,OUTPUT,GRAD,HESSIAN]=...

Error in PauliApproximate2.unitalChannelApproximate (line 170)
        [pc, distance] = fmincon(@objective,x0, A, b, Aeq, beq,lb,ub, @constraint,
        options);
当我检查ACTIND的值时,当它等于[0]时抛出错误,因此出现索引错误。类似于OP of使用的hack,在行之前(在qpsub中)

我把if声明:

    if max(ACTIND) < 1
        ACTIND = [1];
    end
如果最大值(ACTIND)<1
ACTIND=[1];
终止

从初步测试来看,这似乎“解决”了问题。它为用于抛出错误的输入提供了合理的结果(因为它返回了一个良好的最小值,并且约束满足在公差范围内),并且返回了与没有错误的输入相同的结果(显然,因为不会调用if语句)。所以我的问题是,对于了解这些函数内部工作原理的人来说,这有多糟糕?我是否回避了一个可怕的问题,这个问题导致ACTIND是[0],而我不应该是这样?

ACTIND是如何定义的?我需要看更多的代码,然后才能给你任何具体的建议。通常,您不希望为不可接受的值设置平台,而是应该创建某种类型的误差梯度
    if max(ACTIND) < 1
        ACTIND = [1];
    end