MATLAB中fmincon的故障

MATLAB中fmincon的故障,matlab,matrix,linear-algebra,Matlab,Matrix,Linear Algebra,我试图在MATLAB中使用fmincon,但不太确定到底是什么问题。我的职能是: function f = myfun(x4) f = (C * x4 - d) .^ 2; end 我这样称呼它: lb = zeros(3, 1); x0 = [10; 10; 10]; [x4, fvalx4, exitflagx4, outputx4, lambdax4] = fmincon(@myfun,x0,[],[],[],[],lb,[]); 但当我运行它时,我得到了 ???使用==>mtim

我试图在MATLAB中使用fmincon,但不太确定到底是什么问题。我的职能是:

function f = myfun(x4)

f = (C * x4 - d) .^ 2;

end
我这样称呼它:

lb = zeros(3, 1);
x0 = [10; 10; 10];
[x4, fvalx4, exitflagx4, outputx4, lambdax4] = fmincon(@myfun,x0,[],[],[],[],lb,[]);
但当我运行它时,我得到了

???使用==>mtimes时出错 内部矩阵尺寸必须一致

然而,我检查了,C是112x3,d是112x1,x4根本没有初始化,因为这就是我试图解决的问题。如果我创建一个“虚拟”x4,我可以运行 (C*x4-d)。^2 没问题


有什么想法吗?我意识到这与使用lsqr或更确切地说是Lb0的lsqlin相同,这也相当于lsqnonneg,但这就是重点:我试图以不同的方式验证这些方法的结果

传递给
fmincon
的函数。在函数中,它返回一个112乘1的向量。也许你需要改变

f = (C * x4 - d) .^ 2;


这里有几个问题

首先,您需要学习如何传入那些未优化的参数。函数myfun不能看到C和d,因为函数有自己的工作空间,除非它们是嵌套函数

接下来,由于要计算受约束的线性最小二乘,因此需要返回平方和。fmincon需要一个标量目标。它不知道返回向量时该做什么

就个人而言,我甚至不会费心定义一个显式的m文件。使用函数句柄定义它。因此,也许您可以尝试以下目标:

myfun = @(x4) norm(C*x4 - d);
lb = zeros(3, 1);
x0 = [10; 10; 10];
[x4, fvalx4, exitflagx4, outputx4, lambdax4] = fmincon(myfun,x0,[],[],[],[],lb,[]);
函数句柄可以看到C和d的值,因此一旦创建了句柄,这些变量就会被带到函数句柄工作区中

注意,我用范数来计算平方和,实际上,这里是平方和的平方比。但当平方和最小化时,该数字的sqrt也会最小化。与诺姆相比,它看起来有点干净

另一种选择是使用myfun的一个版本,该版本显式地传递C和d的值。这里我给出了myfun参数,然后围绕myfun创建了一个函数句柄包装器。你也可以用myfun的m文件版本来实现这一点

myfun = @(x4,C,d) norm(C*x4 - d);
lb = zeros(3, 1);
x0 = [10; 10; 10];
[x4, fvalx4, exitflagx4, outputx4, lambdax4] = fmincon(@(x4) myfun(x4,C,d),x0,[],[],[],[],lb,[]);

非常感谢。成功了。一开始我忘了发帖子说我确实声明了C、d和x4是全局的,所以传递不应该是问题,但我喜欢尽可能避免更多的m文件,而且你的方式更加优雅——而且有效!你怎么能选择一个能解决你问题的答案,而没有人会投反对票呢!?我受不了。我会的,回答得好,伙计。
myfun = @(x4,C,d) norm(C*x4 - d);
lb = zeros(3, 1);
x0 = [10; 10; 10];
[x4, fvalx4, exitflagx4, outputx4, lambdax4] = fmincon(@(x4) myfun(x4,C,d),x0,[],[],[],[],lb,[]);